Как исправить ошибку «Переменная не определена (ПараметрыПечати)» во внешней печатной форме?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке внешних печатных форм (ВПФ) часто возникает задача адаптировать код из уже существующей внутренней, типовой печатной формы. Это кажется простым решением: скопировать код, добавить необходимые процедуры для регистрации ВПФ и готово. Однако на этом пути часто встречается ошибка «Переменная не определена», указывающая на ПараметрыПечати. Давайте разберем, почему она возникает и как ее правильно исправить.

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

Выясняем причину: разница между внутренним и внешним вызовом

Ключевое отличие заключается в механизме вызова печатной формы. Когда вы печатаете документ из стандартного интерфейса, система сначала выполняет код «вокруг» самой процедуры печати. Этот код находится в общих модулях (например, УправлениеПечатью) и занимается подготовкой. Именно там формируется и заполняется структура ПараметрыПечати, которая затем передается в процедуру формирования табличного документа.

Внешние печатные формы, в свою очередь, работают по строгому стандарту (интерфейсу), который требует наличия экспортной процедуры Печать с определенной сигнатурой:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // ... тело процедуры
КонецПроцедуры

Как мы видим, в списке параметров этой процедуры нет ПараметрыПечати. Система просто не передает ее сюда. Поэтому, когда скопированный вами код пытается обратиться к этой переменной, он ее не находит, что и вызывает ошибку.

Посмотрим на типичный проблемный код, который приводит к ошибке:


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

Внутри функции ПечатьЗадания происходит уже непосредственное использование этой переменной, что и ломает выполнение:


Функция ПечатьЗадания(МассивОбъектов, ОбъектыПечати, ПараметрыПечати)
    // ...
    // Вот здесь происходит обращение к свойствам несуществующей структуры
    ВыводитьГрадацииКачества    = ПараметрыПечати.ВыводитьГрадацииКачества;
    ВыводитьРезультатыПересчета = ПараметрыПечати.ВыводитьРезультатыПересчета;
    // ...
КонецФункции

Решение: инициализируем параметры вручную

Раз система не передает нам готовую структуру ПараметрыПечати, мы должны создать ее сами внутри процедуры Печать, перед тем как передавать ее дальше. Разберем этот процесс по шагам.

  1. Анализируем использование параметров.

    Первым делом нужно понять, какие именно параметры (ключи структуры) используются в дальнейшем коде. Для этого внимательно изучим тело функции, куда передается эта переменная (в нашем примере это ПечатьЗадания). Нас интересуют все строки вида ПараметрыПечати.ИмяСвойства.

    В рассматриваемом коде мы находим такие обращения:

    • ПараметрыПечати.ВыводитьГрадацииКачества
    • ПараметрыПечати.ВыводитьРезультатыПересчета

    Еще одно обращение есть в другой функции, ПолучитьДанныеДляПечатнойФормыОтборРазмещениеТоваров:

    • ПараметрыПечати.Свойство("БезДопКолонки")
    • ПараметрыПечати.ТипЗадания

    Теперь мы знаем, какие ключи должна содержать наша структура.

  2. Создаем и заполняем структуру.

    Теперь вернемся в процедуру Печать и добавим код, который создаст и заполнит структуру ПараметрыПечати нужными нам ключами и значениями. Значения можно задать по умолчанию (например, Ложь) или исходя из требований заказчика. Если какие-то параметры должны меняться пользователем, это потребует создания формы настроек, но для простого исправления ошибки достаточно "захардкодить" значения.

    Исправленный код процедуры Печать будет выглядеть так:

    
    Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
        // ШАГ 1: Создаем переменную "ПараметрыПечати" как новую структуру.
        ПараметрыПечати = Новый Структура;
    
        // ШАГ 2: Заполняем структуру необходимыми ключами и значениями.
        // Эти значения можно установить по умолчанию или согласовать с клиентом.
        ПараметрыПечати.Вставить("ВыводитьГрадацииКачества", Ложь);
        ПараметрыПечати.Вставить("ВыводитьРезультатыПересчета", Истина);
        ПараметрыПечати.Вставить("БезДопКолонки", Ложь);
        ПараметрыПечати.Вставить("ТипЗадания", "ЗаданиеНаПересчет"); // Пример значения
    
        // ШАГ 3: Теперь переменная определена, и ее можно безопасно передавать дальше.
        ТабДок = ПечатьЗадания(МассивОбъектов, ОбъектыПечати, ПараметрыПечати);
        
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "Основная", Метаданные().Синоним, ТабДок);
             
    КонецПроцедуры
    

После этих изменений переменная ПараметрыПечати будет корректно определена в контексте процедуры Печать, и дальнейший вызов функции ПечатьЗадания выполнится без ошибок.

Важный момент: не пытайтесь изменить сигнатуру процедуры Печать, добавив туда параметр ПараметрыПечати. Это нарушит стандартный интерфейс ВПФ, и система просто перестанет "видеть" и вызывать вашу печатную форму.

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

← На главную