Разработка внешних печатных форм (ВПФ) в среде 1С:Предприятие 8.3 — задача стандартная, но часто сопровождающаяся трудноуловимыми ошибками. Одна из самых неприятных ситуаций: вы написали код, зарегистрировали обработку в справочнике «Дополнительные отчеты и обработки», но при нажатии на кнопку печати ничего не происходит. Программа просто игнорирует экспортную процедуру Печать в модуле формы.
В этой статье мы подробно проанализируем, почему клиентский метод может не срабатывать, разберем типичные ошибки в функции СведенияОВнешнейОбработке и выясним, как механизмы Библиотеки стандартных подсистем (БСП) взаимодействуют с вашим кодом.
Для начала рассмотрим классический пример кода регистрации, который используется в большинстве современных конфигураций. В модуле объекта внешней обработки обязательно должна присутствовать функция СведенияОВнешнейОбработке. Проанализируем пример кода, который часто становится источником проблем:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Справочник.ЛицевыеСчета");
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "История начислений и платежей");
ПараметрыРегистрации.Вставить("Версия", "1.3");
ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ);
ТаблицаКоманд = Новый ТаблицаЗначений;
ТаблицаКоманд.Колонки.Добавить("Представление");
ТаблицаКоманд.Колонки.Добавить("Идентификатор");
ТаблицаКоманд.Колонки.Добавить("Использование");
ТаблицаКоманд.Колонки.Добавить("ПоказыватьОповещение");
ТаблицаКоманд.Колонки.Добавить("Модификатор");
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = "История начислений и платежей";
НоваяКоманда.Идентификатор = "ИсторияНачисленийПлатежей";
НоваяКоманда.Использование = "ВызовКлиентскогоМетода";
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "ПечатьMXL";
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
На первый взгляд всё верно, но дьявол кроется в деталях. Если указано Использование = "ВызовКлиентскогоМетода", система будет искать процедуру Печать именно в модуле основной формы обработки.
Это самая распространенная техническая причина. Даже если у вас создана форма и в её модуле прописана процедура Печать, платформа не сможет её вызвать, если эта форма не назначена основной в свойствах корневого объекта конфигурации (вашей внешней обработки).
Что нужно проверить: откройте вашу обработку в конфигураторе, щелкните правой кнопкой мыши по корню (названию обработки) и проверьте свойство "Основная форма". Если там пусто — вызов клиентского метода не произойдет, так как БСП не знает, экземпляр какой формы ей нужно инициализировать для поиска метода.
Обратим внимание на строку: НоваяКоманда.Модификатор = "ПечатьMXL". В контексте БСП модификатор ПечатьMXL обычно сообщает системе, что серверный метод вернет табличный документ, который нужно сразу вывести на экран в стандартном окне предпросмотра.
Если же вы используете ВызовКлиентскогоМетода, то вы, скорее всего, планируете открыть свою форму или выполнить специфические действия на клиенте (например, работу с файлами). В этом случае использование модификатора ПечатьMXL может конфликтовать с логикой БСП. Попробуйте оставить поле Модификатор пустым, чтобы система не пыталась интерпретировать результат выполнения метода как стандартный печатный документ.
Когда вы загружаете внешнюю печатную форму в базу данных, 1С считывает данные из функции СведенияОВнешнейОбработке и записывает их в справочник ДополнительныеОтчетыИОбработки. Если вы изменили код функции (например, поменяли ВызовСерверногоМетода на ВызовКлиентскогоМетода), недостаточно просто обновить файл обработки.
Рассмотрим правильный алгоритм обновления:
Процедура в модуле формы должна строго соответствовать ожиданиям платформы. Разберем правильное объявление:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
// Ваш код, например, открытие этой же формы для уточнения параметров
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ОбъектыНазначения", ОбъектыНазначения);
ОткрытьФорму("ВнешняяОбработка.ИсторияНачисленийИПлатежей.Форма.ФормаОтчета", ПараметрыФормы);
КонецПроцедуры
Важные моменты:
&НаКлиенте.Экспорт.Печать (кириллицей).Часто программисты пытаются вызвать форму внутри метода Печать коротким способом: ОткрытьФорму(ЭтаФорма) или ОткрытьФорму(ЭтотОбъект). В контексте внешней обработки это может не сработать, так как имя внешней обработки в сеансе назначается динамически (например, ВнешняяОбработка.Имя_Сгенерированное_БСП).
Проанализируем ситуацию: метод Печать вызывается в контексте уже созданной формы, но если вы хотите передать управление форме этой же обработки, лучше использовать полное имя формы или передавать управление через параметры.
Если при регистрации ВПФ вы указали БезопасныйРежим = Истина, 1С накладывает жесткие ограничения на выполнение кода. В частности, могут быть заблокированы некоторые интерактивные действия на клиенте. Если ваша форма использует сложные внешние компоненты или специфические вызовы платформы, попробуйте установить БезопасныйРежим = Ложь (при условии, что вы доверяете коду обработки).
Отладка клиентских методов внешних обработок сложнее серверных, так как обработка сохраняется во временный каталог с динамическим именем. Чтобы «поймать» точку останова, выполните следующие шаги:
.epf непосредственно через меню "Файл" — "Открыть" в пользовательском сеансе. Это заставит систему «запомнить» путь к коду.Подведем итог: если клиентский метод Печать не вызывается, в 90% случаев проблема либо в отсутствии назначенной Основной формы в свойствах обработки, либо в кэшировании старых настроек регистрации в справочнике дополнительных обработок. Проверьте эти два момента в первую очередь, и ваша печатная форма заработает корректно.