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