Имя: Пароль:
1C
1С v8
Добавить записи в регистр сведений программно.
0 User_Agronom
 
18.02.15
16:58
Вопрос глупый. Но, тем не менее ответа не знаю/не нашёл.

Есть непериодический, независимый Регистр сведений.
Одно измерение объект (ДокументСсылка) и пара ресурсов (строки)

Мне нужно одной операцией добавить в этот регистр несколько записей.

Вариант:
НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(ПолеВводаНоменклатура);
Для Каждого СтрокаТаблицы Из ТаблицаСвойств Цикл
  НоваяЗапись = НаборЗаписей.Добавить();
  НоваяЗапись.Объект = ПолеВводаНоменклатура;
  НоваяЗапись.Свойство = СтрокаТаблицы.Свойство;
  НоваяЗапись.Значение = СтрокаТаблицы.ЗначениеСвойства;
КонецЦикла;
НаборЗаписей.Записать();

не устраивает, так как нельзя установить отбор (у записей разные измерения).

Вариант:
МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = ПолеВводаНоменклатура;
МенеджерЗаписи.Свойство = ПолеВводаСвойствоНоменклатуры;
МенеджерЗаписи.Значение = ПолеВводаЗначениеСвойства;
МенеджерЗаписи.Записать();

не устраивает, так как пишет по одному.

Почему нужно оптом: есть регламентное задание, которое должно подцепить все документы. И вариант, когда часть запишется, а часть нет не годится.
1 ДенисЧ
 
18.02.15
17:00
Транзакции придумали трУсы!!
2 SeraFim
 
18.02.15
17:01
СоздатьНаборЗаписей()
Прочитать()
Добавить()
Добавить()
Добавить()
Записать()
3 User_Agronom
 
18.02.15
17:06
(1) Спасибо!)))
4 User_Agronom
 
18.02.15
17:35
(1) Не катит. Если выполнить запрос во время выполнения цикла, то инфа про первые строки в запрос попадает.

    НачатьТранзакцию();
    Для каждого СтрокаТаблицы из ТаблицаСвойств цикл
        НаборЗаписей = РегистрыСведений._СтатусыОбъектовОбменаWMS.СоздатьМенеджерЗаписи();
        НаборЗаписей.Объект=СтрокаТаблицы.Заказ;
        НаборЗаписей.Статус = СтрокаТаблицы.Статус;
        НаборЗаписей.НомерЗаказа = НомерЗаказа;
        Попытка
            НаборЗаписей.Записать();
        Исключение
            Сообщить("Не удалось записать по причине: "+ОписаниеОшибки());
            ОтменитьТранзакцию();
            возврат;
        КонецПопытки;
    КонецЦикла;
    ЗафиксироватьТранзакцию();

Чего я делаю не так?
5 User_Agronom
 
18.02.15
17:38
(2) Будет же весь регистр перезаписан. А там строк может быть много.
6 Timon1405
 
18.02.15
17:40
(5) нужно внимательно в (2) прочитать строчку Прочитать()
или почитать про прочитать. или прочитать где почитать про прочитать
7 ShoGUN
 
18.02.15
17:40
(5) Менеджер записи + транзакция - не предлагать?
8 ShoGUN
 
18.02.15
17:40
Наборы записей тут не очень подходят, т.к. пишут с отбором по измерениям.
9 happysan
 
18.02.15
17:42
(4)"Если выполнить запрос во время выполнения цикла, то инфа про первые строки в запрос попадает." - что ты имеешь в виду?
10 User_Agronom
 
18.02.15
17:45
(6) Если нет отбора будут прочитаны все записи регистра. А потом, при Записать() будут все перезаписаны. С точки зрения скорости не совсем правильно.
(7) Я пример привёл в (4)
(8) Запускаем отладчик. Ставим точку прерывания внутри цикла. Несколько раз проходим цикл. Например в таблице 10 записей, а мы цикл проходим 3 раза.
Запускаем ещё раз 1С предприятие. ваяем запрос к регистру. Эти три строчки в результате запроса видим.

Должно быть: либо видим все десять. Либо не одной.
11 Крошка Ру
 
18.02.15
17:50
(10) НаборЗаписей.Записать(Ложь) спасет отца русской демократии
12 Крошка Ру
 
18.02.15
17:50
+(11) без НаборЗаписей.Прочитать()
13 ShoGUN
 
18.02.15
17:51
(11) Ему надо по нескольким измерениям.
14 ShoGUN
 
18.02.15
17:52
(10) Имхо, тут только управляемые блокировки спасут.
15 ShoGUN
 
18.02.15
17:52
Хотя результат может отличаться от ожидаемого...
16 Крошка Ру
 
18.02.15
17:53
(13) И?
17 ShoGUN
 
18.02.15
17:54
(16) А, ты предлагаешь отбор не устанавливать? Тогда прокатит, наверное.
18 Крошка Ру
 
18.02.15
17:55
+(16) Регистр сведений, независимый, отборы ставить необязательно. Создаем, заполняем(хоть каждую запись по своему измерению) и записываем.
19 ShoGUN
 
18.02.15
17:56
+(17) Единственное что - надо тогда дубли перед записью проверять, т.к. иначе ошибка может вывалится.
20 D_E_S_131
 
