Имя: Пароль:
1C
1С v8
Кто как записи в регистрах редактирует?
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) Так всё уже рассказали. Все методы, и как их использовать. Чего ещё рассказывать? А код за других писать я не люблю.