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