Почему в запросе 1С не связываются Счет на оплату и Поступление на расчетный счет?

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

При разработке отчетов и механизмов контроля оплат часто возникает задача связать выписанный покупателю счет с фактически поступившей оплатой. Однако разработчики нередко сталкиваются с ситуацией, когда левое соединение документа СчетНаОплатуПокупателю с документом ПоступлениеНаРасчетныйСчет возвращает пустые поля оплаты (значения NULL), даже если пользователь визуально видит введенный документ в базе.

Разберем по шагам, почему возникает эта ошибка, какие особенности структуры метаданных и языка запросов 1С влияют на результат, и как правильно составить запрос для получения данных об оплате.

Причина 1. Ошибочное обращение через точку к реквизиту составного типа

Проанализируем исходный фрагмент связи таблиц:


ПО (ПоступлениеНаРасчетныйСчет.ДокументОснование.Ссылка = СчетНаОплатуПокупателю.Ссылка)

В этой конструкции допущены сразу две ошибки:

  1. Лишнее разыменование ссылки: Реквизит ДокументОснование уже сам по себе содержит ссылку на документ. Конструкция .Ссылка здесь избыточна.
  2. Неявное соединение составного типа: Реквизит ДокументОснование в типовых конфигурациях имеет составной ссылочный тип (может ссылаться на счета, заказы, реализации и т. д.). При обращении через точку к свойствам составного типа СУБД выполняет неявные левые соединения со всеми таблицами, входящими в этот тип. Это ухудшает производительность и может исказить результаты сопоставления.

Для корректного сравнения ссылок составного типа в секции ПО необходимо использовать явное приведение с помощью функции ВЫРАЗИТЬ:


ПО ВЫРАЗИТЬ(ПоступлениеНаРасчетныйСчет.ДокументОснование КАК Документ.СчетНаОплатуПокупателю) = СчетНаОплатуПокупателю.Ссылка

Причина 2. Хранение ссылки на счет в табличной части, а не в шапке документа

В большинстве типовых решений (например, в «1С:Бухгалтерия предприятия» ред. 3.0) при проведении банковских выписок один платеж может закрывать сразу несколько счетов или договоров. Поэтому ссылка на счет на оплату хранится не в реквизите шапки ДокументОснование, а в строках табличной части РасшифровкаПлатежа (реквизит СчетНаОплату или Сделка).

Если выполнять соединение только по шапке документа, запрос вернет пустые значения, так как реквизит ДокументОснование в шапке документа остается незаполненным. Рассмотрим правильный вариант соединения через табличную часть:


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

Причина 3. Ошибки отбора по номеру документа

Посмотрим на условие фильтрации из исходного запроса: ГДЕ СчетНаОплатуПокупателю.Номер = "0000000031". Жесткая привязка к строковому номеру документа в тексте запроса приводит к следующим проблемам:

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

Рекомендация: Всегда передавайте в запрос конкретную ссылку на документ через параметры (&СчетСсылка) либо ограничивайте выборку интервалом дат (Счет.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания).

Альтернативные способы получения связанных документов и факта оплаты

Разберем другие стандартные механизмы платформы 1С, позволяющие получить оплаты по счету:

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

    Если в конфигурации настроена структура подчиненности, список всех документов, порожденных данным счетом, можно получить через критерий отбора:

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

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

Таким образом, для гарантированного получения данных об оплате необходимо проверить, где именно в вашей конфигурации хранится ссылка на счет (в шапке или в табличной части РасшифровкаПлатежа), использовать оператор ВЫРАЗИТЬ при работе с составными типами и передавать параметры документов вместо строковых литералов номеров.

← На главную