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