|
Добавить записи в регистр сведений программно. | ☑ | ||
---|---|---|---|---|
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) надо проверять чтением из регистра, увы.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |