При разработке собственных обработок или отчетов, связанных с разузлованием номенклатуры в конфигурации 1С:Управление производственным предприятием (УПП) редакции 1.3, разработчики часто сталкиваются с неочевидным поведением системы. Бывают ситуации, когда для одной конкретной номенклатурной позиции алгоритм упорно выбирает старую, давно неактуальную спецификацию, хотя в регистре сведений ОсновныеСпецификацииНоменклатуры на текущую дату задана совершенно другая, новая спецификация.
В этой статье мы подробно разберем, как устроен механизм выбора спецификаций в УПП, почему стандартный алгоритм разузлования может игнорировать установленные даты актуальности и как правильно решить эту проблему, не нарушив другие бизнес-процессы предприятия.
Рассмотрим ситуацию на конкретном примере. Разработчик написал обработку для развертывания дерева спецификаций (разузлования) номенклатуры, используя типовые механизмы. Для всех позиций алгоритм отрабатывает корректно, кроме одной. При анализе запросом выясняется, что для проблемного комплектующего система выбирает самую первую созданную спецификацию вместо актуальной.
Типичный запрос для получения структуры исходных комплектующих выглядит следующим образом:
ВЫБРАТЬ
ИсходныеКомплектующие.Ссылка КАК Ссылка,
ИсходныеКомплектующие.Номенклатура КАК Номенклатура,
ИсходныеКомплектующие.Спецификация КАК Спецификация
ИЗ
Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК ИсходныеКомплектующие
ГДЕ
ИсходныеКомплектующие.Ссылка = &Спецификация
При этом при проверке регистра сведений ОсновныеСпецификацииНоменклатуры выясняется, что с определенной даты (например, с 1 августа) назначена новая основная спецификация. Однако система упорно продолжает использовать старую (назначенную, к примеру, с 1 мая). Выясним, почему так происходит.
В типовом решении 1С:УПП заложена строгая иерархия приоритетов при подборе спецификаций для полуфабрикатов и комплектующих. Система осуществляет поиск по следующему алгоритму:
ОсновныеСпецификацииНоменклатуры. Регистр в данном случае просто «идет лесом».ОсновныеСпецификацииНоменклатуры. В этом случае система ищет запись, актуальную на переданную в параметрах дату (с учетом разреза по организациям или подразделениям, если это применимо).Таким образом, если технолог при создании спецификации верхнего уровня случайно или намеренно указал конкретную подчиненную спецификацию для полуфабриката, этот полуфабрикат всегда будет разузловываться по этой жестко заданной схеме, даже если она давно устарела.
Часто пользователи и разработчики не понимают, откуда в табличной части «Исходные комплектующие» вообще берется колонка «Спецификация», если на первый взгляд в форме ее не видно. Наличие этой колонки регулируется специальной настройкой.
В форме спецификации номенклатуры на командной панели присутствует кнопка «Настройка». При ее нажатии открывается окно настроек параметров спецификации, где есть флаг «Использовать вид воспроизводства».
Рассмотрим, как этот флаг влияет на интерфейс и данные:
Самым простым и быстрым решением проблемы кажется простое снятие флага «Использовать вид воспроизводства» в настройках спецификации. Именно так часто поступают пользователи (и автор темы на форуме). Однако в условиях реального производственного предприятия это может привести к серьезным негативным последствиям.
Проанализируем риски отключения этой настройки:
Правильное решение без отключения флага:
Если предприятию необходимо продолжать использовать виды воспроизводства, флаг отключать ни в коем случае нельзя. Вместо этого нужно выполнить следующие шаги:
После этого поле спецификации в строке станет пустым. Алгоритм разузлования, не найдя жесткой привязки, автоматически обратится к регистру сведений ОсновныеСпецификацииНоменклатуры и выберет актуальную на текущую дату спецификацию, сохранив при этом всю логику планирования воспроизводства.
Если вы пишете собственную обработку разузлования, использование стандартных функций конфигурации, таких как УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(), в цикле по строкам дерева может крайне негативно сказаться на производительности. Это классическая проблема «N+1 запросов», когда к базе данных выполняется множество мелких транзакций.
Для оптимизации процесса разузлования больших спецификаций с множеством уровней вложенности рекомендуется использовать следующий подход:
Соответствие), связывающий номенклатуру, дату и актуальную спецификацию.