При сопровождении типовых конфигураций (например, «1С:Бухгалтерия 7.7», редакция 4.5) нередко возникает задача модификации печатных документов. Если стандартная форма счета-фактуры или накладной берется из ветки Общие таблицы, прямое ее изменение в конфигураторе затронет всех пользователей и усложнит последующие обновления. Оптимальный выход — создать отдельную внешнюю печатную форму (файл с расширением .ert), сохранив при этом типовую форму нетронутой. Разберем по шагам, как правильно скопировать макет, перенести программный код и избежать типичных ошибок при обращении к реквизитам документа.
Проанализируем ключевые отличия между печатью непосредственно из встроенного модуля документа и печатью через внешний отчет:
ДатаДок, Контрагент, ВыбратьСтроки(). Во внешней обработке эти переменные не определены. Обращаться к ним необходимо строго через контекст переданного документа (например, Докум.ДатаДок, Докум.ВыбратьСтроки()).Таб.ИсходнаяТаблица("ИмяОбщейТаблицы"). Если оставить эту строку без изменений во внешней обработке, платформа либо продолжит выводить старую типовую таблицу из конфигуратора, либо выдаст синтаксическую ошибку отсутствия таблицы. Внешний отчет должен обращаться к собственному встроенному макету.Печать(), возникнут ошибки компиляции «Процедура не обнаружена». Все зависимые локальные алгоритмы требуется также перенести в модуль внешней формы (при этом глобальные функции с префиксом гл... переносить не нужно — они доступны глобально).Чтобы не создавать структуру с нуля, возьмем готовую типовую внешнюю печатную форму в качестве шаблона. Перейдем в каталог информационной базы, найдем подпапку ExtForms\PrnForms и скопируем любой существующий файл с расширением .ert под новым именем.
Откроем созданный файл в конфигураторе:
Таблица).Выясним причину несовпадения параметров вызова. Механизм внешних печатных форм в 1С 7.7 передает данные через свойство Форма.Параметр. Чаще всего типовая конфигурация помещает туда объект СписокЗначений, содержащий контекст документа, режим вывода (экран или принтер) и количество экземпляров.
Создадим правильную точку входа в процедуре ПриОткрытии() и свяжем ее с логикой печати:
Процедура Печать(Докум, Устройство = 0, КолвоКопий = 1)
Таб = СоздатьОбъект("Таблица");
// Переопределяем макет: указываем имя таблицы внутри внешнего отчета
Таб.ИсходнаяТаблица("Таблица");
// Формирование секций: к реквизитам обращаемся через Докум.<ИмяРеквизита>
Таб.ВывестиСекцию("Шапка");
Докум.ВыбратьСтроки();
Пока Докум.ПолучитьСтроку() = 1 Цикл
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.ВывестиСекцию("Подвал");
// Управление выводом на печать
Если Устройство = 1 Тогда
Таб.КоличествоЭкземпляров(КолвоКопий);
Таб.Напечатать(0);
Иначе
Таб.ТолькоПросмотр(1);
Таб.Показать("Печать документа", "");
КонецЕсли;
КонецПроцедуры
Процедура ПриОткрытии()
Если ПустоеЗначение(Форма.Параметр) = 0 Тогда
Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений" Тогда
Докум = Форма.Параметр.Получить("Контекст");
Устройство = Форма.Параметр.Получить("Устройство");
КолвоКопий = Форма.Параметр.Получить("КоличествоКопий");
Печать(Докум, Устройство, КолвоКопий);
Иначе
// Вариант прямой передачи контекста
Печать(Форма.Параметр);
КонецЕсли;
// Предотвращаем открытие диалогового окна обработки
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры
Обратим внимание на обязательное использование команд СтатусВозврата(0) и Возврат в событии ПриОткрытии(). Это необходимо для того, чтобы после генерации печатного листа пустой экранный диалог внешней обработки автоматически закрывался.
Разберем, как подключить созданную внешнюю форму к документу, чтобы пользователи могли выбирать ее при печати:
.ert сохранен в каталоге базы по пути ExtForms\PrnForms\..efd. Внесем в него следующие параметры:
Объект="Документ.СчетФактура"
Название=Счет-фактура 1137 (внешняя)
Кнопка=СФ внешняя
PrnForms и сохраним изменения.В результате проделанных шагов в выпадающем меню печати документа появится новая строка. Базовая таблица в конфигурации останется неизменной, а новая печатная форма будет функционировать автономно.