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