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