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