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