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

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

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

Разбор архитектуры вызова серверного метода

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

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

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

Анализ правильной регистрации обработки

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


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

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

Использование конструктора ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(ВерсияБСП) гарантирует, что структура ПараметрыРегистрации будет содержать все необходимые колонки нужных типов. Это исключает ситуацию, когда команда просто не распознается системой из-за ошибок в описании таблицы значений.

Выясним причину "молчания" обработки: Журнал регистрации

Выясним, почему записи в журнале регистрации иногда "пропадают". В современных конфигурациях (например, Розница 2.2+, УТ 11, БП 3.0) журнал регистрации, открываемый через меню "Администрирование — Обслуживание", часто представляет собой не стандартный список платформы, а форму из состава БСП.

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

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


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

    Попытка
        ПутьКФайлам = "C:\Test";
        МассивФайлов = НайтиФайлы(ПутьКФайлам, "*.txt");
        
        Для Каждого Файл Из МассивФайлов Цикл
            // Логируем обработку каждого файла
            ЗаписьЖурналаРегистрации("ВнешняяОбработка.ОбработкаФайла", 
                УровеньЖурналаРегистрации.Информация, , , 
                "Обработан файл: " + Файл.Имя);
        КонецЦикла;
    Исключение
        // Обязательно логируем ошибки
        ЗаписьЖурналаРегистрации("ВнешняяОбработка.Ошибка", 
            УровеньЖурналаРегистрации.Ошибка, , , 
            ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;
КонецПроцедуры

Режим отладки и синхронное выполнение

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

Проанализируем преимущества этого режима:

Если в интерактивном режиме (с включенной отладкой) всё работает, а в обычном — нет, значит, проблема кроется в окружении фонового задания (права доступа пользователя ОС, под которым работает сервер, доступность сетевых путей или отсутствие нужных файлов в контексте сервера).

Особенности файлового режима и фоновых заданий

Посмотрим на специфику работы в файловой базе. В отличие от клиент-серверного варианта, где фоновыми заданиями управляет менеджер кластера, в файловой базе выполнение заданий "вешается" на один из активных клиентских сеансов.

Выясним возможные причины сбоев в файловом режиме:

  1. Блокировка заданий: Если в параметрах информационной базы установлена галочка "Блокировка регламентных заданий", фоновые процессы не запустятся.
  2. Занятость планировщика: Если единственный активный сеанс занят длительной операцией, очередь фоновых заданий будет стоять.
  3. Права доступа: Если база лежит на сетевом диске, фоновое задание может не иметь прав доступа к локальным папкам (например, C:\Test), так как контекст выполнения может отличаться.

Итоговые рекомендации по исправлению

Для того чтобы ваша внешняя обработка работала стабильно, выполните следующие шаги:

  1. Откажитесь от Сообщить() в серверных методах. Используйте ЗаписьЖурналаРегистрации.
  2. Проверьте права доступа: Убедитесь, что папка с файлами доступна тому пользователю ОС, от имени которого запущен сервер 1С (в клиент-сервере) или текущий пользователь (в файловой базе).
  3. Используйте конструкторы БСП: Всегда формируйте ПараметрыРегистрации через вызов функций общего модуля БСП.
  4. Диагностируйте через стандартный журнал: При поиске следов работы не полагайтесь на упрощенные интерфейсы, используйте прямой просмотр всех событий журнала регистрации без фильтров по сеансу.
  5. Эмулируйте окружение: Если обработка должна работать по расписанию, создайте простую форму для теста, которая будет вызывать тот же серверный код по кнопке. Это поможет отделить ошибки логики от ошибок механизма фоновых заданий.

Соблюдение этих правил позволит вам создавать надежные внешние компоненты, которые будут работать предсказуемо вне зависимости от режима работы базы и настроек интерфейса пользователя.

← На главную