Почему регламентное задание выгрузки в 1С формирует пустой файл, хотя ручной запуск работает?

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

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

Разберем проблему с расчетом дат и часовыми поясами

Чаще всего корень проблемы кроется в неправильном определении периода выборки документов. В фоновом задании код выполняется на стороне сервера, и функции работы со временем ведут себя иначе, чем в клиентском сеансе.

Посмотрим на пример кода, который часто вызывает проблемы:


ОбработкаОбмена.ДатаНачала = НачалоДня(ТекущаяДата - 24 * 3600);
ОбработкаОбмена.ДатаОкончания = ТекущаяДата;

В этом коде есть сразу несколько уязвимостей:

  1. Использование функции ТекущаяДата(). При ручном запуске эта функция возвращает локальное время компьютера пользователя. В регламентном задании она вернет время сервера. Если сервер баз данных и сервер 1С (особенно если это облако) находятся в другом часовом поясе, время может смещаться. В результате функция НачалоДня() может захватить совершенно другой день, в котором документов еще нет. Рассмотрим правильный подход: в клиент-серверном варианте платформы используйте функцию ТекущаяДатаСеанса(), которая учитывает часовой пояс сеанса.
  2. Арифметика с секундами. Конструкция -24*3600 (вычитание 86400 секунд) может привести к потере данных, если документы созданы ровно на границе суток (00:00:00). Более надежно использовать встроенные функции работы с датами.

Исправим код получения границ периода:


// Правильный вариант получения начала вчерашнего дня
ОбработкаОбмена.ДатаНачала = НачалоДня(ТекущаяДатаСеанса() - 86400); 
// Или более безопасный метод:
ОбработкаОбмена.ДатаНачала = ДобавитьМесяц(НачалоДня(ТекущаяДатаСеанса()), 0) - 86400;
ОбработкаОбмена.ДатаОкончания = ТекущаяДатаСеанса();

Также проанализируем время запуска. Если задание стартует в начале дня (например, в 00:01), а документы выгружаются за "текущий" день, то в базе их просто еще нет. Убедитесь, что логика периода совпадает с реальным графиком ввода документов.

Проверим права доступа и параметры сеанса (RLS)

Вторая по популярности причина — нехватка прав или неинициализированные параметры сеанса в фоне.

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

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

УстановитьПривилегированныйРежим(Истина);

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

Выясним влияние безопасного режима

Если ваша выгрузка реализована в виде внешней обработки и подключена через подсистему БСП "Дополнительные отчеты и обработки", регламентные задания часто запускаются в безопасном режиме (Safe Mode).

Безопасный режим неявно блокирует экспорт данных на диск, выполнение COM-объектов и внешние сетевые запросы. При этом система может не выдавать явную ошибку в журнал регистрации — файл просто создается пустым или процесс обрывается без видимых последствий. Обязательно проверьте настройки регистрации внешней обработки и уберите галочку "Безопасный режим", если требуется запись файлов на серверный диск.

Организуем отладку регламентного задания

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

Навставляйте в ваше задание кучу проверок с выводом сообщений. Делайте это на каждом ключевом этапе:

  1. Там, где вычисляются даты (выведите расчетные границы в журнал регистрации).
  2. Там, где выполняется запрос (запишите в лог количество полученных строк: РезультатЗапроса.Пустой()).
  3. Там, где формируется итоговый файл.

ЗаписьЖурналаРегистрации("МояВыгрузка", УровеньЖурналаРегистрации.Информация, , , 
    "Начало выборки: " + ОбработкаОбмена.ДатаНачала + "; Окончание: " + ОбработкаОбмена.ДатаОкончания);

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

После срабатывания задания по расписанию, откройте Журнал регистрации или Консоль заданий. Вы сразу увидите, на каком именно этапе теряются данные — на уровне построения границ дат или непосредственно при чтении базы данных.

← На главную