Работа с печатными формами и отчетами в 1С — это ежедневная задача разработчика, однако даже в ней есть нюансы, которые могут поставить в тупик. Типичная ситуация: программист делает запрос, получает данные, но при попытке вывести их в Табличный документ, макет начинает «разваливаться», дублировать строки или разбивать единую логическую область на множество мелких фрагментов. Проанализируем ситуацию, представленную в обсуждении, и разберем по шагам, как добиться корректного отображения данных.
В представленном коде автора используется классический обход результата запроса: Для каждого стр из Результат Цикл, внутри которого вызывается ТабДок.Вывести(ОбластьТабл). Чтобы понять, почему макет «разбивается», рассмотрим механику работы метода Вывести(). В платформе 1С этот метод всегда добавляет указанную область вниз, создавая новую строку (или группу строк) в результирующем документе. Если ваша область в макете — это одна строка, то на каждой итерации цикла будет создаваться новая строка в табличном документе.
Если ваша цель — вывести несколько значений в одну и ту же строку, но в разные колонки, или дополнить уже выведенную строку, выясним, какой метод подойдет лучше. Для этих целей используется Присоединить(). В отличие от Вывести(), метод Присоединить() добавляет область справа от последней выведенной, не перенося каретку на новую строку.
// Пример неправильного вывода (создает новые строки)
Для каждого Стр из Результат Цикл
ОбластьТабл.Параметры.Заполнить(Стр);
ТабДок.Вывести(ОбластьТабл); // Каждая запись - новая строка
КонецЦикла;
// Пример правильного вывода в одну строку (горизонтально)
Для каждого Стр из Результат Цикл
ОбластьТабл.Параметры.Заполнить(Стр);
Если ЭтоПерваяИтерация Тогда
ТабДок.Вывести(ОбластьТабл);
Иначе
ТабДок.Присоединить(ОбластьТабл);
КонецЕсли;
КонецЦикла;
Часто в обсуждениях на форумах возникает спор: что лучше использовать в ячейке макета — Параметр или Шаблон. Разберем подробнее эти свойства ячейки, так как от них зависит, как именно данные «встанут» в макет.
Объект_Признак. В коде вы присваиваете этому параметру конкретное значение. Ячейка может содержать только один параметр целиком.Артикул: [Артикул], Наименование: [Номенклатура].Проанализируем ситуацию, когда нам нужно запихать несколько значений из разных строк запроса в одну ячейку. Как правильно заметили участники дискуссии, напрямую через цикл это сделать сложно. Если вы будете в цикле заполнять параметр одной и той же ячейки, в итоге в ней останется только значение из последней итерации. Чтобы вывести «4 разных значения в одну область без дробления», необходимо сначала подготовить данные.
Если ваша задача — собрать данные из нескольких строк результата запроса и отобразить их в одной ячейке, рассмотрим по шагам правильный алгоритм действий:
ТаблицуЗначений.Свернуть() или сгруппируйте данные еще на уровне SQL-запроса (что более эффективно).
// Программная склейка значений перед выводом в макет
СписокЗначенийТекст = "";
Для каждого Стр из Результат Цикл
СписокЗначенийТекст = СписокЗначенийТекст + Стр.Объект_Признак + ", ";
КонецЦикла;
// Убираем лишнюю запятую в конце
СписокЗначенийТекст = Лев(СписокЗначенийТекст, СтрДлина(СписокЗначенийТекст) - 2);
// Теперь выводим один раз в один параметр
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
ОбластьМакета.Параметры.ОбщийСписок = СписокЗначенийТекст;
ТабДок.Вывести(ОбластьМакета);
Автор исходного сообщения использовал метод Результат.Свернуть("Объект_Признак"). Посмотрим на пример того, как это работает. Метод Свернуть принимает два параметра: колонки, по которым группируем (измерения), и колонки, которые суммируем (ресурсы). Если вы просто сворачиваете по одной колонке, все остальные данные, не указанные в параметрах метода, будут удалены.
Важный совет: Старайтесь всегда делать группировку в тексте запроса (СГРУППИРОВАТЬ ПО...). Это снижает нагрузку на сервер 1С и передает по сети уже готовый, компактный объем данных. Метод Свернуть() работает в оперативной памяти и может быть медленным на больших таблицах.
Иногда проблема кроется не в коде, а в самом макете (визуальном редакторе). Выясним причину возможных визуальных искажений:
Присоединить().Подведем итог нашего анализа. Чтобы данные выводились красиво и предсказуемо, следуйте этим правилам:
Вывести() в цикле.Присоединить().ТабличныйДокумент.Проанализировав ситуацию, мы видим, что «магия» 1С заключается в четком понимании того, как платформа управляет кареткой при заполнении табличного документа. Комбинируя правильные методы вывода и предварительную подготовку данных, вы сможете создать отчет любой сложности без визуальных дефектов.