Почему возникает проблема
Вы сохранили из справочника ДополнительныеОтчетыИОбработки печатную форму в файл на диск, открыли её в конфигураторе, поставили точку останова в экспортной процедуре Печать() модуля объекта внешней обработки и запустили формирование печатной формы из соответствующего документа. Печатная форма сформировалась, но конфигуратор точку останова не поймал. Почему так произошло?
В момент вызова интерактивной команды печати из общего модуля ДополнительныеОтчетыИОбработки вызывается функция ПодключитьВнешнююОбработку(), которая получает из связанного элемента справочника ДополнительныеОтчетыИОбработки двоичные данные внешней обработки и сохраняет их во временное хранилище, после чего производит подключение обработки по этому адресу. В результате у подключенной обработки в используемом имени файла будет записан адрес временного хранилища.
Конфигуратор останавливается в точках останова, только если путь к файлу открытой в нём внешней обработки в точности совпадает с используемым именем файла обработки, работающей в режиме предприятия. Так же условием возможности остановки в точке является доступность пути к используемому имени файла как пользователю, под которым запущен конфигуратор, так и пользователю, под которым работает служба агента сервера.
Исходя из этого становится очевидна причина, почему конфигуратор при отладке не останавливается в точке останова внутри выгруженной внешней печатной формы: путь к ней не совпадает с адресом временного хранилища исполняемой печатной формы.
Что обычно с этим делают
Есть несколько общеизвестных способов, так или иначе позволяющих отладить внешнюю печатную форму. Предлагаю рассмотреть их, прежде чем перейти к сути статьи.
• Создание формы внешней обработки, в которой размещается реквизит под ссылку на объект печати и команда для вызова экспортной процедуры Печать() модуля объекта обработки. Внешняя обработка открывается через файл-открыть, в форме выбирается целевой объект и вызывается команда печати. При этом без проблем происходит попадание в отладку.
Плюсы: Простая реализация.
Минусы: При каждом внесении изменений в обработку требуется открывать её заново. Если вы не отключили у своего пользователя защиту от опасных действий, то при каждом открытии новой версии обработки будет выводиться предупреждение системы безопасности.
• Доработка функции ПодключитьВнешнююОбработку() общего модуля ДополнительныеОтчетыИОбработки. В результате при выполнении интерактивной команды печати внешняя обработка будет подключаться не из адреса временного хранилища, куда записались двоичные данные из справочника, а из файла с заранее известным расположением, который предварительно открыт в конфигураторе с включенной точкой останова.
Плюсы: Очень универсальный способ. Можно переопределять контекст не только печатных форм, но и внешних обработок других видов. Не требуется перезапуск при внесении изменений в отлаживаемую обработку.
Минусы: Нужно включать возможность изменения конфигурации. Неприменимо к базовым конфигурациям.
• То же самое, но в виде расширения.
Плюсы: Те же самые.
Минусы: Неприменимо к базовым конфигурациям. Неприменимо к конфигурациям с режимом совместимости, в котором нет поддержки расширений.
• Подключение к справочнику ДополнительныеОтчетыИОбработки различных вариаций технических печатных форм, которые работают как прокладки для трансляции входящих параметров процедуры Печать() в такую же процедуру отлаживаемой печатной формы, создаваемой из файла с заранее известным расположением.
Плюсы: Не требуется доработка конфигурации. Не требуется перезапуск при внесении изменений в отлаживаемую обработку. Работает в базовых версиях.
Минусы: Путь к отлаживаемому файлу обычно нужно писать прямо в коде технической обработки.
Концепция моей методики отладки
Однажды я подумал, что неплохо было бы найти такое решение, которое не имело бы всех этих недостатков работало полностью автономно. И в результате у меня получилось сделать элегантную реализацию внешней печатной формы с возможностью самоотладки. Во время выполнения интерактивной команды печати обработка выгружает саму себя, запускает саму себя, открывает саму себя в конфигураторе и останавливает отладку прямо в процедуре Печать().
Суть вот в чём. Изначально при выполнении интерактивной команды печати запускается подключенная к справочнику внешняя печатная форма. В начале экспортной процедуры Печать() модуля объекта подключенной обработки во входящих параметрах ищется ссылка на элемент справочника дополнительных отчетов и обработок, из которого она была создана. Далее по этой ссылке получаются двоичные данные файла внешней обработки и сохраняются в файл в заранее указанном каталоге отладки с именем из метаданных обработки. После этого происходит создание новой внешней обработки и в её экспортную процедуру Печать() транслируется контекст текущей обработки. Чтобы созданная из файла обработка не пыталась повторить этот процесс, делается проверка используемого имени файла объекта обработки. Если оно совпадает с именем файла отлаживаемой обработки, значит контекст в данный момент уже переопределен и можно продолжить выполнение процедуры Печать(). Чтобы в процессе выполнения интерактивной команды отлаживаемая обработка сама открылась в конфигураторе, можно создать исключение в попытке и включить функцию остановки по ошибке.
При повторном выполнении интерактивной команды печати повторной выгрузки обработки в файл не произойдет, будет использоваться уже существующий файл из каталога отладки, так что можно вносить в него изменения и сразу же проверять их в работе.
Где хранить путь к каталогу отладки
Я решил это сделать при помощи хранилища настроек пользователя, т.к. это можно очень удобно реализовать в рамках внешней печатной формы. В сведения о внешней обработке я добавил описание дополнительной команды с типом открытие формы, которая при выполнении открывает форму настройки пути к каталогу для отладки обработки. Чтобы эта команда не висела лишний раз в списке команд печати на форме, её можно скрывать в настройках видимости команд подключенной дополнительной обработки. В самой форме присутствует поле для выбора каталога, автоматические индикаторы доступности выбранного каталога на клиенте и на сервере, а так же команды сохранения и очистки значения настройки в хранилище настроек пользователя.
Реализация методики
Без лишних слов - листинг модуля внешней печатной формы:
Листинг формы настроек отладки:
Как это выглядит в работе на примере демо-базы ЗУП 3.1
Что в итоге?
Добавления в обработку всего одной весьма нехитрой функции и одной формы для удобства указания пути к каталогу отладки оказалось достаточно, чтобы закрыть вопрос о том, как интерактивно отлаживать внешнюю печатную форму без использования дополнительных инструментов и различных сомнительных решений. Интересно, раньше такое кто-нибудь предлагал провернуть? Наверняка я не первый, кто использовал такой приём.
А что там с недостатками?
Куда уж без них. Иногда платформа включает оптимизацию и при программном создании внешней обработки из файла, который только что был выгружен из справочника, возвращает подключенную ранее обработку с адресом временного хранилища в используемом имени файла. Такое происходит не всегда, но когда происходит, то приводит к невозможности отладки. Чтобы обойти проблему, достаточно внести любое изменение в выгруженную в каталог отладки обработку и выполнить интерактивную команду печати ещё раз.
Так же нужно учитывать, что работа с файловой системой накладывает ограничение на использовании печатной формы в безопасном режиме.
Заключение
Вот такие вот дела, ребята. Ставьте плюсы, делитесь с коллегами, пишите свои мысли и предложения по развитию такого подхода к отладке.