Как объединить данные из разных документов в один запрос и вывести в макет отчета 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Анализ структуры пакетного запроса

Рассмотрим типовую ситуацию. В отчете уже формируется сложный пакетный запрос, где собираются плановые показатели, обороты по складам и остатки. Данные объединяются во временные таблицы (ПОМЕСТИТЬ ДанныеПлан, ПОМЕСТИТЬ ТоварыНаСкладах, ПОМЕСТИТЬ ОстаткиИОбороты), после чего результирующая выборка соединяется со справочниками и группируется в секции ИТОГИ.

Когда требуется добавить данные из табличной части другого документа (например, Документ.МойДокумент), у разработчика есть два пути: выполнять отдельный запрос в цикле обхода или внедрить выборку документа непосредственно в общий пакет запросов. Выполнение запросов в цикле крайне не рекомендуется, так как это многократно снижает производительность отчета. Оптимальный вариант — использовать временные таблицы и левое соединение.

Пошаговое объединение запросов через временные таблицы

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

  1. Создание отдельной временной таблицы для дополнительного документа. В начало или середину пакета запросов добавляем выборку по новому документу с обязательной группировкой до уровня ключевых полей связи (например, Подразделение).
  2. Связывание с основной выборкой. В итоговом запросе пакета выполняем ЛЕВОЕ СОЕДИНЕНИЕ результирующей таблицы движений с новой временной таблицей.
  3. Обработка отсутствующих значений. Все числовые и ссылочные поля присоединяемой таблицы оборачиваем в функцию ЕСТЬNULL().
  4. Корректировка секции итогов. Если новое поле является числовым ресурсом, добавляем его агрегацию в секцию ИТОГИ СУММА(...).

Посмотрим на пример формирования новой временной таблицы внутри пакета:


ВЫБРАТЬ
	МойДокумент.Подразделение КАК Подразделение,
	МАКСИМУМ(МойДокумент.Ссылка) КАК ДокументСсылка,
	СУММА(МойДокумент.СуммаДокумента) КАК СуммаПоДокументу
ПОМЕСТИТЬ ДанныеМоегоДокумента
ИЗ
	Документ.МойДокумент КАК МойДокумент
ГДЕ
	МойДокумент.Дата МЕЖДУ &Начало И &ОкончаниеДня
	И НЕ МойДокумент.ПометкаУдаления
СГРУППИРОВАТЬ ПО
	МойДокумент.Подразделение
;

Теперь проанализируем, как связать эту временную таблицу в финальной части запроса:


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

Подводные камни и важные правила

При объединении таблиц в запросах 1С важно учитывать следующие моменты:

  1. Задвоение числовых показателей: Если соединять таблицу остатков/оборотов с табличной частью документа напрямую без предварительной свертки, на каждую строку табличной части строки остатков продублируются. Это приведет к многократному завышению итоговых сумм. Всегда сворачивайте присоединяемые данные во временной таблице по ключевым полям связи.
  2. Использование неявных соединений: Обращения через точку к реквизитам шапки из табличной части (например, НакладнаяПоставщикаТовары.Ссылка.Подразделение) порождают неявные соединения. Для оптимизации быстродействия лучше выбирать данные напрямую из документа или явно соединять шапку с табличной частью.
  3. Корректность секции ИТОГИ: Если поле содержит текстовую информацию или ссылку на документ, которую нужно вывести в группировке по подразделению, не включайте её в агрегатные функции СУММА(), а выводите через МАКСИМУМ() либо указывайте в списке полей после ключевого слова ПО.

Вывод новых данных в макет отчета

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

Для надежного вывода используем именованные параметры строк макета. Разберем правильный пример заполнения и вывода строки в цикле обхода выборки:


Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока Выборка.Следующий() Цикл
	ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
	
	// Заполняем основные параметры
	ОбластьСтрока.Параметры.Подразделение = Выборка.Подразделение;
	ОбластьСтрока.Параметры.КоличествоОстаток = Выборка.КоличествоОстаток;
	
	// Заполняем новое добавленное поле
	ОбластьСтрока.Параметры.Документ = Выборка.ДокументСсылка;
	ОбластьСтрока.Параметры.ДопСумма = Выборка.ДопСумма;
	
	ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

Если требуется скопировать сразу все одноименные поля из выборки в параметры области, удобно использовать метод ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, Выборка). Это исключает ручное присвоение каждого реквизита и защищает код от ошибок при дальнейшем расширении макета.

← На главную