При разработке дополнительных отчетов и обработок на базе Библиотеки Стандартных Подсистем (БСП) разработчики нередко сталкиваются с ситуацией: внешняя обработка успешно регистрируется в справочнике Дополнительные отчеты и обработки, регламентное задание или ручной запуск стартуют, однако экспортная процедура ВыполнитьКоманду с вариантом использования ВызовСерверногоМетода просто игнорируется платформой либо завершается без выполнения заложенной логики.
Рассмотрим подробнее, из-за чего возникает эта ошибка, разберем по шагам механизм регистрации обработки в БСП и выясним причину сбоя.
Проанализируем типовую ошибку при заполнении структуры регистрации. Часто разработчик пытается заполнить свойство Вид через обращение к объектам метаданных:
Структура.Вставить("Вид", Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка);
Подсистема БСП при регистрации и выполнении команд сопоставляет вид обработки через строковые идентификаторы (например, с помощью функции ДополнительныеОтчетыИОбработки.ПолучитьВидОбработкиПоСтроковомуПредставлениюВида). При передаче ссылки на элемент перечисления строковое представление может формироваться как синоним ("Дополнительная обработка" с пробелом), тогда как алгоритмы БСП ожидают точное имя вида ("ДополнительнаяОбработка").
Чтобы исправить это поведение, используем один из двух правильных способов:
Структура.Вставить("Вид", ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка());
Структура.Вставить("Вид", "ДополнительнаяОбработка");
Для корректного вызова серверного метода БСП предъявляет строгие требования к процедуре выполнения:
СведенияОВнешнейОбработке и ВыполнитьКоманду обязательно должны располагаться в модуле объекта внешней обработки. Модуль объекта на управляемых формах всегда компилируется на стороне сервера, поэтому директивы компиляции (&НаСервере или &НаКлиенте) указывать не нужно.ВыполнитьКоманду может принимать один или два параметра. Рекомендуется объявлять второй параметр со значением по умолчанию:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды = Неопределено) Экспорт
// Исполняемый код
КонецПроцедуры
Посмотрим на поведение серверных вызовов. Если команда настроена как ВызовСерверногоМетода, то при возникновении исключения (например, при попытке выполнить Число("А")) окно с ошибкой может не отобразиться пользователю так, как это происходит в клиентском коде. Фоновое задание или серверный контекст аварийно завершают транзакцию, а описание ошибки фиксируется в Журнале регистрации или технологическом журнале.
Для проверки факта запуска процедуры рекомендуется использовать явную запись в журнал регистрации:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды = Неопределено) Экспорт
ЗаписьЖурналаРегистрации(
"ВыполнениеВнешнейОбработки",
УровеньЖурналаРегистрации.Информация,
,
,
"Команда " + ИдентификаторКоманды + " успешно запущена."
);
// Основная логика обработки
КонецПроцедуры
Разберем эталонный пример создания функции СведенияОВнешнейОбработке, соответствующий стандартам разработки 1С:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(СтандартныеПодсистемыСервер.ВерсияБиблиотеки());
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ПараметрыРегистрации.Информация = "Обработка для регламентного выполнения задач";
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Превратить букву в число";
НоваяКоманда.Идентификатор = "ПревратитьБукву";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
Дополнительные отчеты и обработки. Сама база данных хранит бинарный файл внутри справочника и не считывает изменения с диска автоматически.ПараметрыРегистрации.БезопасныйРежим = Истина, платформа блокирует обращение к внешним файлам, COM-объектам, запуск сторонних программ и привилегированный режим. Если коду требуются расширенные права, безопасный режим необходимо отключить.