Разработка и отладка внешних печатных форм (ВПФ) в современных конфигурациях на базе 1С:Предприятие 8.3, таких как Управление торговлей 11, часто вызывает затруднения у разработчиков. Это связано с тем, что код выполняется на сервере, а сами формы регистрируются в справочнике «Дополнительные отчеты и обработки», что затрудняет быструю правку и использование точек останова. В данной статье мы разберем основные методы отладки и рассмотрим альтернативный, более современный подход — использование расширений.
Самый простой вариант, который не требует постоянной перезагрузки файла ВПФ в информационную базу, — это создание внешней обработки для тестирования. Рассмотрим, как это реализовать:
СсылкаНаОбъект с типом документа, который мы печатаем.Печать().Проанализируем пример кода для кнопки «Выполнить» на форме такой заглушки:
&НаКлиенте
Процедура ВыполнитьПечать(Команда)
// Указываем путь к файлу ВПФ, который мы редактируем в конфигураторе
ПутьКФайлу = "C:\MyVPF\ПечатнаяФорма.epf";
ОбъектВПФ = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.СсылкаНаОбъект);
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("МояПечатнаяФорма");
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
// Вызываем процедуру печати напрямую
ОбъектВПФ.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// Выводим результат на экран
Если КоллекцияПечатныхФорм.Количество() > 0 Тогда
КоллекцияПечатныхФорм[0].ТабличныйДокумент.Показать();
КонецЕсли;
КонецПроцедуры
Используя этот метод, мы можем ставить точки останова в модуле объекта файла .epf, и они будут срабатывать при нажатии кнопки в нашей обработке-заглушке.
Поскольку печать в УТ 11 обычно инициируется на сервере, важно убедиться, что ваша среда разработки готова к этому. Выясним основные требования:
-debug. Если вы работаете в файловом режиме, это происходит автоматически, но для клиент-серверного варианта это критично.Многие опытные разработчики рекомендуют отказаться от ВПФ в пользу расширений. Это дает колоссальное преимущество в удобстве отладки, так как код расширения всегда «под рукой» в дереве конфигурации. Разберем, как подменить или дополнить печатную форму через механизм расширений.
Рассмотрим ситуацию, когда нам нужно изменить типовую печатную форму М-11. Мы можем перехватить формирование документа с помощью аннотации &Вместо. Посмотрим на практический пример:
&Вместо("ПечатьМ11")
Функция ИЗО1_ПечатьМ11(МассивОбъектов, ОбъектыПечати)
// Сначала вызываем типовой механизм получения табличного документа
ТабДокумент = ПродолжитьВызов(МассивОбъектов, ОбъектыПечати);
// Получаем ссылку на первый объект для анализа дополнительных сведений
ЗначениеСсылка = ОбъектыПечати[0].Значение;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеСведения.Значение КАК Значение,
| ДополнительныеСведения.Свойство.Имя КАК ИмяСвойства
|ИЗ
| РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Объект = &ЗначениеСсылка";
Запрос.УстановитьПараметр("ЗначениеСсылка", ЗначениеСсылка);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат ТабДокумент;
КонецЕсли;
// Здесь выполняем манипуляции с полученным ТабДокументом (правка ячеек, замена текста)
// Например: ТабДокумент.Область("R1C1").Текст = "Измененный заголовок";
Возврат ТабДокумент;
КонецФункции
Если ваша задача — добавить совершенно новую форму в меню «Печать», расширение справится с этим гораздо элегантнее, чем регистрация внешней обработки. Нам потребуется расширить менеджер объекта (например, документа «Реализация товаров услуг»).
Рассмотрим добавление команды по шагам:
ДобавитьКомандыПечати.
&Вместо("ДобавитьКомандыПечати")
Процедура ИЗО1_ДобавитьКомандыПечати(КомандыПечати)
// Добавляем новую команду в список
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "АктСписанияТН";
КомандаПечати.Представление = НСтр("ru = 'Акт списания ТН'");
КомандаПечати.Обработчик = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати";
КомандаПечати.СписокФорм = "ФормаСписка,ФормаВыбора,ФормаДокумента";
КомандаПечати.Порядок = 10;
ПродолжитьВызов(КомандыПечати);
КонецПроцедуры
Затем перехватываем основную процедуру Печать в менеджере объекта, чтобы система знала, какой код вызывать при нажатии на нашу кнопку:
&Вместо("Печать")
Процедура ИЗО1_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
// Проверяем, нужно ли печатать именно нашу форму
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "АктСписанияТН") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"АктСписанияТН",
"Акт списания ТН",
ИЗО1_ПечатьФормыАктСписанияТН(МассивОбъектов, ОбъектыПечати));
КонецЕсли;
// Обязательно вызываем стандартную обработку для остальных форм
ПродолжитьВызов(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
КонецПроцедуры
И, наконец, пропишем саму функцию формирования документа, которая будет выглядеть идентично модулю ВПФ:
Функция ИЗО1_ПечатьФормыАктСписанияТН(МассивОбъектов, ОбъектыПечати) Экспорт
УстановитьПривилегированныйРежим(Истина);
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.АвтоМасштаб = Истина;
// Здесь идет стандартный алгоритм формирования:
// 1. Получение данных запросом
// 2. Получение макета (Макет = ПолучитьМакет("МойМакет"))
// 3. Вывод областей
Возврат ТабДокумент;
КонецФункции
Проанализируем ситуацию: что же выбрать? Внешние печатные формы хороши тем, что они не меняют структуру базы и могут быть обновлены «на лету» без отключения пользователей. Однако их отладка — это всегда поиск компромиссов между скоростью и удобством.
Расширения предлагают нативный способ разработки. Вы работаете в привычной среде конфигуратора, используете все преимущества глобального поиска и моментальной отладки. Кроме того, расширения позволяют менять поведение типовых форм (например, дописывать данные в стандартный макет), не снимая конфигурацию с поддержки и не переписывая весь код печати целиком. Как показал опыт участников обсуждения, один раз попробовав реализовать печать через расширение, возвращаться к ВПФ уже не хочется.
Важно помнить: при использовании расширений всегда используйте уникальные префиксы для своих процедур и функций (например, ИЗО1_), чтобы избежать конфликтов имен при последующих обновлениях типовой конфигурации от 1С.