Как эффективно получить данные о проданной номенклатуре и затраченных материалах в 1С?

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

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

Анализ проблемы «неявных соединений»

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

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

Шаг 1: Получение данных о продажах

Сначала давайте сформируем временную таблицу ДанныеПродаж. Важно использовать ЗНАЧЕНИЕ для обращения к счетам и правильно ограничивать выборку, чтобы не перегружать запрос лишними данными.


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

Шаг 2: Расчет материалов и оптимизация соединения

Когда у нас есть данные о продажах, нам нужно соединить их со спецификацией. Чтобы избежать проблем с производительностью, мы используем конструкцию ВЫБОР для определения номенклатуры и ограничиваем выборку только нужными данными.

Обратите внимание на использование ИТОГИ ПО ИЕРАРХИЯ. Это ключевой элемент, который позволяет платформе 1С автоматически сформировать структуру дерева для вывода на форму или в табличный документ.


ВЫБРАТЬ
    ВЫБОР
        КОГДА СпецификацииНоменклатуры.Ссылка.Владелец.Родитель.Родитель.Родитель = &Пустой
            ТОГДА СпецификацииНоменклатуры.Ссылка.Владелец
    КОНЕЦ КАК Номенклатура,
    СпецификацииНоменклатуры.Номенклатура КАК Материал,
    СпецификацииНоменклатуры.Количество * ДанныеПродаж.КоличествоОборотКт КАК Количество
ИЗ
    Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатуры,
    ДанныеПродаж КАК ДанныеПродаж
ГДЕ
    СпецификацииНоменклатуры.Ссылка.Владелец = ДанныеПродаж.Номенклатура
ИТОГИ
    МАКСИМУМ(Количество)
ПО
    Номенклатура ИЕРАРХИЯ

Рекомендации по улучшению архитектуры

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

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

← На главную