|
Кто как записи в регистрах редактирует? | ☑ | ||
---|---|---|---|---|
0
AndrewM
02.07.12
✎
08:18
|
Бывает, надо найти запись регистра для редактирования. Запрос же может только чтение производить (или не только?).
А метод Выбрать() может отобрать записи только по одному реквизиту регистра. Вот и получается, что если возникает такая необходимость, я делаю так: Отбор = Новый Структура("Объект", мОбъект.Ссылка); Выборка = РегистрыСведений.ЗначенияСвойствОбъектов.Выбрать(Отбор); Пока Выборка.Следующий() Цикл Если Выборка.Свойство.Наименование = "Свойство N" Тогда МенеджерЗаписи = Выборка.ПолучитьМенеджерЗаписи(); МенеджерЗаписи.Значение = РеквизитN; КонецЕсли; МенеджерЗаписи.Записать(Истина); КонецЦикла; Возник вопрос: а как такую задачу более оптимально решают другие (получить запись регистра для редактирования)? |
|||
1
butterbean
02.07.12
✎
08:19
|
я только через набор записей
|
|||
2
Fragster
гуру
02.07.12
✎
08:21
|
да уж
|
|||
3
Fragster
гуру
02.07.12
✎
08:22
|
зачем выбирать все свойства?
|
|||
4
AndrewM
02.07.12
✎
16:23
|
(3) Не понял вопроса. Конечная цель: получить запись регистра (одну запись) для редактирования. Делаю я это путём, описанным выше.
Я же выбираю там не все свойства, а все свойства конкретного объекта, т.к. поиск в Выбрать() возможен только по одному реквизиту. |
|||
5
YHVVH
02.07.12
✎
16:27
|
(3) записывать зачем несколько раз я бы даже сказал
|
|||
6
AaNnDdRrEeYy
02.07.12
✎
16:31
|
Подобный вопрос, как можно отредактировать большое количество записей с разным отбором за один заход, не записывая каждую запись в цикле?
|
|||
7
Kolls
02.07.12
✎
16:33
|
Прочитать набор записей, поменять что надо, потом записать
|
|||
8
Лефмихалыч
02.07.12
✎
16:33
|
Использование объекта РегистрСведенийМенеджерЗаписи
-------------------------------------------------------------------------------- Чтение записи(набора записей) из регистра сведений без последующей модификации необходимо выполнять запросом. Во всех остальных случаях объект РегистрСведенийМенеджерЗаписи следует применять только тогда, когда выполнение операций с регистром сведений требует использования отбора одновременно по всем измерениям. При этом менеджер записи использует для выполнения записи два набора записей, устанавливая им соответствующие значения отборов. Поэтому обработчики событий набора записей вызываются и тогда, когда для записи данных используется менеджер записи. В остальных случаях следует использовать объект РегистрСведенийНаборЗаписей. С точки зрения производительности использование менеджера записей в некоторых случаях будет столь же эффективным, как и использование набора записей, а в некоторых - менее, так как будут выполняться лишние действия. Правильно:
(c) Система стандартов и методик |
|||
9
AaNnDdRrEeYy
02.07.12
✎
16:33
|
Пока Выборка.Следующий() Цикл
НаборЗаписей = РегистрыСведений.Регистр1.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Измерение1.Установить(Выборка.Ссылка); НаборЗаписей.Прочитать(); Для Каждого Запись из НаборЗаписей Цикл Запись.Ресурс1= Выборка.Поле1; КонецЦикла; НаборЗаписей.Записать(); КонецЦикла; сейчас так. но это очень медленно |
|||
10
AaNnDdRrEeYy
02.07.12
✎
16:35
|
(7) так как в (9) ? это очень медленно, если надо перезаписать больще 100 000 записей
|
|||
11
Fish
02.07.12
✎
16:44
|
(9) Неудивительно, что очень медленно. Руки за такой код надо отрывать.
|
|||
12
Serg_1960
02.07.12
✎
16:44
|
(0) Ммм... вообще-то алгоритм, мягко говоря, индусский. Сорри :) Через две точки обращение; инициализация менеджера записи - в условии, а записать() - вне условия... А если Выборка.Свойство.Наименование <> "Свойство N", тогда и записывать не надо, да и менеджер какой строки? Предыдущей? :)
|
|||
13
AaNnDdRrEeYy
02.07.12
✎
16:49
|
(11) ну и как правильно?
надо перезаписать ресурс во всех записях где отбор для измерения берется из выборки, значение отбора всегда разное. остальные ресурсы (кроме ресурс1) и змерения трогать нельзя. |
|||
14
AndrewM
02.07.12
✎
17:01
|
Блин, вот прикопались. Ну промахнулся я. Согласен: Записать() хотел внутри условия поставить.
Вопрос-то в другом был. |
|||
15
hhhh
02.07.12
✎
17:02
|
(14) ну в (8) ответ.
|
|||
16
AndrewM
02.07.12
✎
17:02
|
(8) я же спрашивал, как найти уже существующую, а не как добавить новую.
|
|||
17
Fish
02.07.12
✎
17:03
|
(13) Правильно - это иногда читать умные книжки, и хотя бы приблизительно представлять, как работают механизмы, которые ты используешь.
|
|||
18
AndrewM
02.07.12
✎
17:03
|
+(16) Или он находит существующие? Что-то загнался я.
|
|||
19
AaNnDdRrEeYy
02.07.12
✎
22:02
|
(17) код пожалуйста... а так это просто пустые слова.
|
|||
20
hhhh
02.07.12
✎
22:27
|
(19) для слабовидящих - код в (8)
|
|||
21
AaNnDdRrEeYy
03.07.12
✎
08:51
|
в (8) запись одного набора с одним отбором. условие задачи в (13) там разные условия отбора.
|
|||
22
AaNnDdRrEeYy
03.07.12
✎
08:54
|
+(21) ладно, тролить не буду, по другому это сделать невозможно.
только так как в (9) |
|||
23
Fish
03.07.12
✎
08:56
|
(22) Создавать набор записей в цикле и записывать его в цикле неправильно. Не для этого он предназначен. Либо не используй набор записей, либо формируй ОДНУ таблицу с нужными данными, пихай её в набор записей и записывай ОДИН раз. А в (9) ИМХО типичный быдлокод.
|
|||
24
butterbean
03.07.12
✎
08:59
|
(23) а если в регистре 100500 записей, а тебе нужно только 10 изменить и все с разными отборами??
|
|||
25
AaNnDdRrEeYy
03.07.12
✎
09:04
|
(24) именно такая задача! в регистре больше миллиона записей изменять надо порядка 50 000
|
|||
26
Fish
03.07.12
✎
09:24
|
(24), (25) Вот поэтому иногда при программировании надо голову включать. Хотя каждый быдлокод имеет право на жизнь. Сразу скажу: код приводить не буду. Всё есть в книжках, надо просто иногда читать их. Прочтение СП тоже помогает. Но можно это реализовать так, что работать будет во много раз быстрее, чем в (9). Хотя для одноразовой операции и (9) вполне пойдёт. Но я бы так делать не стал.
|
|||
27
teapot123
03.07.12
✎
09:43
|
я так пишу
Набор = РегистрыСведений.ЗначенияПравПользователя.СоздатьНаборЗаписей(); Набор.Отбор.НаборПрав.Установить(ЗначениеНабораПрав); Набор.Прочитать(); Для Каждого Запись ИЗ Набор Цикл Запись.Значение = НужноеЗначение; КонецЦикла; Набор.Записать(); |
|||
28
Fragster
гуру
03.07.12
✎
10:14
|
получаем запросом нужные записи, через выборку обходим и записываем Запись с отбором и перезаписью
|
|||
29
AndrewM
03.07.12
✎
19:19
|
(28) - по-моему здесь имеется в виду тот самый метод из (9), породивший столько споров :).
(26) Что-то не пойму, Fish, ты хочешь сказать, что есть ещё один способ, о котором ты не расскажешь? Или, говоря, что "можно это реализовать так, что работать будет во много раз быстрее, чем в (9)", ты имеешь в виду как раз метод из (8)? Если ещё что-то другое, делись. :) |
|||
30
Fish
04.07.12
✎
10:00
|
(29) Так всё уже рассказали. Все методы, и как их использовать. Чего ещё рассказывать? А код за других писать я не люблю.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |