Как программно получить основную спецификацию номенклатуры в документе 1С:ERP?

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

В процессе разработки автоматизированных решений на платформе 1С:ERP часто возникает необходимость заполнения табличных частей документов данными из регистра сведений ОсновныеСпецификации. Рассмотрим, как сделать это правильно, эффективно и с соблюдением архитектурных стандартов конфигурации. Для решения этой задачи в документе «Производство без заказа» пригодится обработка для автоматического заполнения по спецификации.

Почему не стоит выполнять запрос в цикле?

Одной из частых ошибок начинающих разработчиков является выполнение запроса к базе данных внутри цикла обхода строк табличной части. Это приводит к критическому падению производительности при больших объемах данных, так как на каждой итерации система обращается к серверу СУБД. Мы рассмотрим методы оптимизации, которые позволят выполнить эту задачу за один проход.

Решение 1: Использование типовых процедур конфигурации

В конфигурациях уровня ERP разработчики фирмы «1С» предоставляют развитый API для работы с производственными данными. Использование типовых механизмов — это «золотой стандарт», так как эти функции учитывают не только пару Номенклатура и Характеристика, но и подразделение, дату документа и другие бизнес-контексты.

Рекомендуется обратить внимание на модуль УправлениеДаннымиОбИзделиях или УправлениеПроизводством. Например, функцию:

УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(Номенклатура, Характеристика, Дата)

Использование подобных функций гарантирует корректность выбора спецификации в соответствии с логикой, заложенной в самой конфигурации.

Решение 2: Оптимизированный пакетный запрос с временными таблицами

Если по каким-то причинам использование типовых функций ограничено, необходимо применить подход с пакетным запросом и временными таблицами. Разберем этот процесс по шагам:

  1. Выгружаем данные из табличной части Продукция в таблицу значений ТЗ.
  2. Создаем запрос, который помещает эту таблицу во временную таблицу втТЗ.
  3. Используем ЛЕВОЕ СОЕДИНЕНИЕ с регистром ОсновныеСпецификации по полям Номенклатура и Характеристика.
  4. Обязательно используем ИНДЕКСИРОВАТЬ ПО для полей связи, чтобы ускорить выполнение запроса.

Посмотрим на пример реализации такого кода:


ТЗ = Объект.Продукция.Выгрузить(,"Номенклатура, Характеристика");
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ 
    |   ТЗ.Номенклатура КАК Номенклатура, 
    |   ТЗ.Характеристика КАК Характеристика 
    |ПОМЕСТИТЬ втТЗ 
    |ИЗ 
    |   &ТЗ КАК ТЗ 
    |
    |ИНДЕКСИРОВАТЬ ПО 
    |   Номенклатура, Характеристика
    |;
    |
    |ВЫБРАТЬ 
    |   втТЗ.Номенклатура КАК Номенклатура, 
    |   втТЗ.Характеристика КАК Характеристика, 
    |   ЕСТЬNULL(ОсновнаяСпецификация.Спецификация, ЗНАЧЕНИЕ(Справочник.Спецификация.ПустаяСсылка)) КАК Спецификация 
    |ИЗ 
    |   втТЗ КАК втТЗ 
    |   ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификации КАК ОсновнаяСпецификация 
    |       ПО втТЗ.Номенклатура = ОсновнаяСпецификация.Номенклатура 
    |       И втТЗ.Характеристика = ОсновнаяСпецификация.Характеристика";

Запрос.УстановитьПараметр("ТЗ", ТЗ);
Выборка = Запрос.Выполнить().Выбрать();

Важные замечания по реализации

Индексация: При создании временной таблицы втТЗ крайне важно индексировать оба поля: Номенклатура и Характеристика. Это обеспечивает оптимальную производительность при выполнении соединения ЛЕВОЕ СОЕДИНЕНИЕ, так как именно эта пара образует ключ доступа к данным регистра.

Периодичность регистра: Помните, что регистр сведений ОсновныеСпецификации в большинстве типовых конфигураций 1С ERP не является периодическим. Он хранит только текущее активное состояние. Если вам требуется учитывать исторические данные или разные спецификации на разные даты, необходимо искать альтернативные способы получения данных, соответствующие логике учета вашей версии конфигурации.

Обход результата: После получения Выборка, вы можете пройтись по ней один раз и заполнить соответствующие строки в табличной части вашего документа. Это гораздо эффективнее, чем «дергать» базу данных для каждой отдельной строки в цикле Для Каждого.

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

← На главную