Почему в 1С:УПП при разузловании выбирается неактуальная спецификация номенклатуры?

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

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

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

Суть проблемы и анализ запроса

Рассмотрим ситуацию на конкретном примере. Разработчик написал обработку для развертывания дерева спецификаций (разузлования) номенклатуры, используя типовые механизмы. Для всех позиций алгоритм отрабатывает корректно, кроме одной. При анализе запросом выясняется, что для проблемного комплектующего система выбирает самую первую созданную спецификацию вместо актуальной.

Типичный запрос для получения структуры исходных комплектующих выглядит следующим образом:


ВЫБРАТЬ
    ИсходныеКомплектующие.Ссылка КАК Ссылка,
    ИсходныеКомплектующие.Номенклатура КАК Номенклатура,
    ИсходныеКомплектующие.Спецификация КАК Спецификация
ИЗ
    Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК ИсходныеКомплектующие
ГДЕ
    ИсходныеКомплектующие.Ссылка = &Спецификация

При этом при проверке регистра сведений ОсновныеСпецификацииНоменклатуры выясняется, что с определенной даты (например, с 1 августа) назначена новая основная спецификация. Однако система упорно продолжает использовать старую (назначенную, к примеру, с 1 мая). Выясним, почему так происходит.

1. Как работает приоритет выбора спецификаций при разузловании

В типовом решении 1С:УПП заложена строгая иерархия приоритетов при подборе спецификаций для полуфабрикатов и комплектующих. Система осуществляет поиск по следующему алгоритму:

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

2. Роль флага «Использовать вид воспроизводства»

Часто пользователи и разработчики не понимают, откуда в табличной части «Исходные комплектующие» вообще берется колонка «Спецификация», если на первый взгляд в форме ее не видно. Наличие этой колонки регулируется специальной настройкой.

В форме спецификации номенклатуры на командной панели присутствует кнопка «Настройка». При ее нажатии открывается окно настроек параметров спецификации, где есть флаг «Использовать вид воспроизводства».

Рассмотрим, как этот флаг влияет на интерфейс и данные:

3. Последствия «слепого» снятия флага и правильное решение

Самым простым и быстрым решением проблемы кажется простое снятие флага «Использовать вид воспроизводства» в настройках спецификации. Именно так часто поступают пользователи (и автор темы на форуме). Однако в условиях реального производственного предприятия это может привести к серьезным негативным последствиям.

Проанализируем риски отключения этой настройки:

Правильное решение без отключения флага:

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

  1. Открыть проблемную спецификацию верхнего уровня.
  2. Убедиться, что флаг «Использовать вид воспроизводства» активен.
  3. В табличной части «Исходные комплектующие» найти строку с проблемным полуфабрикатом.
  4. Очистить (стереть) значение в колонке «Спецификация», оставив это поле пустым. При этом колонку «Вид воспроизводства» (например, «Производство») нужно оставить заполненной.
  5. Записать и провести спецификацию.

После этого поле спецификации в строке станет пустым. Алгоритм разузлования, не найдя жесткой привязки, автоматически обратится к регистру сведений ОсновныеСпецификацииНоменклатуры и выберет актуальную на текущую дату спецификацию, сохранив при этом всю логику планирования воспроизводства.

4. Рекомендации по оптимизации кода разузлования для разработчиков

Если вы пишете собственную обработку разузлования, использование стандартных функций конфигурации, таких как УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(), в цикле по строкам дерева может крайне негативно сказаться на производительности. Это классическая проблема «N+1 запросов», когда к базе данных выполняется множество мелких транзакций.

Для оптимизации процесса разузлования больших спецификаций с множеством уровней вложенности рекомендуется использовать следующий подход:

  1. Отказаться от пошагового вызова стандартных функций для каждой строки.
  2. Написать единый пакетный запрос, который выбирает структуру спецификаций сразу на несколько уровней вложенности вперед.
  3. Выгрузить результаты в таблицу значений и построить в оперативной памяти кэш (например, на основе объекта Соответствие), связывающий номенклатуру, дату и актуальную спецификацию.
  4. Разворачивать дерево спецификаций программно в памяти, обращаясь к подготовленному кэшу. Это ускоряет работу алгоритма разузлования в десятки раз по сравнению с поочередным обращением к базе данных.
← На главную