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