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