Почему обработка не проводит документы при запуске по расписанию в фоновом задании?

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

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

В этой статье мы подробно разберем, почему возникает такое различие в поведении интерактивного и фонового режимов запуска, проанализируем ошибку недостаточного количества параметров фонового задания и рассмотрим механизмы сбора «скрытых» ошибок проведения на сервере. Для контроля результатов работы подобных алгоритмов и поиска расхождений после записи данных применяется автоматическая сверка проводок между базами 1С.

Причина 1. Ошибка «Недостаточно фактических параметров для метода фонового задания»

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

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

Выясним, какими должны быть параметры для разных видов обработок. Рассмотрим стандартный шаблон процедуры ВыполнитьКоманду в модуле объекта внешней обработки:


Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения = Неопределено) Экспорт
    // Здесь располагается основной код запуска логики обработки
КонецПроцедуры

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

Причина 2. «Тихий отказ» при записи или проведении документа

Вторая и самая частая проблема — это когда фоновое задание выполняется, метод запускается, но при попытке вызвать метод Записать(РежимЗаписиДокумента.Проведение) система возвращает ошибку, не раскрывая деталей. При интерактивном запуске пользователь видит на экране понятные сообщения: «Не заполнена статья движения денежных средств», «Недостаточно товара на складе» или «Пересечение периода». В фоновом режиме этих окон нет, и платформа просто устанавливает флаг Отказ = Истина в обработчиках проведения.

В результате транзакция откатывается, а стандартный метод ОписаниеОшибки() в блоке Попытка...Исключение выдает неинформативное сообщение: «Ошибка при вызове метода контекста (Записать): Не удалось записать документ!».

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


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

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

Причина 3. Интерактивный код в серверных обработчиках документа

Фоновое задание всегда выполняется на сервере в неинтерактивном режиме. Если в модуле проведения создаваемого документа (или в подписках на события ПередЗаписью, ПриЗаписи, ОбработкаПроведения) присутствует код, который пытается как-то взаимодействовать с пользователем, транзакция прервется с ошибкой.

Проанализируем примеры запрещенных в фоновом режиме вызовов:

Если в вашей конфигурации есть кастомные доработки в модулях документов, убедитесь, что все интерактивные вызовы обернуты в директивы компиляции или условия проверки режима выполнения:


#Если Клиент Тогда
    // Этот код выполнится только при работе пользователя в интерфейсе
    ПоказатьПредупреждение(, "Документ успешно обработан!");
#КонецЕсли

Причина 4. Ограничения безопасного режима в БСП

Когда вы регистрируете внешнюю обработку в справочнике «Дополнительные отчеты и обработки», система по умолчанию включает для нее Безопасный режим выполнения.

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

Если код проведения вашего документа требует привилегированных прав (например, для изменения регистров, к которым у обычного пользователя нет доступа) или обращается к внешним ресурсам, то в безопасном режиме проведение завершится ошибкой.

Как решить проблему:

  1. Откройте модуль объекта внешней обработки в конфигураторе.
  2. Найдите функцию СведенияОВнешнейОбработке().
  3. Установите свойство БезопасныйРежим в значение Ложь:

ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);

После изменения кода обязательно обновите файл обработки в справочнике «Дополнительные отчеты и обработки» в режиме «1С:Предприятие», чтобы новые настройки безопасности применились в базе данных.

Причина 5. Пользователь сеанса регламентного задания и RLS

При ручном запуске обработка выполняется под учетной записью текущего авторизованного пользователя. У этого пользователя есть определенный набор прав и ролей, а также настроенные правила ограничения доступа на уровне записей (RLS).

При запуске по расписанию регламентное задание может выполняться от имени специального системного пользователя или под учетной записью, у которой недостаточно прав для создания и проведения конкретного вида документов (например, Приходного кассового ордера).

Выясним, как назначить правильного пользователя для выполнения регламентного задания:

  1. Если вы используете БСП, перейдите в раздел Администрирование — Дополнительные отчеты и обработки.
  2. Найдите вашу обработку и откройте настройки расписания команды.
  3. В поле Выполнять под пользователем выберите учетную запись, которая обладает полными правами на проведение создаваемых документов и у которой корректно заполнены все необходимые параметры сеанса (например, «Физическое лицо», «Подразделение» или «Основной склад», если они используются в коде проведения).

Резюме: чеклист для стабильной работы обработки в фоне

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

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