Как в 1С 7.7 вынести печатную форму из общих таблиц во внешнюю обработку?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

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

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

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

Шаг 1. Подготовка каркаса внешней печатной формы

Чтобы не создавать структуру с нуля, возьмем готовую типовую внешнюю печатную форму в качестве шаблона. Перейдем в каталог информационной базы, найдем подпапку ExtForms\PrnForms и скопируем любой существующий файл с расширением .ert под новым именем.

Откроем созданный файл в конфигураторе:

  1. Перейдем в редактор таблиц обработки и заменим имеющийся там макет на нужный, скопировав секции из ветки Общие таблицы конфигурации.
  2. Присвоим внедренной таблице понятное имя (например, Таблица).

Шаг 2. Адаптация точки входа и модуля формирования

Выясним причину несовпадения параметров вызова. Механизм внешних печатных форм в 1С 7.7 передает данные через свойство Форма.Параметр. Чаще всего типовая конфигурация помещает туда объект СписокЗначений, содержащий контекст документа, режим вывода (экран или принтер) и количество экземпляров.

Создадим правильную точку входа в процедуре ПриОткрытии() и свяжем ее с логикой печати:


Процедура Печать(Докум, Устройство = 0, КолвоКопий = 1)
    Таб = СоздатьОбъект("Таблица");
    
    // Переопределяем макет: указываем имя таблицы внутри внешнего отчета
    Таб.ИсходнаяТаблица("Таблица"); 
    
    // Формирование секций: к реквизитам обращаемся через Докум.<ИмяРеквизита>
    Таб.ВывестиСекцию("Шапка");
    
    Докум.ВыбратьСтроки();
    Пока Докум.ПолучитьСтроку() = 1 Цикл
        Таб.ВывестиСекцию("Строка");
    КонецЦикла;
    
    Таб.ВывестиСекцию("Подвал");
    
    // Управление выводом на печать
    Если Устройство = 1 Тогда
        Таб.КоличествоЭкземпляров(КолвоКопий);
        Таб.Напечатать(0);
    Иначе
        Таб.ТолькоПросмотр(1);
        Таб.Показать("Печать документа", "");
    КонецЕсли;
КонецПроцедуры

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

Обратим внимание на обязательное использование команд СтатусВозврата(0) и Возврат в событии ПриОткрытии(). Это необходимо для того, чтобы после генерации печатного листа пустой экранный диалог внешней обработки автоматически закрывался.

Шаг 3. Регистрация новой формы в информационной базе

Разберем, как подключить созданную внешнюю форму к документу, чтобы пользователи могли выбирать ее при печати:

  1. Убедимся, что файл с расширением .ert сохранен в каталоге базы по пути ExtForms\PrnForms\.
  2. Для автоматического распознавания формы создадим рядом текстовый файл с аналогичным именем и расширением .efd. Внесем в него следующие параметры:
    
    Объект="Документ.СчетФактура"
    Название=Счет-фактура 1137 (внешняя)
    Кнопка=СФ внешняя
    
  3. Запустим программу в режиме «1С:Предприятие». Перейдем в главное меню: Сервис → Регистрация внешних печатных форм.
  4. Выберем целевой вид документа, нажмем кнопку добавления, укажем наш файл из папки PrnForms и сохраним изменения.

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

← На главную