В процессе работы с 1С:ERP или 1С:Управление торговлей часто возникает задача массовой загрузки данных, которые хранятся в регистрах сведений, подчиненных регистратору. Одной из таких задач является загрузка цен номенклатуры поставщиков из внешних файлов (например, Excel). Поскольку регистр ЦеныНоменклатурыПоставщиков не позволяет создавать записи напрямую (без документа-основания), разработчики часто прибегают к использованию универсального документа Корректировка регистров.
В этой статье мы подробно разберем, как программно заполнить этот документ, проанализируем альтернативные способы загрузки и выясним, какие технические нюансы необходимо учитывать при работе с большими объемами данных.
Документ КорректировкаРегистров является универсальным инструментом, который позволяет вносить записи практически в любой регистр системы. Однако его программное заполнение отличается от работы с обычными документами. Основная особенность заключается в том, что нам нужно не только заполнить движения, но и предварительно объявить список регистров, которые будут корректироваться, в специальной табличной части.
Рассмотрим пошагово процесс создания документа и заполнения регистра сведений ЦеныНоменклатурыПоставщиков:
ТаблицаРегистров. В нее нужно добавить строку, где в поле Имя указывается полное имя регистра. Без этого система не инициализирует коллекцию движений для данного регистра.Движения. Каждая строка в этой коллекции должна быть заполнена измерениями и ресурсами регистра.Активность = Истина.Проанализируем пример кода, реализующий эту логику:
// Создаем новый документ корректировки
НовыйДок = Документы.КорректировкаРегистров.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.Комментарий = "Автоматическая загрузка цен из файла";
// Обязательно добавляем регистр в таблицу регистров документа
НоваяСтрокаРегистра = НовыйДок.ТаблицаРегистров.Добавить();
НоваяСтрокаРегистра.Имя = "РегистрСведений.ЦеныНоменклатурыПоставщиков";
// Записываем документ, чтобы получить ссылку
НовыйДок.Записать();
// Обращаемся к набору записей через коллекцию Движения
НаборЦен = НовыйДок.Движения.ЦеныНоменклатурыПоставщиков;
// Предположим, у нас есть массив данных из Excel (ДанныеИзФайла)
Для Каждого СтрокаДанных Из ДанныеИзФайла Цикл
НоваяЗапись = НаборЦен.Добавить();
НоваяЗапись.Период = СтрокаДанных.ДатаЦены;
НоваяЗапись.Регистратор = НовыйДок.Ссылка;
НоваяЗапись.Активность = Истина;
// Заполняем измерения регистра
НоваяЗапись.НоменклатураПоставщика = СтрокаДанных.НоменклатураПоставщика;
НоваяЗапись.ВидЦеныПоставщика = СтрокаДанных.ВидЦены;
// Заполняем ресурсы
НоваяЗапись.Цена = СтрокаДанных.Цена;
НоваяЗапись.Валюта = СтрокаДанных.Валюта;
КонецЦикла;
// Записываем движения
НаборЦен.Записать();
НовыйДок.Записать();
Несмотря на удобство Корректировки регистров, использование специализированного документа РегистрацияЦенПоставщика является более правильным с точки зрения методологии системы. Рассмотрим, почему это так и с какими трудностями можно столкнуться.
Преимущества типового документа:
Проблема сопоставления номенклатуры:
Часто при загрузке через типовой документ возникает ситуация, когда колонки с «нашей» номенклатурой остаются пустыми. Это происходит из-за отсутствия связи в регистре НоменклатураКонтрагентов. В ERP цены поставщиков привязаны именно к объекту НоменклатураПоставщика.
Чтобы успешно использовать типовой документ программно, мы должны убедиться, что:
НоменклатураПоставщика.Номенклатуру.Товары мы подставляем именно объект поставщика.Если нам необходимо загрузить более 10 000 — 14 000 позиций, выполнение этой операции в одной транзакции (в одном документе) может привести к серьезным проблемам: блокировкам таблиц базы данных и нехватке оперативной памяти.
Разберем рекомендации по оптимизации процесса:
1. Порционное создание документов:
Не пытайтесь записать все 14 000 строк в один документ Корректировка регистров. Оптимально разделять данные на блоки по 500–1000 строк. Для каждого блока создавайте отдельный документ. Это позволит системе быстрее фиксировать транзакции.
2. Режим записи:
При программном создании большого количества документов корректировки используйте метод Записать(РежимЗаписиДокумента.Запись). Поскольку этот документ не делает движений по бухгалтерскому учету в привычном понимании, проведение (которое запускает дополнительные проверки) часто избыточно при первичной загрузке.
3. Предварительное кеширование:
Перед циклом загрузки выгрузите необходимые справочники (Номенклатура, Виды цен, Валюты) в соответствие (объект Соответствие) или в индексированную таблицу значений. Поиск ссылки по артикулу или наименованию внутри цикла — самая медленная операция. Выполните поиск один раз и обращайтесь к кешу.
Если вы решили использовать встроенную обработку «Загрузка данных из файла» и данные не попадают в регистр, проанализируйте следующие моменты:
Статус документа: Убедитесь, что созданные документы имеют статус «Проведен» (для регистрации цен) или у них установлена галочка активности движений (для корректировки).
Уникальность ключа записей: Регистр ЦеныНоменклатурыПоставщиков имеет набор измерений (НоменклатураПоставщика, ВидЦеныПоставщика и т.д.). Если в вашем файле Excel есть дублирующиеся строки с одинаковым набором измерений на одну и ту же дату, система запишет только последнюю из них, либо выдаст ошибку неуникальности записей.
Подводя итог, можно сказать: для разового переноса остатков цен из старой базы метод с Корректировкой регистров является самым быстрым и эффективным. Для регулярного обновления прайс-листов поставщиков лучше настроить сопоставление номенклатуры и использовать документ Регистрация цен поставщика.