![]() |
![]() |
|
Массовая запись | ☑ | ||
---|---|---|---|---|
0
Хрустальчик
05.07.25
✎
12:20
|
Здравствуйте, уже задавал вопрос, но как сделать массовую запись в независимый периодический регистр сведений
Сейчас делаю подобным образом, но запись падает. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗаказПоставщикуТовары.Ссылка КАК Ссылка |ИЗ | Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары |ГДЕ | ЗаказПоставщикуТовары.Ссылка.Дата > &Дата"; Запрос.УстановитьПараметр("Дата", '20201203235113'); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл запрос2 = новый запрос; запрос2.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ЗаказПоставщикуТовары.Номенклатура КАК Номенклатура, | ЗаказПоставщикуТовары.Упаковка КАК Упаковка, | ЗаказПоставщикуТовары.Ссылка.Валюта КАК Валюта, | ЗаказПоставщикуТовары.ВидЦеныПоставщика КАК ВидЦеныПоставщика, | ЗаказПоставщикуТовары.Сумма КАК Сумма, | ЗаказПоставщикуТовары.Количество КАК Количество, | ЗаказПоставщикуТовары.Цена КАК Цена, | ЗаказПоставщикуТовары.Ссылка.Дата КАК Дата, | ЗаказПоставщикуТовары.Ссылка.Партнер КАК Партнер, | ЗаказПоставщикуТовары.Ссылка КАК Ссылка |ИЗ | Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары |ГДЕ | ЗаказПоставщикуТовары.Ссылка = &Ссылка"; Запрос2.УстановитьПараметр("Ссылка", ВыборкаДетальныеЗаписи.Ссылка); РезультатЗапроса2 = Запрос2.Выполнить(); ВыборкаДетальныеЗаписи2 = РезультатЗапроса2.Выбрать(); Пока ВыборкаДетальныеЗаписи2.Следующий() Цикл Если не ЗначениеЗаполнено(ВыборкаДетальныеЗаписи2.Ссылка) Тогда Возврат; КонецЕсли; НаборЗаписей = РегистрыСведений.ЮТ_ЦеныНоменклатурыПоставщиковСПоставщиком.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистр.Установить(ВыборкаДетальныеЗаписи2.Ссылка); НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Период = ВыборкаДетальныеЗаписи2.Дата; Если ЗначениеЗаполнено(ВыборкаДетальныеЗаписи2.ВидЦеныПоставщика) Тогда НоваяЗапись.ВидЦены = ВыборкаДетальныеЗаписи2.ВидЦеныПоставщика Иначе НоваяЗапись.ВидЦены = Справочники.ВидыЦенПоставщиков.НайтиПоНаименованию("Закупочная"); КонецЕсли; НоваяЗапись.Партнер = ВыборкаДетальныеЗаписи2.Партнер; НоваяЗапись.Номенклатура = ВыборкаДетальныеЗаписи2.Номенклатура; НоваяЗапись.Цена = ВыборкаДетальныеЗаписи2.Сумма/ВыборкаДетальныеЗаписи2.Количество; НоваяЗапись.Упаковка = ВыборкаДетальныеЗаписи2.Упаковка; НоваяЗапись.Валюта = ВыборкаДетальныеЗаписи2.Валюта; НоваяЗапись.Регистр = ВыборкаДетальныеЗаписи2.Ссылка; НаборЗаписей.Записать(); |
|||
2
Волшебник
05.07.25
✎
12:25
|
Мне кажется, это какая-то безумная кодогенерация
НаборЗаписей.Отбор.Регистр.Установить(ВыборкаДетальныеЗаписи2.Ссылка); |
|||
3
Хрустальчик
05.07.25
✎
12:27
|
(2) Факт, а что лучше посоветуете?
|
|||
4
Волшебник
05.07.25
✎
12:28
|
(3) Посоветую перестать морочить нам голову
|
|||
5
Мультук
гуру
05.07.25
✎
13:09
|
(0)
>>Сейчас делаю подобным образом, но запись падает. Сильно падает? С какого этажа? Раздается дзинь или бух ? ИЛИ Всё же появляется какое-то сообщение об ошибке ? |
|||
6
Хрустальчик
05.07.25
✎
13:11
|
Пишет, что память кончается
|
|||
7
Хрустальчик
05.07.25
✎
13:11
|
В другой базе соединение с сервером потерялось
|
|||
8
Волшебник
05.07.25
✎
13:25
|
У Вас в первом запросе ссылки на документ, а сам запрос к табличной части. Зацените, сколько раз крутится верхний цикл
|
|||
9
Kongo2019
05.07.25
✎
21:32
|
(0) Запрос в цикле, за это здесь обычно бьют.
|
|||
10
timurhv
05.07.25
✎
22:23
|
(9) Ну а что делать, не выбирать же 200 миллионов записей 1 раз запросом) Так памяти не хватит
|
|||
11
Kongo2019
05.07.25
✎
22:32
|
(10) А сейчас типа хватает? Судя по (6) , нифига.
|
|||
12
timurhv
06.07.25
✎
13:01
|
(11) там они и не записываются
Ошибка 1 (тут только документ): НаборЗаписей = РегистрыСведений.ЮТ_ЦеныНоменклатурыПоставщиковСПоставщиком.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистр.Установить(ВыборкаДетальныеЗаписи2.Ссылка); НоваяЗапись = НаборЗаписей.Добавить(); Ошибка 2 (какая-то ненужная проверка): Если не ЗначениеЗаполнено(ВыборкаДетальныеЗаписи2.Ссылка) Тогда Возврат; КонецЕсли; Ошибка 3 (вынести в переменную в начале кода): НоваяЗапись.ВидЦены = Справочники.ВидыЦенПоставщиков.НайтиПоНаименованию("Закупочная"); Ошибка 4 (нет проверки деления на 0): НоваяЗапись.Цена = ВыборкаДетальныеЗаписи2.Сумма/ВыборкаДетальныеЗаписи2.Количество; Ошибка 5 и 6 (тут должны выбираться документы, а не записи ТЧ + нет проверки на проведение документа): Запрос.Текст = "ВЫБРАТЬ | ЗаказПоставщикуТовары.Ссылка КАК Ссылка |ИЗ | Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары |ГДЕ | ЗаказПоставщикуТовары.Ссылка.Дата > &Дата"; Запрос.УстановитьПараметр("Дата", '20201203235113'); Если имеем 1млн документов с 200млн строк в ТЧ документов, то будет выполняться: 1. 200млн раз запрос к ТЧ документов (вместо 1 млн раз); 2. 200млн*200млн раз запись в регистр сведений, притом запишется хрен пойми что, а не то что нужно 3. Если не заполнен вид цен, то будет выполняться его поиск также 200млн*200млн раз по наименованию; По-идее дб 1 млн вызовов СоздатьНаборЗаписей, но с автора достаточно будет и 200млн, большего не ждем. |
|||
13
Прохожий
06.07.25
✎
15:38
|
не понятно какая периодичность. Если день, то можно по каждому дню один набор делать и записывать если не устанавливать отбор...
|
|||
14
Прохожий
06.07.25
✎
17:33
|
тогда миллион не нужен, пусть надо обработать документы за за пару тройку лет. Тогда тыща наборов записей. Кто меньше?
"Я сыграю правильную мелодию с ... нотами" |
|||
15
Волшебник
06.07.25
✎
19:04
|
(13) Вы тоже бот?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |