При разработке расширений для современных конфигураций на базе Библиотеки стандартных подсистем (БСП), таких как 1С:Управление торговлей 11, программисты часто сталкиваются с парадоксальной ситуацией. Внешняя обработка идеально работает, если открывать ее через меню Файл — Открыть, но ведет себя некорректно при попытке запустить ее через справочник Дополнительные отчеты и обработки. Форма обработки на мгновение появляется на экране («мигает») и тут же закрывается без каких-либо сообщений об ошибках.
В этой статье мы подробно разберем причины такого поведения, проанализируем внутренние механизмы работы БСП и научимся методам эффективной отладки внешних обработок в среде 1С:Предприятие 8.3.
Разберем, как система понимает, что именно нужно сделать с обработкой. Когда мы регистрируем файл в справочнике Дополнительные отчеты и обработки, БСП обращается к функции СведенияОВнешнейОбработке в модуле объекта. Именно здесь кроется самая частая причина мгновенного закрытия.
В таблице команд обработки есть колонка Использование. Если для команды указано значение ВызовСерверногоМетода, платформа ведет себя следующим образом: она создает экземпляр обработки на сервере, выполняет программный код и тут же уничтожает объект. Форма при этом даже не должна открываться, но из-за особенностей отрисовки интерфейса пользователь может увидеть «вспышку» окна.
Рассмотрим правильный пример заполнения этой функции для случая, когда нам нужно именно интерактивное открытие формы:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = "Просмотр остатков (склад)";
ПараметрыРегистрации.Версия = "1.1";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Открыть панель остатков";
НоваяКоманда.Идентификатор = "ОткрытьФормуОстатков";
// Важнейший момент: указываем ОткрытиеФормы
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
НоваяКоманда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Если вы «выдернули» обработку из состава типовой конфигурации, помните: во встроенных обработках этой функции нет. Вам необходимо добавить ее вручную в Модуль объекта внешней обработки.
Проанализируем ситуацию с точки зрения жизненного цикла формы. Когда форма открывается, последовательно вызываются события ПриСозданииНаСервере и ПриОткрытии. Если в любом из этих событий параметру Отказ присваивается значение Истина, форма закрывается, не успев отобразиться.
Почему это происходит именно при запуске из справочника? БСП при открытии внешней обработки передает в форму структуру Параметры, содержащую специфические данные (например, ДополнительнаяОбработкаСсылка). Если в коде, который вы скопировали из типовой конфигурации, стоит жесткая проверка параметров, она может не найти ожидаемых данных и прервать работу.
Выясним причину, изучив типичный фрагмент кода в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Если обработка запущена через БСП, в параметрах будет ключ "ДополнительнаяОбработкаСсылка"
Если Параметры.Свойство("ДополнительнаяОбработкаСсылка") Тогда
// Логика для работы в качестве внешней обработки
ИначеЕсли Параметры.Свойство("ИмяОбъекта") Тогда
// Логика для встроенной обработки
Иначе
// Если мы не предусмотрели вариант запуска через БСП,
// код может ошибочно установить Отказ
// Отказ = Истина; // Проверьте, нет ли у вас такой строки
КонецЕсли;
КонецПроцедуры
Посмотрим на настройки в самой программе. При подключении внешней обработки в 1С:УТ 11 по умолчанию устанавливается флаг «Безопасный режим». В этом режиме 1С блокирует выполнение многих операций:
Если ваша обработка при открытии пытается прочитать какой-то файл настроек или инициализировать внешнюю компоненту, находясь в безопасном режиме, возникнет исключение. Часто это исключение перехватывается общим модулем БСП, и форма просто закрывается. Попробуйте в карточке регистрации обработки снять галочку «Безопасный режим» и проверить работу снова.
Вопрос «как засунуть обработку в отладчик» является ключевым. Рассмотрим три основных способа, которые помогут найти точное место закрытия формы.
Это самый простой и надежный метод. Создадим новую внешнюю обработку и в модуле ее формы напишем код для программного открытия нашей «проблемной» обработки. Поскольку мы открываем файл напрямую с диска, отладчик будет работать в обычном режиме.
&НаКлиенте
Процедура ВыполнитьОтладку(Команда)
ПутьКФайлу = "C:\ExternalReports\MyProcessing.epf";
// Создаем объект обработки
ОбъектОбработки = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
// Получаем и открываем форму
Форма = ОбъектОбработки.ПолучитьФорму("Форма");
Форма.Открыть();
КонецПроцедуры
Важно: Чтобы отладка сработала на сервере (в процедурах ПриСозданииНаСервере), убедитесь, что ваш сервер «1С:Предприятия» запущен с ключом -debug.
Если нужно отладить именно механизм запуска через справочник Дополнительные отчеты и обработки, выполним следующие шаги:
ДополнительныеОтчетыИОбработки.Менеджер.Создать()).C:\Users\Admin\AppData\Local\Temp\v8_XXXX_XX.epf).Файл — Открыть в Конфигураторе.Если форма закрывается из-за невидимого исключения (Runtime error), мы можем настроить конфигуратор на автоматическую остановку. Перейдем в меню Отладка — Настройка отладки — Остановка по ошибке. Добавим флажок «Останавливаться по ошибке». Теперь, если форма закрывается из-за программного сбоя в момент инициализации, 1С сама подсветит проблемную строку кода.
Проанализировав ситуацию, мы видим, что «мигание» формы чаще всего связано с конфликтом между кодом обработки и механизмами БСП. Проверьте тип команды в СведенияОВнешнейОбработке, убедитесь в отсутствии Отказ = Истина в событиях формы и обязательно используйте один из методов отладки для локализации проблемы. Правильная регистрация и учет специфики работы в безопасном режиме — залог стабильной работы внешних инструментов в 1С:Управление торговлей 11.