Как добавить новые поля в документ и вывести их в печатную форму в 1С

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

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

Типичные ошибки начинающих разработчиков

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

  1. Создание реквизитов формы вместо реквизитов объекта. Поля ввода добавляются на форму, но введенные данные не сохраняются после закрытия документа, так как они не привязаны к базе данных.
  2. Неправильная настройка ячеек макета печатной формы. Попытка передать программно значение в ячейку макета, которая настроена как обычный текст или шаблон, вместо использования режима параметра.

Рассмотрим детально, как правильно выполнить все этапы доработки, чтобы избежать этих проблем.

Шаг 1. Создание реквизитов документа и их привязка на форме

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

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

Шаг 2. Настройка макета печатной формы

Теперь подготовим шаблон печатной формы в макете документа для вывода новых данных:

  1. Откроем макет печатной формы документа.
  2. Выберем ячейку, в которую должен выводиться, например, номер договора.
  3. Откроем свойства этой ячейки и найдем свойство Заполнение. По умолчанию там установлено значение Текст. Нам необходимо изменить его на Параметр.
  4. В поле Имя параметра укажем понятное имя, например, НомерДоговораПоставки. Обратите внимание: имя параметра не обязательно должно точь-в-точь совпадать с именем реквизита объекта, но для удобства их часто делают одинаковыми. Главное — избегать спецсимволов и пробелов. Если вы хотите использовать шаблонный текст (например, "Договор № [НомерДоговораПоставки]"), выберите режим заполнения Шаблон и укажите параметр в квадратных скобках.

Шаг 3. Программный вывод параметров в печатную форму

После настройки макета и сохранения реквизитов перейдем к программной части. Процедура формирования печатной формы обычно располагается в модуле объекта (в более старых конфигурациях на платформе 8.1/8.2) или в модуле менеджера документа (в современных конфигурациях 8.3).

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

Посмотрим на пример правильного заполнения параметров области макета:


// Получаем область макета (например, "Талончик")
ОбластьТалончик = Макет.ПолучитьОбласть("Талончик");

// Заполняем параметры области значениями из реквизитов документа
ОбластьТалончик.Параметры.НомерДоговораПоставки = Ссылка.НомерДоговораПоставки;
ОбластьТалончик.Параметры.НомерЗаявкиПоставки   = Ссылка.НомерЗаявкиПоставки;

// Выводим заполненную область в итоговый табличный документ
ТабДокумент.Вывести(ОбластьТалончик);

Важное примечание: Присваивание значений параметрам макета обязательно должно происходить до того, как метод Вывести() отправит эту область в табличный документ. Если написать код заполнения параметров после вызова метода Вывести(), то на печать уйдут пустые поля.

Важные нюансы работы с запросами в механизме печати

В большинстве профессиональных и типовых конфигураций 1С данные для печатных форм собираются не напрямую обращением через точку от ссылки (Ссылка.ИмяРеквизита), а с помощью запроса к базе данных. Это делается для оптимизации производительности системы.

Проанализируем эту ситуацию: если в коде формирования печатной формы используется запрос, то простое добавление присваивания в параметры макета может привести к ошибке или пустой печати. Нам потребуется доработать сам запрос:

  1. Найдем в коде инициализацию объекта Запрос.
  2. В тексте запроса в секции ВЫБРАТЬ добавим созданные нами новые реквизиты документа.
  3. В цикле обхода выборки результата запроса передадим эти поля в параметры макета.

Посмотрим на пример реализации кода печати с использованием запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Талон.Ссылка КАК Ссылка,
    |	Талон.НомерДоговораПоставки КАК НомерДоговораПоставки,
    |	Талон.НомерЗаявкиПоставки КАК НомерЗаявкиПоставки
    |ИЗ
    |	Документ.Талон КАК Талон
    |ГДЕ
    |	Талон.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
Выборка = Запрос.Выполнить().Выбрать();

ТабДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьТалончик = Макет.ПолучитьОбласть("Талончик");

Если Выборка.Следующий() Тогда
    // Заполняем параметры данными из выборки запроса
    ОбластьТалончик.Параметры.НомерДоговораПоставки = Выборка.НомерДоговораПоставки;
    ОбластьТалончик.Параметры.НомерЗаявкиПоставки   = Выборка.НомерЗаявкиПоставки;
    ТабДокумент.Вывести(ОбластьТалончик); КонецЕсли;

Альтернативные и более современные подходы

Если вы работаете в современной конфигурации на платформе 1С 8.3 (особенно использующей БСП — Библиотеку стандартных подсистем), разработчики настоятельно рекомендуют избегать изменения типовой конфигурации напрямую. Снятие с поддержки затруднит последующие обновления. Рассмотрим альтернативные варианты:

← На главную