Имя: Пароль:
1C
 
Массовая запись
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) Вы тоже бот?