Как отлаживать внешние печатные формы в 1С:УТ 11 и использовать расширения для печати

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

Разработка и отладка внешних печатных форм (ВПФ) в современных конфигурациях на базе 1С:Предприятие 8.3, таких как Управление торговлей 11, часто вызывает затруднения у разработчиков. Это связано с тем, что код выполняется на сервере, а сами формы регистрируются в справочнике «Дополнительные отчеты и обработки», что затрудняет быструю правку и использование точек останова. В данной статье мы разберем основные методы отладки и рассмотрим альтернативный, более современный подход — использование расширений.

Метод 1: Отладка через «обработку-заглушку»

Самый простой вариант, который не требует постоянной перезагрузки файла ВПФ в информационную базу, — это создание внешней обработки для тестирования. Рассмотрим, как это реализовать:

  1. Создадим новую внешнюю обработку.
  2. На форму добавим реквизит СсылкаНаОбъект с типом документа, который мы печатаем.
  3. В модуле формы напишем код, который программно создает объект нашей ВПФ из файла на диске и вызывает экспортную процедуру Печать().

Проанализируем пример кода для кнопки «Выполнить» на форме такой заглушки:


&НаКлиенте
Процедура ВыполнитьПечать(Команда)
    // Указываем путь к файлу ВПФ, который мы редактируем в конфигураторе
    ПутьКФайлу = "C:\MyVPF\ПечатнаяФорма.epf";
    ОбъектВПФ = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
    
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(Объект.СсылкаНаОбъект);
    
    КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("МояПечатнаяФорма");
    ОбъектыПечати = Новый СписокЗначений;
    ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
    
    // Вызываем процедуру печати напрямую
    ОбъектВПФ.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
    
    // Выводим результат на экран
    Если КоллекцияПечатныхФорм.Количество() > 0 Тогда
        КоллекцияПечатныхФорм[0].ТабличныйДокумент.Показать();
    КонецЕсли;
КонецПроцедуры

Используя этот метод, мы можем ставить точки останова в модуле объекта файла .epf, и они будут срабатывать при нажатии кнопки в нашей обработке-заглушке.

Метод 2: Настройка серверной отладки

Поскольку печать в УТ 11 обычно инициируется на сервере, важно убедиться, что ваша среда разработки готова к этому. Выясним основные требования:

  1. Параметр запуска сервера: Сервер 1С должен быть запущен с ключом -debug. Если вы работаете в файловом режиме, это происходит автоматически, но для клиент-серверного варианта это критично.
  2. Автоматическое подключение: В Конфигураторе необходимо зайти в меню Отладка — Настройка — Автоматическое подключение и установить флажок Фоновые задания. Это позволит отладчику «подцепиться» к процессу формирования печатной формы, если он выполняется асинхронно.

Метод 3: Перенос печатной формы в расширение

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

Рассмотрим ситуацию, когда нам нужно изменить типовую печатную форму М-11. Мы можем перехватить формирование документа с помощью аннотации &Вместо. Посмотрим на практический пример:


&Вместо("ПечатьМ11")
Функция ИЗО1_ПечатьМ11(МассивОбъектов, ОбъектыПечати)
    // Сначала вызываем типовой механизм получения табличного документа
    ТабДокумент = ПродолжитьВызов(МассивОбъектов, ОбъектыПечати);
    
    // Получаем ссылку на первый объект для анализа дополнительных сведений
    ЗначениеСсылка = ОбъектыПечати[0].Значение;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ДополнительныеСведения.Значение КАК Значение,
        |    ДополнительныеСведения.Свойство.Имя КАК ИмяСвойства
        |ИЗ
        |    РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
        |ГДЕ
        |    ДополнительныеСведения.Объект = &ЗначениеСсылка";
    
    Запрос.УстановитьПараметр("ЗначениеСсылка", ЗначениеСсылка);
    РезультатЗапроса = Запрос.Выполнить();
    
    Если РезультатЗапроса.Пустой() Тогда
        Возврат ТабДокумент;
    КонецЕсли;

    // Здесь выполняем манипуляции с полученным ТабДокументом (правка ячеек, замена текста)
    // Например: ТабДокумент.Область("R1C1").Текст = "Измененный заголовок";

    Возврат ТабДокумент;
КонецФункции

Добавление новой команды печати через расширение

Если ваша задача — добавить совершенно новую форму в меню «Печать», расширение справится с этим гораздо элегантнее, чем регистрация внешней обработки. Нам потребуется расширить менеджер объекта (например, документа «Реализация товаров услуг»).

Рассмотрим добавление команды по шагам:

  1. Добавляем в расширение процедуру ДобавитьКомандыПечати.
  2. Регистрируем свой идентификатор печатной формы.

&Вместо("ДобавитьКомандыПечати")
Процедура ИЗО1_ДобавитьКомандыПечати(КомандыПечати)
    // Добавляем новую команду в список
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "АктСписанияТН";
    КомандаПечати.Представление = НСтр("ru = 'Акт списания ТН'");
    КомандаПечати.Обработчик    = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати";
    КомандаПечати.СписокФорм    = "ФормаСписка,ФормаВыбора,ФормаДокумента"; 
    КомандаПечати.Порядок = 10;

    ПродолжитьВызов(КомандыПечати);
КонецПроцедуры

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


&Вместо("Печать")
Процедура ИЗО1_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
    
    // Проверяем, нужно ли печатать именно нашу форму
    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "АктСписанияТН") Тогда
        
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
            КоллекцияПечатныхФорм,
            "АктСписанияТН",
            "Акт списания ТН",
            ИЗО1_ПечатьФормыАктСписанияТН(МассивОбъектов, ОбъектыПечати));
            
    КонецЕсли;
    
    // Обязательно вызываем стандартную обработку для остальных форм
    ПродолжитьВызов(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
КонецПроцедуры

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


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

Сравнение подходов: ВПФ или Расширение?

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

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

Важно помнить: при использовании расширений всегда используйте уникальные префиксы для своих процедур и функций (например, ИЗО1_), чтобы избежать конфликтов имен при последующих обновлениях типовой конфигурации от 1С.

← На главную