Как добавить поле через точку в макет печатной формы без изменения программного кода

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

При работе с макетами печатных форм в 1С часто возникает ситуация, когда стандартного набора полей недостаточно. Пользователи или аналитики хотят добавить в печатную форму дополнительные реквизиты, например, [Сотрудник.Наименование] или [Объект.ИНН], надеясь, что система автоматически «пройдет по ссылке» и выведет нужное значение. Рассмотрим, почему это часто не срабатывает и какие существуют способы решения этой задачи без прямого вмешательства в программный код конфигурации.

Разбор механизма работы метода Заполнить()

Для начала проанализируем ситуацию, описанную в теме. Программист использует стандартную конструкцию для вывода данных в область табличного документа:

Область.Параметры.Заполнить(ПараметрыМакета);

Метод Заполнить() у объекта Параметры области макета работает по принципу прямого сопоставления имен. Разберем по шагам, что происходит в этот момент:

  1. Система анализирует коллекцию ПараметрыМакета (обычно это Структура или ВыборкаИзРезультатаЗапроса).
  2. Система ищет в макете параметры, имена которых строго совпадают с ключами в источнике данных.
  3. Если в источнике есть ключ Сотрудник, а в макете — параметр Сотрудник, значение будет перенесено.
  4. Если же в макете указано Сотрудник.Наименование, система будет искать в источнике ключ с точно таким же строковым именем (включая точку).

Выясним причину неудачи: метод Заполнить() не является «умным» механизмом компоновки данных. Он не умеет самостоятельно переходить по ссылкам объектов. Если в структуру ПараметрыМакета передана ссылка на справочник, то у этой ссылки нет свойства с названием "Сотрудник.Наименование". У нее есть свойство Наименование, но оно находится «внутри» объекта Сотрудник. Именно поэтому в ячейке макета появляется значение «Неопределено».

Ограничения пользовательской корректировки макетов

В современных конфигурациях на базе БСП (Библиотека стандартных подсистем) предусмотрен раздел «Макеты печатных форм» (Администрирование — Печатные формы, отчеты и обработки). Здесь можно отредактировать макет, не снимая конфигурацию с поддержки. Однако, добавив в ячейку текст [Сотрудник.Наименование], мы сталкиваемся с вышеописанным ограничением платформы.

Важный нюанс: тип заполнения ячейки может быть «Параметр» или «Шаблон». Если мы выбираем «Шаблон», мы можем написать текст вида Сотрудник: [Сотрудник]. Но и это не решит проблему обращения через точку, так как механизм шаблонов также полагается на уже подготовленные в коде данные.

Вариант 1: Использование пользовательских макетов на базе СКД

Проанализируем ситуацию: есть ли исключения? Да. Если печатная форма в вашей конфигурации построена не на классическом выводе областей, а на базе Схемы компоновки данных (СКД), то возможности пользователя практически безграничны.

В таких формах при редактировании макета через интерфейс «1С:Предприятие» можно:

Если же форма «классическая» (использует Вывести() и Заполнить()), то добавление произвольного поля через точку без изменения программного кода невозможно.

Вариант 2: Дополнительные реквизиты и сведения

Разберем еще один обходной путь. В типовых конфигурациях (УТ 11, ERP, ЗУП 3) реализован механизм дополнительных реквизитов. В некоторых печатных формах БСП автоматически подтягивает дополнительные реквизиты в список доступных параметров.

Если вам крайне необходимо вывести специфическую информацию о сотруднике, попробуйте следующее:

  1. Зайдите в настройки дополнительных реквизитов для нужного справочника.
  2. Добавьте новый реквизит.
  3. Проверьте, не появился ли этот реквизит в списке доступных полей при редактировании макета печатной формы в режиме пользователя.

Технический хак: Ключ структуры с точкой (для разработчиков)

Хотя автор вопроса просил решение «НЕ ИЗМЕНЯЯ КОДА», для полноты картины разберем, как это работает на уровне платформы. Интересный факт: в языке 1С можно создать ключ структуры, содержащий точку, если использовать квадратные скобки. Посмотрим на пример кода:


ПараметрыМакета = Новый Структура;
ПараметрыМакета.Вставить("Сотрудник.Наименование", "Иванов Иван Иванович");
// Теперь метод Заполнить увидит этот параметр
Область.Параметры.Заполнить(ПараметрыМакета);

Если бы разработчик типового решения изначально подготовил структуру параметров таким образом, то поле [Сотрудник.Наименование] в макете бы заполнилось. Но поскольку в типовом коде чаще всего передается просто ссылка на объект или результат запроса, где имена полей соответствуют именам в БД, точки в именах ключей отсутствуют.

Выводы и рекомендации

Подведем итоги нашего исследования. Если вы столкнулись с необходимостью добавить поле через точку в стандартный макет:

  1. Проверьте тип печатной формы. Если это форма на СКД — смело добавляйте поле через расширенное редактирование макета.
  2. Проверьте отладчиком (если есть доступ), какие именно параметры передаются в ПараметрыМакета. Если там есть структура, в которой уже содержится нужный вам объект, попробуйте создать в макете параметр с простым именем (например, Наименование), но это сработает только если Заполнить() вызывается непосредственно для подобласти этого объекта.
  3. Смиритесь с ограничениями. Если форма классическая и данных в ПараметрыМакета нет, то без использования Расширения или создания Внешней печатной формы задачу решить не получится.

Таким образом, правильный ответ на вопрос автора — в рамках стандартного механизма Заполнить() и обычного редактирования макета добавить поле «через точку» нельзя, так как это требует изменения состава подготавливаемых данных в программном коде.

← На главную