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