18.02.15
17:58
(19) Какие дубли в регистре сведений могут быть?
21 D_E_S_131
 
18.02.15
17:59
(10) Что у тебя не получается в (4)? Зачем тебе записывать ЗаписьРегистра в Попытке?
22 Крошка Ру
 
18.02.15
18:00
(19) Ну это да, тут дополнительную проверку надо
(20) Обыкновенные. Когда совпадают все измерения.
23 ShoGUN
 
18.02.15
18:00
(20) В РС есть какие-то записи.
Делаешь свой набор, в котором ВНЕЗАПНО встречается запись, в которой тот же набор значений измерений, который уже есть в регистре.
Пишешь через НаборЗаписей.Записать(Ложь)

Имеешь ошибку.
24 D_E_S_131
 
18.02.15
18:03
(23) Зачем тогда ставить ЛОЖЬ? Кстати в (4) у него не установлен параметр Замещать = Ложь (т.е. он равен Истина)
25 ShoGUN
 
18.02.15
18:06
(24) Ему надо все записи записать одновременно. Либо сделать так, чтобы не было фантомного чтения.
26 ShoGUN
 
18.02.15
18:07
+(25) Точней, грязного чтения.
27 D_E_S_131
 
18.02.15
18:10
(26) И как параметр "Замещать" может помочь в этом деле? Только транзакция или управляемая блокировка (в зависимости от режима управления блокировкой данных).
28 User_Agronom
 
18.02.15
18:12
(11) Спасибо. Так нормально работает.
29 ShoGUN
 
18.02.15
18:12
(27) Набор записей пишется в SERIALIZABLE, если не ошибаюсь(поправь, если не так). А это как раз то, что (0) нужно.
30 D_E_S_131
 
18.02.15
18:16
(28) Если натыкается на уже имеющиеся записи с такими измерениями, то не останавливается с сообщением "Не удалось записать по причине:"?
(29) НаборЗаписей это всего лишь инструмент для удобства. По сути та же запись в транзакции нескольких ЗаписейРегистра.
31 ShoGUN
 
18.02.15
18:17
(30) >По сути та же запись в транзакции нескольких ЗаписейРегистра.
Спасибо, кэп. Вопрос в уровне изоляции этой транзакции.
32 D_E_S_131
 
18.02.15
18:20
(31) Хочешь сказать, что в режиме Управляемых блокировок, если я буду писать данные НаборомЗаписей и не установлю саму блокировку на записываемые данные, то я не получу возможность "грязного чтения" до окончания записи?
33 ShoGUN
 
18.02.15
18:21
(32) (10) Утверждает, что это так. Я не проверял.
34 ShoGUN
 
18.02.15
18:24
Опять же у (0) ни слова про блокировки, может у него на регистре блокировки в автоматическом режиме.
35 D_E_S_131
 
18.02.15
18:26
(33) Судя по примеру в (4) у него таки Управляемые блокировки. Но в (10) не утверждается "что это так", т.к. он останавливает в цикле при записи через МенеджерЗаписи. Если бы писал НаборомЗаписей, то у него и цикла никакого не было бы.

В любом случае, если в конфигурации УБ, то для защиты от "грязного чтения" нужно использовать установку УБ.
36 D_E_S_131
 
18.02.15
18:28
(34) Тогда пусть ставит транзакцию, считывает запросом имеющиеся данные с использованием "Для изменения" и уже потом пишет свои новые данные. Другого в 1С не придумано.
37 User_Agronom
 
18.02.15
18:28
(35) В свойствах конфы режим управления блокировкой данных - управляемый.
38 User_Agronom
 
18.02.15
18:29
На регистре режим управления блокировкой данных тоже управляемый.
39 ShoGUN
 
18.02.15
18:30
(35) >В любом случае, если в конфигурации УБ, то для защиты от "грязного чтения" нужно использовать установку УБ.
Ещё раз спасибо, кэп :)

Я неточно выразился. Но каким-то образом у него при (4) грязное чтение, а при записи набором - нет.
40 D_E_S_131
 
18.02.15
18:32
(39) "а при записи набором - нет" — я так и не понял где такое утверждается.
41 ShoGUN
 
18.02.15
18:32
(40) в (28)
42 ShoGUN
 
18.02.15
18:34
А, хотя я туплю. У него способ проверки извращённый.
43 D_E_S_131
 
18.02.15
18:35
(42) Вот и мне интересно как он это проверил. Так же интересно, что будет с "внезапно одинаковыми" записями при таком способе.
44 ShoGUN
 
18.02.15
18:36
(38) Используй принудительную блокировку в коде, иначе, при записи большого набора - всё равно получишь грязное чтение. А своим способом ты это не проверишь никак.
45 D_E_S_131
 
18.02.15
18:37
(44) И еще после этого "кэп" :)
46 D_E_S_131
 
18.02.15
18:37
И Я еще...
47 ShoGUN
 
18.02.15
18:38
(45) Меня (28) ввело в заблужение :)
48 ShoGUN
 
18.02.15
18:39
+(47) заблужДение.
49 ShoGUN
 
18.02.15
18:40
А (43) надо проверять чтением из регистра, увы.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший