Как в 1С:ERP запросом связать списание безналичных ДС и заявку на расходование

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

При разработке отчетов, доработке казначейских механизмов и интеграциях в 1С:ERP часто возникает задача определить, какими платежными документами была оплачена конкретная заявка на расходование денежных средств, либо наоборот — к какой заявке относится конкретное списание. Простого обращения к реквизиту шапки документа СписаниеБезналичныхДенежныхСредств зачастую оказывается недостаточно. Разберем архитектуру хранения связей между этими объектами, выясним возможные подводные камни и рассмотрим варианты построения корректных запросов.

Особенности архитектуры хранения связей в 1С:ERP

В типовой конфигурации 1С:ERP связь между заявкой и списанием безналичных ДС может храниться в нескольких местах в зависимости от вида операции и порядка оформления платежа:

  1. Реквизит шапки: у документа СписаниеБезналичныхДенежныхСредств присутствует реквизит ЗаявкаНаРасходованиеДенежныхСредств. Однако при оплате по нескольким заявкам или в зависимости от выбранной хозяйственной операции этот реквизит может оставаться пустым.
  2. Табличная часть документа: реквизит ЗаявкаНаРасходованиеДенежныхСредств присутствует в табличной части РасшифровкаПлатежа. Когда платеж разбивается по статьям ДДС, договорам или оплачивается сводным поручением сразу по нескольким распоряжениям, данные хранятся строго в строках табличной части.
  3. Реквизит «ДокументОснование»: в шапке списания также есть реквизит ДокументОснование. Важно понимать разницу: документ-основание — это первичный документ, послуживший поводом для ввода списания, в то время как ЗаявкаНаРасходованиеДенежныхСредств выступает именно казначейским распоряжением на перечисление денег. Использовать поле ДокументОснование для поиска заявки не рекомендуется.
  4. Регистр накопления «ДенежныеСредстваКВыплате»: при проведении заявки формируются движения с плюсом (план расхода), а при проведении списания регистр закрывается движениями с минусом (факт расхода).

Вариант 1. Универсальный запрос по таблицам документа

Для поиска всех связанных списаний (включая непроведенные документы или черновики) необходимо обращаться напрямую к таблицам самого документа. Чтобы не потерять данные, объединим сведения из шапки и табличной части с использованием конструкции ОБЪЕДИНИТЬ.

Поскольку одной заявке может соответствовать несколько строк в табличной части или платеж может разбиваться на несколько сумм, обязательно используем ключевое слово РАЗЛИЧНЫЕ для исключения дублирования ссылок:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    СписаниеШапка.Ссылка КАК СписаниеДС
ИЗ
    Документ.СписаниеБезналичныхДенежныхСредств КАК СписаниеШапка
ГДЕ
    СписаниеШапка.ЗаявкаНаРасходованиеДенежныхСредств = &Заявка
    И НЕ СписаниеШапка.ПометкаУдаления

ОБЪЕДИНИТЬ

ВЫБРАТЬ РАЗЛИЧНЫЕ
    СписаниеТЧ.Ссылка КАК СписаниеДС
ИЗ
    Документ.СписаниеБезналичныхДенежныхСредств.РасшифровкаПлатежа КАК СписаниеТЧ
ГДЕ
    СписаниеТЧ.ЗаявкаНаРасходованиеДенежныхСредств = &Заявка
    И НЕ СписаниеТЧ.Ссылка.ПометкаУдаления

Рассмотрим подробнее важные нюансы этого подхода:

  1. Множественность связей: связь между документами является связью «многие-ко-многим». Одно списание может частично или полностью оплачивать сразу несколько заявок, а одна заявка может оплачиваться несколькими платежками.
  2. Статус подтверждения банком: в 1С:ERP проведение списания лишь фиксирует факт создания платежного поручения или отправки его в банк. Фактическое списание с расчетного счета подтверждается признаком ПроведеноБанком. Если для отчета требуется только фактическая оплата, необходимо добавить проверку Списание.ПроведеноБанком = ИСТИНА.

Вариант 2. Запрос к регистру накопления «ДенежныеСредстваКВыплате»

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

Проанализируем структуру движений: измерением регистра выступает ЗаявкаНаРасходованиеДенежныхСредств, а регистратором — платежный документ. Наложим фильтр по типу регистратора:


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

Ограничения данного способа: если документ списания безналичных ДС был создан, но еще не проведен оператором или помечен на удаление, в регистре движений не будет. Для работы с черновиками этот метод не подходит.

Вариант 3. Использование критерия отбора «СвязанныеДокументы»

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


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

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

Резюме

Для гарантированного нахождения связей рекомендуется использовать первый вариант — прямой запрос по документу СписаниеБезналичныхДенежныхСредств через ОБЪЕДИНИТЬ по шапке и табличной части РасшифровкаПлатежа. Если отчет анализирует исключительно исполненный платежный календарь и факты оплат, оптимально использовать регистр накопления ДенежныеСредстваКВыплате с контролем реквизита ПроведеноБанком.

← На главную