Почему не работает запрос при соединении Реализации и Поступления на расчетный счет в 1С:Бухгалтерии 3.0?

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

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

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

Анализ причины: особенности структуры метаданных БП 3.0

Главная причина, по которой прямой запрос к шапке документа Документ.ПоступлениеНаРасчетныйСчет не возвращает данные, заключается в устройстве структуры хранения данных в «1С:Бухгалтерии 3.0»:

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

Способ 1. Соединение через табличную часть документа

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

Разберем пример правильного написания запроса:


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

УПОРЯДОЧИТЬ ПО
	Дата

Важные нюансы при работе с табличными частями:

  1. Если один счет оплачивался несколькими платежными поручениями или разбивался на несколько строк в расшифровке, в результате выполнения запроса реализация может продублироваться. Чтобы избежать дублей, рекомендуется сгруппировать данные по входящей табличной части во вложенном запросе или во временной таблице.
  2. Условие Ссылка.Проведен = ИСТИНА обязательно нужно накладывать при соединении или во временной таблице, чтобы исключить непроведенные или помеченные на удаление документы оплаты.

Способ 2. Запрос к регистру бухгалтерии (Рекомендуемый подход)

Запросы напрямую к таблицам документов часто считаются избыточными и менее производительными, так как реквизиты табличных частей не индексируются в СУБД. Кроме того, прямой запрос к документам не учитывает фактический зачет авансов, корректировки долга и регламентные операции.

Проанализируем альтернативный подход — получение оплат через движения регистра бухгалтерии РегистрБухгалтерии.Хозрасчетный (счета 62.01, 62.02). Это позволяет получить корректные данные о взаиморасчетах с учетом проведенных платежей:


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

Соединение по регистрам бухгалтерии или регистрам накопления расчетов гарантирует высокую скорость выполнения запроса и корректное отображение финансового состояния взаиморасчетов.

← На главную