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