Почему регламентное задание 1С:ЗУП 3.1 формирует пустой файл выгрузки и как это исправить?

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

При работе с интеграциями в программах 1С разработчики и администраторы часто сталкиваются со следующей ситуацией: регламентное задание выгрузки данных (например, списка принятых и уволенных сотрудников для Active Directory в формат CSV) периодически создаёт пустой файл. При этом если запустить то же самое задание вручную из консоли администрирования через кнопку "Выполнить сейчас", файл формируется корректно и содержит все нужные данные.

Рассмотрим подробно причины, по которым возникает подобное поведение, разберем возможные технические нюансы работы платформы 1С:Предприятие 8.3 и изучим эффективные способы защиты от перезаписи целевых файлов.

Основные причины создания пустого файла

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

  1. Выполнение регламентного задания из копии информационной базы. Это наиболее распространенная причина. Если системные администраторы или тестировщики создают копию рабочей базы (на другом сервере или в файловом варианте) и в ней не блокируется выполнение расписаний, регламентное задание начинает запускаться параллельно из двух баз. В копии базы нет свежих данных о приемах и увольнениях, поэтому алгоритм формирует 0 строк и перезаписывает файл на общем сетевом ресурсе пустым содержимым.
  2. Ограничения RLS и контекст выполнения фонового сеанса. Автоматическое регламентное задание исполняется в фоновом сеансе под системным пользователем без интерфейса. Если алгоритм выборки данных использует ограничения на уровне записей (RLS) или рассчитывает на параметры сеанса (текущий пользователь, текущее подразделение), которые не инициализированы при фоновом старте, запрос возвращает пустой результат. При ручном запуске из сеанса пользователя параметры заполнены, и файл формируется успешно.
  3. Использование локальных путей в кластере серверов. Если кластер состоит из нескольких рабочих серверов, регламентное задание может запускаться на любой из рабочих машин. При использовании локального пути вида C:\Exports\AD.csv файл будет создаваться на том сервере, где физически сработал рабочий процесс 1С. На соседнем сервере каталога может не оказаться, либо служба 1С не будет иметь прав на запись.
  4. Блокировки файла внешними системами и незавершенная буферизация. Если скрипт чтения Active Directory или антивирус открывает файл в момент формирования, платформа 1С может очистить целевой файл, но заблокироваться при попытке внести строки. Если при записи не вызван метод Закрыть() объекта ЗаписьТекста, данные из буфера памяти не успеют сброситься на диск.

Способы решения и защита от выгрузки из копий базы

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

1. Проверка рабочей базы средствами БСП

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


Процедура ВыгрузитьСотрудниковВCSV() Экспорт

    Если Не ОбщегоНазначения.ЭтоРабочаяИнформационнаяБаза() Тогда
        ЗаписьЖурналаРегистрации("Выгрузка AD", 
            УровеньЖурналаРегистрации.Предупреждение, 
            , , 
            "Выполнение отменено: текущая информационная база является копией.");
        Возврат;
    КонецЕсли;

    // Далее следует основной код формирования файла...

КонецПроцедуры

2. Использование привилегированного режима и безопасного сохранения

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


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

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("csv");
ЗаписьФайла = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8);

// Заполняем файл данными
ЗаписьФайла.ЗаписатьСтроку("Code;Fullname;Status");

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Сотрудники.Код КАК Код,
    |	Сотрудники.Наименование КАК ФИО
    |ИЗ
    |	Справочник.Сотрудники КАК Сотрудники";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    СтрокаДанных = Выборка.Код + ";" + Выборка.ФИО;
    ЗаписьФайла.ЗаписатьСтроку(СтрокаДанных);
КонецЦикл;

ЗаписьФайла.Закрыть();

// Атомарная перезапись итогового файла сетевого ресурса
ИмяИтоговогоФайла = "\\server\share\export_ad.csv";
ПереместитьФайл(ИмяВременногоФайла, ИмяИтоговогоФайла);

3. Отключение регламентных заданий в свойствах базы и на сервере

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

  1. На сервере 1С:Предприятия: В консоли кластера серверов открываем свойства копии базы и устанавливаем флаг "Блокировка регламентных заданий включена".
  2. В файловых базах: При копировании файловой базы удаляем или не создаем файл DoNotCopy.txt в каталоге базы. При первом запуске копии на вопрос платформы о перемещении базы необходимо отвечать "Это копия информационной базы", чтобы БСП заблокировала работу с внешними ресурсами.
  3. Дифференциация имен файлов: На время отладки в код формирования файла можно включить вывод имени базы или сервера (например, export_ad_ZUP_PROD.csv), что позволит сразу увидеть, из какой именно информационной базы приходит пустой файл.
← На главную