Как автоматически заполнить документ «Корректировка регистров» для загрузки цен поставщиков

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Торговля и дистрибуция
← На главную

В процессе работы с 1С:ERP или 1С:Управление торговлей часто возникает задача массовой загрузки данных, которые хранятся в регистрах сведений, подчиненных регистратору. Одной из таких задач является загрузка цен номенклатуры поставщиков из внешних файлов (например, Excel). Поскольку регистр ЦеныНоменклатурыПоставщиков не позволяет создавать записи напрямую (без документа-основания), разработчики часто прибегают к использованию универсального документа Корректировка регистров.

В этой статье мы подробно разберем, как программно заполнить этот документ, проанализируем альтернативные способы загрузки и выясним, какие технические нюансы необходимо учитывать при работе с большими объемами данных.

Метод 1: Программное создание документа «Корректировка регистров»

Документ КорректировкаРегистров является универсальным инструментом, который позволяет вносить записи практически в любой регистр системы. Однако его программное заполнение отличается от работы с обычными документами. Основная особенность заключается в том, что нам нужно не только заполнить движения, но и предварительно объявить список регистров, которые будут корректироваться, в специальной табличной части.

Рассмотрим пошагово процесс создания документа и заполнения регистра сведений ЦеныНоменклатурыПоставщиков:

  1. Создание объекта документа: Сначала мы создаем новый экземпляр документа и устанавливаем базовые реквизиты, такие как дата и организация (если требуется).
  2. Инициализация таблицы регистров: Это критически важный шаг. В документе есть табличная часть ТаблицаРегистров. В нее нужно добавить строку, где в поле Имя указывается полное имя регистра. Без этого система не инициализирует коллекцию движений для данного регистра.
  3. Заполнение набора записей: После записи документа мы получаем доступ к коллекции Движения. Каждая строка в этой коллекции должна быть заполнена измерениями и ресурсами регистра.
  4. Установка активности: Для записей регистра сведений, создаваемых через корректировку, необходимо явно устанавливать свойство Активность = Истина.

Проанализируем пример кода, реализующий эту логику:


// Создаем новый документ корректировки
НовыйДок = Документы.КорректировкаРегистров.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.Комментарий = "Автоматическая загрузка цен из файла";

// Обязательно добавляем регистр в таблицу регистров документа
НоваяСтрокаРегистра = НовыйДок.ТаблицаРегистров.Добавить();
НоваяСтрокаРегистра.Имя = "РегистрСведений.ЦеныНоменклатурыПоставщиков";

// Записываем документ, чтобы получить ссылку
НовыйДок.Записать();

// Обращаемся к набору записей через коллекцию Движения
НаборЦен = НовыйДок.Движения.ЦеныНоменклатурыПоставщиков;

// Предположим, у нас есть массив данных из Excel (ДанныеИзФайла)
Для Каждого СтрокаДанных Из ДанныеИзФайла Цикл
    НоваяЗапись = НаборЦен.Добавить();
    НоваяЗапись.Период = СтрокаДанных.ДатаЦены;
    НоваяЗапись.Регистратор = НовыйДок.Ссылка;
    НоваяЗапись.Активность = Истина;
    
    // Заполняем измерения регистра
    НоваяЗапись.НоменклатураПоставщика = СтрокаДанных.НоменклатураПоставщика;
    НоваяЗапись.ВидЦеныПоставщика = СтрокаДанных.ВидЦены;
    
    // Заполняем ресурсы
    НоваяЗапись.Цена = СтрокаДанных.Цена;
    НоваяЗапись.Валюта = СтрокаДанных.Валюта;
КонецЦикла;

// Записываем движения
НаборЦен.Записать();
НовыйДок.Записать();

Метод 2: Использование типового документа «Регистрация цен поставщика»

Несмотря на удобство Корректировки регистров, использование специализированного документа РегистрацияЦенПоставщика является более правильным с точки зрения методологии системы. Рассмотрим, почему это так и с какими трудностями можно столкнуться.

Преимущества типового документа:

Проблема сопоставления номенклатуры: Часто при загрузке через типовой документ возникает ситуация, когда колонки с «нашей» номенклатурой остаются пустыми. Это происходит из-за отсутствия связи в регистре НоменклатураКонтрагентов. В ERP цены поставщиков привязаны именно к объекту НоменклатураПоставщика.

Чтобы успешно использовать типовой документ программно, мы должны убедиться, что:

  1. Для каждой позиции в файле найден или создан элемент справочника НоменклатураПоставщика.
  2. В этом элементе корректно указана ссылка на нашу внутреннюю Номенклатуру.
  3. При заполнении табличной части документа Товары мы подставляем именно объект поставщика.

Оптимизация при больших объемах данных

Если нам необходимо загрузить более 10 000 — 14 000 позиций, выполнение этой операции в одной транзакции (в одном документе) может привести к серьезным проблемам: блокировкам таблиц базы данных и нехватке оперативной памяти.

Разберем рекомендации по оптимизации процесса:

1. Порционное создание документов: Не пытайтесь записать все 14 000 строк в один документ Корректировка регистров. Оптимально разделять данные на блоки по 500–1000 строк. Для каждого блока создавайте отдельный документ. Это позволит системе быстрее фиксировать транзакции.

2. Режим записи: При программном создании большого количества документов корректировки используйте метод Записать(РежимЗаписиДокумента.Запись). Поскольку этот документ не делает движений по бухгалтерскому учету в привычном понимании, проведение (которое запускает дополнительные проверки) часто избыточно при первичной загрузке.

3. Предварительное кеширование: Перед циклом загрузки выгрузите необходимые справочники (Номенклатура, Виды цен, Валюты) в соответствие (объект Соответствие) или в индексированную таблицу значений. Поиск ссылки по артикулу или наименованию внутри цикла — самая медленная операция. Выполните поиск один раз и обращайтесь к кешу.

Выясним причину ошибок при загрузке

Если вы решили использовать встроенную обработку «Загрузка данных из файла» и данные не попадают в регистр, проанализируйте следующие моменты:

Статус документа: Убедитесь, что созданные документы имеют статус «Проведен» (для регистрации цен) или у них установлена галочка активности движений (для корректировки).

Уникальность ключа записей: Регистр ЦеныНоменклатурыПоставщиков имеет набор измерений (НоменклатураПоставщика, ВидЦеныПоставщика и т.д.). Если в вашем файле Excel есть дублирующиеся строки с одинаковым набором измерений на одну и ту же дату, система запишет только последнюю из них, либо выдаст ошибку неуникальности записей.

Подводя итог, можно сказать: для разового переноса остатков цен из старой базы метод с Корректировкой регистров является самым быстрым и эффективным. Для регулярного обновления прайс-листов поставщиков лучше настроить сопоставление номенклатуры и использовать документ Регистрация цен поставщика.

← На главную