Многие специалисты сталкиваются с необходимостью подкорректировать стандартную печатную форму (ПФ) непосредственно в режиме предприятия, например, в конфигурации 1С:ERP. Казалось бы, платформа предоставляет для этого удобный функционал: пользовательские макеты. Однако при работе с ними возникают неочевидные проблемы. Разберем по шагам, какие подводные камни нас ожидают, проанализируем причины возникновения ошибок после обновлений конфигурации и выясним, как правильно и быстро создавать внешние печатные формы на базе типовых механизмов.
Первый вопрос, который часто возникает: можно ли просто удалить лишние параметры из пользовательского макета? Выясним причину, по которой прямое удаление ячеек с параметрами (текст, заключенный в угловые <Параметр> или квадратные [Параметр] скобки) является плохой практикой.
Проанализируем ситуацию: вы отредактировали стандартный макет накладной или акта сверки, убрали из него часть шапки с ненужными реквизитами и сохранили. Какое-то время все работает отлично. Но после обновления конфигурации от 1С пользователи внезапно получают ошибку при попытке распечатать документ. Почему так происходит?
Дело в том, что программный код конфигурации (в модуле менеджера или модуле объекта), который отвечает за заполнение этого макета, пытается обратиться к параметрам, которых в вашей пользовательской версии больше нет. Рассмотрим пример: разработчики 1С добавили в типовой код заполнение нового параметра:
ОбластьМакета.Параметры.ДолжностьИП = Выборка.Должность;
Если в вашем измененном макете параметр ДолжностьИП отсутствует, платформа сгенерирует исключение, и формирование печатной формы прервется крахом. То же самое касается и тех параметров, которые вы удалили намеренно. Код пытается их заполнить «в лоб», а ячейки с таким именем нет.
Как поступить правильно:
Часто возникает желание добавить в макет параметр, прописав к нему путь через точку, например Объект.Подразделение.ТекущийРуководитель, в надежде, что платформа сама поймет, откуда взять данные. Разберем этот момент подробнее.
Платформа 1С в пользовательском режиме не компилирует и не вычисляет объектные выражения прямо из табличного документа. Макет — это просто «глухой» шаблон. Данные в макет попадают исключительно в том случае, если разработчик в программном коде явно получил это значение (обычно с помощью запроса) и передал его в параметры выводимой области.
Посмотрим на это с технической стороны: если в модуле нет кода, который считывает руководителя подразделения и передает его в макет, добавление такого параметра в ячейку ничего не даст. При печати вы увидите пустую ячейку или нераспознанный текст. Для вывода новых, не предусмотренных типовым алгоритмом данных, без вмешательства программиста не обойтись (потребуется разработка расширения или Внешней печатной формы).
Если нам все-таки нужно вывести нестандартные данные, и мы решили использовать Внешнюю печатную форму (ВПФ), встает вопрос: как избежать необходимости заново писать или копировать тысячи строк типового кода для заполнения документа? Рассмотрим методику «постобработки».
Этот метод избавляет от копирования алгоритмов и защищает вашу разработку при будущих обновлениях 1С (например, если изменится законодательство и добавится новая колонка для прослеживаемых товаров). Разберем по шагам, как это реализовать:
СведенияОВнешнейОбработке() в модуле объекта (требование Библиотеки стандартных подсистем — БСП).ТабличныйДокумент.Посмотрим на пример того, как может выглядеть код в модуле вашей внешней печатной формы:
Функция Печать(МассивОбъектов, ОбъектыПечати, СтандартнаяОбработка) Экспорт
// 1. Получаем готовый табличный документ типовыми средствами
ПараметрыПечати = Новый Структура;
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("УПД");
Документы.РеализацияТоваровУслуг.Печать(
МассивОбъектов,
ПараметрыПечати,
КоллекцияПечатныхФорм,
ОбъектыПечати,
ОтладкаИстина
);
ТабДок = КоллекцияПечатныхФорм[0].ТабличныйДокумент;
// 2. Выполняем постобработку: ищем нужную ячейку и меняем текст
// Например, добавим ФИО руководителя подразделения, получив его отдельным запросом
Руководитель = ПолучитьРуководителяПодразделения(МассивОбъектов[0]);
// Ищем область или ячейку по тексту (или по имени области, если она именована)
ЯчейкаПодписи = ТабДок.НайтиТекст("Руководитель организации");
Если ЯчейкаПодписи <> Неопределено Тогда
// Смещаемся в нужную ячейку для подстановки значения
ЯчейкаЗначения = ТабДок.Область(ЯчейкаПодписи.Верх, ЯчейкаПодписи.Лево + 5);
ЯчейкаЗначения.Текст = Руководитель;
КонецЕсли;
Возврат ТабДок;
КонецФункции
Преимущества такого подхода: 95% работы делает актуальный типовой код конфигурации. Если 1С выпустит обновление и изменит форму документа, ваша ВПФ продолжит работать корректно, так как вы лишь вносите финальные штрихи в уже сформированный актуальный ТабличныйДокумент.
Что делать, если пользователь все-таки удалил параметры, конфигурация обновилась, и печать перестала работать? Ситуацию всегда можно спасти без программиста штатными средствами платформы.
Перейдите в раздел Администрирование, затем откройте Печатные формы, отчеты и обработки и перейдите по ссылке Макеты печатных форм. В открывшемся списке найдите проблемный макет. Измененные пользователями макеты подсвечиваются специальной пиктограммой (зеленым карандашом).
Выделите этот макет и нажмите кнопку «Использовать стандартный макет» (или выберите этот пункт в выпадающем меню «Еще»). После этого форма моментально вернется к актуальному «заводскому» состоянию от разработчиков 1С. Ошибка уйдет, документ снова начнет печататься. После этого пользовательские визуальные доработки (логотипы, шрифты, скрытие полей) можно будет аккуратно нанести заново уже поверх нового, актуального макета, соблюдая правила безопасности, которые мы рассмотрели выше.