Как в запросе 1С сгруппировать связанные документы передачи и возврата?

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация Управленческий учет IT и автоматизация бизнеса
← На главную

При построении отчетов по операциям с давальческим сырьем или переработкой часто возникает задача связать документ-основание с последующими операциями. Типичная структура отчета выглядит как иерархия: Номенклатура → Документ передачи → Связанные документы возврата. Разберем, почему стандартный механизм критериев отбора не подходит для массовой выборки и как правильно составить запрос и настроить группировки.

Почему критерий отбора не работает для массовых отчетов

Начинающие разработчики часто пытаются получить структуру подчиненности через объект метаданных КритерийОтбора.СвязанныеДокументы, используя следующий запрос:


ВЫБРАТЬ
    СвязанныеДокументы.Ссылка КАК Ссылка
ИЗ
    КритерийОтбора.СвязанныеДокументы(&Док) КАК СвязанныеДокументы

Проанализируем ограничения этого подхода:

  1. Работа только с одним объектом: Виртуальная таблица критерия отбора принимает в качестве параметра &Док только одну конкретную ссылку. В языке запросов 1С невозможно передать туда список значений или соединить виртуальную таблицу критерия с другой таблицей.
  2. Проблема N+1 в СКД: В схеме компоновки данных можно настроить два набора данных и связать их, передавая ссылку на родительский документ в качестве параметра дочернего набора. Однако такой подход инициирует отдельный запрос к базе данных для каждой строки отчета. Если в выборке участвуют сотни документов, производительность отчета катастрофически падает.

Если виды связываемых документов известны заранее (в нашем случае это ПередачаТоваров и ВозвратТоваровИзПереработки), оптимальным решением является прямое соединение таблиц документов.

Определение механизма связи документов в конфигурации

Выясним причину, по которой документы связываются в системе. Откроем дерево метаданных и найдем КритерийОтбора.СвязанныеДокументы. В его составе перечислены реквизиты всех объектов, которые платформа анализирует при построении дерева подчиненности.

Как правило, связь между документами переработки организована одним из следующих способов:

  1. Через реквизит шапки: В подчиненном документе возврата есть реквизит ДокументОснование, ссылающийся на документ передачи.
  2. Через реквизит табличной части: В случаях, когда одним документом возвращаются материалы по разным передачам, ссылка хранится непосредственно в табличной части (например, реквизит ДокументПередачи или ДокументПартии в табличной части Товары / Материалы).

Построение запроса через прямое соединение таблиц

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


ВЫБРАТЬ
    ПередачаТовары.Номенклатура КАК Номенклатура,
    ПередачаТовары.Ссылка КАК ДокументПередачи,
    ВозвратТовары.Ссылка КАК ДокументВозврата,
    ЕСТЬNULL(ПередачаТовары.Количество, 0) КАК КоличествоПередано,
    ЕСТЬNULL(ВозвратТовары.Количество, 0) КАК КоличествоВозвращено
ИЗ
    Документ.ПередачаТоваров.Товары КАК ПередачаТовары
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровИзПереработки.Товары КАК ВозвратТовары
        ПО (ВозвратТовары.ДокументПередачи = ПередачаТовары.Ссылка)
            И (ВозвратТовары.Номенклатура = ПередачаТовары.Номенклатура)
ГДЕ
    ПередачаТовары.Ссылка.Проведен = ИСТИНА

Разберем ключевые особенности этого запроса:

  1. Мы используем ЛЕВОЕ СОЕДИНЕНИЕ, чтобы в выборку попали все документы передачи, даже если по ним еще не было оформлено ни одного возврата.
  2. Фильтрация ПередачаТовары.Ссылка.Проведен = ИСТИНА отсекает черновые и помеченные на удаление документы.
  3. Функция ЕСТЬNULL предотвращает появление пустых значений в числовых показателях при отсутствии возвратов.

Настройка трехуровневой группировки в СКД

Чтобы получить требуемую структуру представления данных вида Номенклатура → Передали → Забрали, не нужно объединять разнородные строки внутри запроса. Разберем по шагам правильную настройку схемы компоновки данных:

  1. Настройка структуры отчета: На вкладке «Настройки» СКД создаем дерево группировок:
    - Группировка 1: Номенклатура
    -- Группировка 2: ДокументПередачи
    --- Группировка 3: ДокументВозврата
  2. Настройка ресурсов: На вкладке «Ресурсы» необходимо правильно настроить расчет сумм, чтобы исключить дублирование переданного количества при наличии нескольких документов возврата.

Для ресурса КоличествоПередано указываем формулу расчета только для уровня документа передачи:

Сумма(КоличествоПередано)

В колонке «Рассчитывать по...» для КоличествоПередано выбираем группировку ДокументПередачи и вышестоящие (Номенклатура, ОбщийИтог), исключая детальные записи и группировку ДокументВозврата. Для поля КоличествоВозвращено расчет настраивается стандартно для всех уровней.

Альтернатива: использование регистров накопления

Если в рабочей базе используется партионный учет или специализированные регистры учета переданных материалов (например, в производственных подсистемах), прямая связь по первичным документам может давать неполную картину, если возвраты списываются по методу ФИФО без явного указания партии в первичном документе.

В таких случаях рекомендуется строить отчет к виртуальной таблице ОстаткиИОбороты регистра накопления. В качестве измерений выступают Номенклатура и документ-партия, приход отражает объем передачи, расход — объемы возврата или переработки, а конечное сальдо показывает текущий фактический остаток давальческого сырья.

← На главную