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