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