Почему во внешней обработке БСП не запускается серверная процедура ВыполнитьКоманду?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке дополнительных отчетов и обработок на базе Библиотеки Стандартных Подсистем (БСП) разработчики нередко сталкиваются с ситуацией: внешняя обработка успешно регистрируется в справочнике Дополнительные отчеты и обработки, регламентное задание или ручной запуск стартуют, однако экспортная процедура ВыполнитьКоманду с вариантом использования ВызовСерверногоМетода просто игнорируется платформой либо завершается без выполнения заложенной логики.

Рассмотрим подробнее, из-за чего возникает эта ошибка, разберем по шагам механизм регистрации обработки в БСП и выясним причину сбоя.

Причина 1. Некорректное указание вида обработки в функции СведенияОВнешнейОбработке

Проанализируем типовую ошибку при заполнении структуры регистрации. Часто разработчик пытается заполнить свойство Вид через обращение к объектам метаданных:


Структура.Вставить("Вид", Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка);

Подсистема БСП при регистрации и выполнении команд сопоставляет вид обработки через строковые идентификаторы (например, с помощью функции ДополнительныеОтчетыИОбработки.ПолучитьВидОбработкиПоСтроковомуПредставлениюВида). При передаче ссылки на элемент перечисления строковое представление может формироваться как синоним ("Дополнительная обработка" с пробелом), тогда как алгоритмы БСП ожидают точное имя вида ("ДополнительнаяОбработка").

Чтобы исправить это поведение, используем один из двух правильных способов:

  1. Использование функций общего модуля БСП (рекомендуемый способ):
    
    Структура.Вставить("Вид", ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка());
    
  2. Прямая передача строкового идентификатора: Структура.Вставить("Вид", "ДополнительнаяОбработка");

Причина 2. Ошибки в сигнатуре и расположении процедуры ВыполнитьКоманду

Для корректного вызова серверного метода БСП предъявляет строгие требования к процедуре выполнения:

  1. Расположение кода: экспортные процедуры СведенияОВнешнейОбработке и ВыполнитьКоманду обязательно должны располагаться в модуле объекта внешней обработки. Модуль объекта на управляемых формах всегда компилируется на стороне сервера, поэтому директивы компиляции (&НаСервере или &НаКлиенте) указывать не нужно.
  2. Количество параметров: в зависимости от используемой версии БСП процедура ВыполнитьКоманду может принимать один или два параметра. Рекомендуется объявлять второй параметр со значением по умолчанию:
    
    Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды = Неопределено) Экспорт
        // Исполняемый код
    КонецПроцедуры
    

Причина 3. Особенности обработки ошибок на сервере

Посмотрим на поведение серверных вызовов. Если команда настроена как ВызовСерверногоМетода, то при возникновении исключения (например, при попытке выполнить Число("А")) окно с ошибкой может не отобразиться пользователю так, как это происходит в клиентском коде. Фоновое задание или серверный контекст аварийно завершают транзакцию, а описание ошибки фиксируется в Журнале регистрации или технологическом журнале.

Для проверки факта запуска процедуры рекомендуется использовать явную запись в журнал регистрации:


Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды = Неопределено) Экспорт
    ЗаписьЖурналаРегистрации(
        "ВыполнениеВнешнейОбработки",
        УровеньЖурналаРегистрации.Информация,
        ,
        ,
        "Команда " + ИдентификаторКоманды + " успешно запущена."
    );
    
    // Основная логика обработки
КонецПроцедуры

Канонический шаблон функции регистрации по стандартам БСП

Разберем эталонный пример создания функции СведенияОВнешнейОбработке, соответствующий стандартам разработки 1С:


Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(СтандартныеПодсистемыСервер.ВерсияБиблиотеки());
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.БезопасныйРежим = Ложь;
    ПараметрыРегистрации.Информация = "Обработка для регламентного выполнения задач";
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Превратить букву в число";
    НоваяКоманда.Идентификатор = "ПревратитьБукву";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

Чек-лист дополнительных проверок при сбоях выполнения

  1. Обновление версии в базе: файл обработки после редактирования кода в конфигураторе нужно повторно загрузить в справочник Дополнительные отчеты и обработки. Сама база данных хранит бинарный файл внутри справочника и не считывает изменения с диска автоматически.
  2. Безопасный режим: если установлен флаг ПараметрыРегистрации.БезопасныйРежим = Истина, платформа блокирует обращение к внешним файлам, COM-объектам, запуск сторонних программ и привилегированный режим. Если коду требуются расширенные права, безопасный режим необходимо отключить.
  3. Пользователь регламентного задания: для команд, выполняемых по расписанию, в настройках регламентного задания в 1С должен быть указан пользователь с полными правами или правами на запуск внешних обработок.
  4. Файловый режим базы: в файловой информационной базе фоновые задания выполняются только тогда, когда запущен сеанс 1С:Предприятия.
← На главную