Многие разработчики 1С сталкиваются с загадочной ситуацией: при запуске обработки выгрузки документов вручную всё отрабатывает идеально, файл наполняется нужными данными. Но стоит настроить выполнение этой же обработки через регламентное задание по расписанию, как в журнале регистрации мы видим сообщение об успешном завершении, а сам файл выгрузки оказывается абсолютно пустым. Давайте проанализируем эту ситуацию и разберем по шагам все возможные причины такого поведения системы.
Чаще всего корень проблемы кроется в неправильном определении периода выборки документов. В фоновом задании код выполняется на стороне сервера, и функции работы со временем ведут себя иначе, чем в клиентском сеансе.
Посмотрим на пример кода, который часто вызывает проблемы:
ОбработкаОбмена.ДатаНачала = НачалоДня(ТекущаяДата - 24 * 3600);
ОбработкаОбмена.ДатаОкончания = ТекущаяДата;
В этом коде есть сразу несколько уязвимостей:
ТекущаяДата(). При ручном запуске эта функция возвращает локальное время компьютера пользователя. В регламентном задании она вернет время сервера. Если сервер баз данных и сервер 1С (особенно если это облако) находятся в другом часовом поясе, время может смещаться. В результате функция НачалоДня() может захватить совершенно другой день, в котором документов еще нет. Рассмотрим правильный подход: в клиент-серверном варианте платформы используйте функцию ТекущаяДатаСеанса(), которая учитывает часовой пояс сеанса.-24*3600 (вычитание 86400 секунд) может привести к потере данных, если документы созданы ровно на границе суток (00:00:00). Более надежно использовать встроенные функции работы с датами.Исправим код получения границ периода:
// Правильный вариант получения начала вчерашнего дня
ОбработкаОбмена.ДатаНачала = НачалоДня(ТекущаяДатаСеанса() - 86400);
// Или более безопасный метод:
ОбработкаОбмена.ДатаНачала = ДобавитьМесяц(НачалоДня(ТекущаяДатаСеанса()), 0) - 86400;
ОбработкаОбмена.ДатаОкончания = ТекущаяДатаСеанса();
Также проанализируем время запуска. Если задание стартует в начале дня (например, в 00:01), а документы выгружаются за "текущий" день, то в базе их просто еще нет. Убедитесь, что логика периода совпадает с реальным графиком ввода документов.
Вторая по популярности причина — нехватка прав или неинициализированные параметры сеанса в фоне.
При ручном запуске вы работаете в полноценном сеансе: у пользователя заполнена организация по умолчанию, инициализированы все параметры для работы RLS (ограничения прав на уровне записей). Регламентное задание стартует в "чистом" фоновом сеансе. Даже если у пользователя, под которым запускается задание, стоят полные права, запросы с использованием виртуальных таблиц могут возвращать пустой результат из-за незаполненных параметров сеанса.
Для проверки этой гипотезы программно отключим проверку прав на время выполнения критичного участка кода. Добавим в начало исполняемой процедуры следующую команду:
УстановитьПривилегированныйРежим(Истина);
Если после включения привилегированного режима документы начнут успешно выгружаться, значит проблема 100% кроется в ограничениях прав (RLS) или нехватке прав служебного пользователя на смежные регистры, участвующие в запросе.
Если ваша выгрузка реализована в виде внешней обработки и подключена через подсистему БСП "Дополнительные отчеты и обработки", регламентные задания часто запускаются в безопасном режиме (Safe Mode).
Безопасный режим неявно блокирует экспорт данных на диск, выполнение COM-объектов и внешние сетевые запросы. При этом система может не выдавать явную ошибку в журнал регистрации — файл просто создается пустым или процесс обрывается без видимых последствий. Обязательно проверьте настройки регистрации внешней обработки и уберите галочку "Безопасный режим", если требуется запись файлов на серверный диск.
Гадать, не видя базы, можно бесконечно. Поэтому организуем правильную систему логирования внутри самого задания.
Навставляйте в ваше задание кучу проверок с выводом сообщений. Делайте это на каждом ключевом этапе:
РезультатЗапроса.Пустой()).
ЗаписьЖурналаРегистрации("МояВыгрузка", УровеньЖурналаРегистрации.Информация, , ,
"Начало выборки: " + ОбработкаОбмена.ДатаНачала + "; Окончание: " + ОбработкаОбмена.ДатаОкончания);
Выборка = РезультатЗапроса.Выбрать();
ЗаписьЖурналаРегистрации("МояВыгрузка", УровеньЖурналаРегистрации.Информация, , ,
"Найдено документов к выгрузке: " + Выборка.Количество());
После срабатывания задания по расписанию, откройте Журнал регистрации или Консоль заданий. Вы сразу увидите, на каком именно этапе теряются данные — на уровне построения границ дат или непосредственно при чтении базы данных.