Разузлование номенклатуры — это задача по построению дерева состава изделия, которая часто встречается в производстве. В условиях высоконагруженных систем стандартный подход с использованием рекурсии в коде на языке 1С может приводить к значительным задержкам. Давайте разберем, как решить эту проблему, перейдя от медленного перебора к производительным механизмам платформы.
Когда мы реализуем разузлование в цикле, каждый шаг алгоритма требует обращения к серверу баз данных. В 1С каждое такое обращение влечет за собой сетевые задержки и накладные расходы на выполнение запроса платформой. Профессиональные SQL-разработчики решают подобные задачи с помощью CTE (Common Table Expressions), выполняя все вычисления на стороне СУБД за один проход. Чтобы добиться сравнимой скорости в 1С, нам нужно минимизировать количество обращений к базе данных.
Одним из наиболее эффективных инструментов для построения иерархий без написания сложной рекурсии в коде является Система компоновки данных (СКД). Давайте рассмотрим, как реализовать этот подход шаг за шагом.
Основная идея заключается в использовании наборов данных с заданными связями. Мы определяем структуру данных так, чтобы платформа сама вычисляла связи между уровнями иерархии.
Рассмотрим пример кода для подготовки данных:
ВЫБРАТЬ
СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК НоменклатураИсходная,
СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка
ПОМЕСТИТЬ ВТ_СпецификацийИсходных
ИЗ
Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
ГДЕ
СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура = &НоменклатураПараметр
;
ВЫБРАТЬ
СпецификацииНоменклатурыВыходныеИзделия.Номенклатура КАК НоменклатураВыходная,
ВТ_СпецификацийИсходных.НоменклатураИсходная,
ВТ_СпецификацийИсходных.Ссылка
ИЗ
ВТ_СпецификацийИсходных КАК ВТ_СпецификацийИсходных
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ВыходныеИзделия КАК СпецификацииНоменклатурыВыходныеИзделия
ПО ВТ_СпецификацийИсходных.Ссылка = СпецификацииНоменклатурыВыходныеИзделия.Ссылка
В настройках связей наборов данных СКД необходимо указать следующее:
НоменклатураВыходнаяНоменклатураИсходнаяНоменклатураПараметрЭтот метод позволяет платформе автоматически «раскрывать» дерево спецификаций до уровня сырья. Преимущество здесь в том, что оптимизация соединений данных ложится на движок СКД, что работает значительно быстрее, чем ручной перебор Выборка в цикле.
Если требования к скорости обработки данных (например, «полбазы за 10 секунд») остаются жесткими, рассмотрите следующие стратегии:
Вместо того чтобы вычислять иерархию при каждом обращении, мы можем хранить структуру дерева в готовом виде. Вы можете добавить в справочник или в РегистрСведений служебные поля, которые будут хранить «путь» элемента (например, 01/05/12). Это превращает сложный рекурсивный запрос в простую выборку по условию, что выполняется практически мгновенно.
Для сложных цепочек производства, включающих аналоги, лучше использовать специализированный РегистрСведений. При изменении спецификации фоновое задание может выполнять полное разузлование и записывать результат в этот регистр. При чтении данных из такого регистра мы получаем уже готовый список всех компонентов без необходимости вычислений в момент запроса.
Это мощный математический метод, позволяющий получить все связи «от всех ко всем». В 1С это реализуется путем создания вспомогательной таблицы, в которой для каждого изделия хранится список всех его вложенных компонентов, независимо от уровня вложенности. При обновлении спецификаций этот регистр обновляется, а чтение состава изделия сводится к обычному ВЫБРАТЬ ... ГДЕ.
Разузлование — задача ресурсоемкая, поэтому важно выбрать правильный инструмент:
В ИЕРАРХИИ в запросах 1С ограничено, поэтому для сложных выборок всегда лучше подготовить данные заранее, записав их в ТаблицаЗначений или ВременнаяТаблица.Постепенное освоение механизмов SQL и СКД позволит вам писать более эффективный код, который будет работать стабильно даже на больших объемах данных.