Разберем одну из самых частых и раздражающих проблем, с которой сталкиваются разработчики при переходе на управляемые формы и Библиотеку Стандартных Подсистем (БСП). Это «пролетание» точек останова при попытке отладить внешнюю печатную форму (ВПФ) или обработку. Вы ставите точку останова в модуле объекта, запускаете печать в режиме «1С:Предприятие», но код выполняется, документ выводится на экран, а конфигуратор даже не думает останавливаться. Выясним причину этой проблемы и подробно рассмотрим самые эффективные способы её решения.
Для начала проанализируем ситуацию и поймем, как БСП работает с внешними объектами. Когда вы регистрируете печатную форму в справочнике Дополнительные отчеты и обработки и нажимаете кнопку печати, система выполняет следующие действия:
Печать.Поскольку в Конфигураторе у вас открыт ваш исходный файл .epf, лежащий на локальном диске, а платформа фактически выполняет другой файл (созданный во временной папке на сервере), Конфигуратор не может сопоставить эти файлы. Как результат — точки останова игнорируются. Чтобы решить эту проблему, нам нужно либо заставить систему выполнять код из нашего файла на диске, либо правильно подготовить среду разработки.
---
Прежде чем приступать к написанию кода отладки, необходимо убедиться, что ваша среда разработки в принципе готова к отладке серверного кода. Выполним обязательные шаги:
Шаг 1. Включение отладки на сервере 1С. Если вы работаете в клиент-серверном варианте (SQL), служба сервера «1С:Предприятия» должна быть запущена с параметром отладки. Проверить это можно в реестре Windows (для службы 1C:Enterprise 8.3 Server Agent в пути запуска должен присутствовать ключ -debug). Без этого ключа никакой серверный код отладить не удастся.
Шаг 2. Настройка автоматического подключения в Конфигураторе. Откроем Конфигуратор, перейдем в меню Отладка -> Подключение. Нажмем кнопку Автоматическое подключение и установим флажки напротив пунктов Клиентские и внешние соединения, а также Фоновые задания. Это критически важно, так как фоновые задания часто используются БСП для генерации печатных форм.
Шаг 3. Отключение защиты от опасных действий. Платформа 1С блокирует выполнение внешнего кода без подтверждения пользователя. Чтобы избежать постоянных предупреждений, откроем свойства вашего пользователя в конфигураторе (меню Администрирование -> Пользователи) и снимем флажок Защита от опасных действий.
---
Рассмотрим подробнее способ, который позволяет отлаживать ВПФ прямо в контексте реального документа, не создавая тестовых форм, и при этом моментально видеть изменения кода без перезагрузки файла в справочник БСП.
Идея метода заключается в том, что в базе регистрируется «обертка», которая перенаправляет выполнение на файл, расположенный у вас на диске.
Выполним следующие шаги:
C:\Debug\MyPrintForm.epf. Именно этот файл мы откроем в Конфигураторе для расстановки точек останова.Печать на следующий вызов:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПутьКФайлу = "C:\Debug\MyPrintForm.epf"; // Путь к вашей копии на диске
ФайлОтладки = ВнешниеОбработки.Create(ПутьКФайлу, Ложь);
ФайлОтладки.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
КонецПроцедуры
Важное примечание: При регистрации оригинального файла-заглушки в справочнике дополнительных обработок убедитесь, что в функции СведенияОВнешнейОбработке указано свойство БезопасныйРежим = Ложь. В противном случае платформа выдаст ошибку нарушения прав при попытке прочитать файл с диска.
Теперь при нажатии кнопки печати в документе система обратится к базе данных, запустит обработку-заглушку, та мгновенно загрузит ваш актуальный код с диска и передаст управление ему. Вы можете менять код в файле на диске, сохранять его и сразу же нажимать «Печать» — изменения применятся мгновенно, а точки останова будут стабильно срабатывать.
---
Этот классический метод отлично подходит, если вы хотите иметь полностью автономную обработку, которую можно открыть через меню Файл -> Открыть в режиме «1С:Предприятие».
Посмотрим на пример реализации тестовой формы внутри самой ВПФ. Создадим основную форму обработки и добавим на нее один реквизит СсылкаНаДокумент с типом ссылки на документ, который мы хотим напечатать, а также кнопку «Сформировать».
Напишем обработчик команды для этой кнопки на клиенте:
&НаКлиенте
Процедура ВыполнитьПечать(Команда)
Если Не ЗначениеЗаполнено(Объект.СсылкаНаДокумент) Тогда
ПоказатьПредупреждение(, "Выберите документ для отладки!");
Возврат;
КонецЕсли;
ОбъектыПечати = Новый СписокЗначений;
ОбъектыПечати.Добавить(Объект.СсылкаНаДокумент);
// Вызываем серверную процедуру для подготовки табличного документа
РезультатПечати = ПолучитьПечатнуюФормуНаСервере(ОбъектыПечати);
// Используем стандартный модуль БСП для открытия формы просмотра
УправлениеПечатьюКлиент.ПечатьДокументов(РезультатПечати.МассивПечатныхФорм, ОбъектыПечати, ЭтаФорма);
КонецПроцедуры
Теперь проанализируем серверную часть. Нам нужно сымитировать поведение БСП, подготовив необходимые таблицы и коллекции параметров:
&НаСервере
Функция ПолучитьПечатнуюФормуНаСервере(ОбъектыПечати)
// Преобразуем реквизит формы обратно в объект внешней обработки
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(ОбъектыПечати[0].Значение);
// Эмулируем коллекции БСП
ИдентификаторКоманды = "ИдентификаторВашейКоманды"; // Как в СведенияОВнешнейОбработке
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ИдентификаторКоманды);
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
// Вызываем процедуру Печать внешней обработки
ОбработкаОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
Результат = Новый Структура;
Результат.Вставить("МассивПечатныхФорм", ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм));
Возврат Результат;
КонецФункции
Этот способ позволяет запустить печатную форму напрямую. Точки останова, расставленные в модуле объекта (внутри процедуры Печать или вспомогательных экспортных функций сервера), будут срабатывать без проблем, так как файл открыт напрямую из файловой системы.
---
Что делать, если печатная форма уже зарегистрирована в рабочей или тестовой базе, у вас нет возможности переписать код вызова, но нужно срочно понять, почему на конкретных данных возникает ошибка внутри кода?
Воспользуемся трюком с вызовом исключения:
Печать() вашей внешней печатной формы в самом начале или перед проблемным участком вставим следующий код:
Попытка
ВызватьИсключение "Начало отладки";
Исключение
// Сюда мы попадем при ошибке
КонецПопытки;
Останавливаться по ошибке.ВызватьИсключение, сгенерирует штатную ошибку, и Конфигуратор тут же перехватит управление. Вы окажетесь в открывшемся временном файле прямо на строчке внутри блока Исключение.Важно: Помните, что изменения, внесенные во временный файл, открытый Конфигуратором в режиме перехвата ошибки, не сохранятся в вашей исходной обработке. Этот метод служит исключительно для исследования значений переменных и поиска логических ошибок «на лету».
---
Современные версии платформы предоставляют разработчикам еще один элегантный способ отладки внешних объектов без изменения их структуры — через расширения конфигурации.
Рассмотрим этот алгоритм по шагам:
Безопасный режим.---
Мы подробно разобрали четыре основных подхода к отладке внешних печатных форм в среде 1С:Предприятие 8.3 БСП. Выбор конкретного метода зависит от ваших текущих задач: