Почему регламентное задание в 1С выполняется не полностью, а вручную — корректно?

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

Разработка и отладка регламентных заданий в 1С — это процесс, который часто преподносит сюрпризы. Типичная ситуация: вы написали сложный механизм загрузки документов, отладили его на клиенте через внешнюю обработку, и всё работает идеально. Однако, как только этот же код запускается планировщиком в виде регламентного задания, начинается "магия" — задание отрабатывает без ошибок, но обрабатывает лишь часть данных (например, 2-3 документа из 10). Рассмотрим подробнее, почему так происходит и как найти "бутылочное горлышко" в серверном коде.

Различие контекстов исполнения: Клиент против Сервера

Первое, что мы должны проанализировать — это разница в окружении. Когда вы запускаете код из обработки, он выполняется в контексте вашего сеанса. Регламентное же задание выполняется в специальном фоновом сеансе на сервере. Разберем по шагам ключевые отличия:

  1. Пользователь и права доступа: В настройках регламентного задания часто забывают указать конкретного пользователя. В этом случае задание может выполняться от имени системного пользователя или под ограниченными правами. Если в системе настроен RLS (Row Level Security), фоновое задание может просто "не видеть" часть документов, которые доступны вам как администратору в ручном режиме.
  2. Интерактивные действия: Если в коде (даже глубоко в типовых процедурах записи объекта) встречается вызов Предупреждение(), Вопрос() или открытие формы, фоновое задание может вести себя непредсказуемо. На сервере нет интерфейса, и любые попытки взаимодействия с пользователем либо вызывают исключение, либо игнорируются, прерывая логику алгоритма.

Проблема доступа к файловой системе и внешним ресурсам

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

Служба сервера 1С (обычно под пользователем usr1cv8) не видит сетевые диски (например, диск Z:), которые подключены в вашем сеансе Windows. Проанализируем пример правильного обращения к файлу:


// Плохо: путь к диску, который видит только текущий пользователь
ПутьКФайлу = "Z:\Exchange\import.xml"; 

// Хорошо: использование UNC-пути, доступного серверу
ПутьКФайлу = "\\ServerName\Exchange\import.xml"; 

Важно убедиться, что у учетной записи, от имени которой запущена служба 1C:Enterprise Server, есть физические права на чтение и запись в целевую папку.

Блокировки данных и транзакции

Одной из наиболее вероятных причин частичного выполнения являются блокировки. Рассмотрим ситуацию: регламентное задание запускается в момент активной работы пользователей. При попытке записать 4-й документ по счету, задание сталкивается с тем, что объект заблокирован другим пользователем или другим фоновым процессом.

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


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

Безопасный режим и ограничения профилей

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

Проверьте настройки в справочнике "Дополнительные отчеты и обработки" или параметры вызова фонового задания. Возможно, стоит временно отключить безопасный режим для проверки гипотезы.

Как эффективно отладить фоновое задание

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

  1. В конфигураторе перейдите в меню Отладка -> Подключение.
  2. Нажмите кнопку Настройка и убедитесь, что установлена галочка Автоматическое подключение: Фоновые задания.
  3. Установите точку останова в самом начале вашей процедуры.
  4. Запустите регламентное задание принудительно из консоли заданий.

Важный нюанс: Отладка на сервере возможна только в том случае, если сервер 1С запущен с параметром -debug. Если отладчик не "цепляется", проверьте параметры запуска службы 1С.

Использование временных логов

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


Процедура ЗаписатьВЛог(ТекстСообщения)
    Текст = Новый ТекстовыйДокумент;
    ПутьКЛогу = "C:\Logs\my_job_log.txt";
    Попытка
        Текст.Прочитать(ПутьКЛогу);
    Исключение
        // Файл не существует
    КонецПопытки;
    Текст.ДобавитьСтроку("" + ТекущаяДата() + ": " + ТекстСообщения);
    Текст.Записать(ПутьКЛогу);
КонецПроцедуры

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

Подводя итог, можно сказать: чудес не бывает. Если 1С выполняет код лишь частично, значит, она либо не видит данные из-за прав/RLS, либо натыкается на блокировку, либо выполнение прерывается из-за неявной ошибки, которая не выводится в интерфейс. Тщательное логгирование и отладка именно серверного контекста — единственный верный путь к решению.

← На главную