При работе с интеграциями в программах 1С разработчики и администраторы часто сталкиваются со следующей ситуацией: регламентное задание выгрузки данных (например, списка принятых и уволенных сотрудников для Active Directory в формат CSV) периодически создаёт пустой файл. При этом если запустить то же самое задание вручную из консоли администрирования через кнопку "Выполнить сейчас", файл формируется корректно и содержит все нужные данные.
Рассмотрим подробно причины, по которым возникает подобное поведение, разберем возможные технические нюансы работы платформы 1С:Предприятие 8.3 и изучим эффективные способы защиты от перезаписи целевых файлов.
Проанализируем ключевые факторы, приводящие к тому, что автоматически выполняемое фоновое задание очищает или перезаписывает итоговый файл без данных.
C:\Exports\AD.csv файл будет создаваться на том сервере, где физически сработал рабочий процесс 1С. На соседнем сервере каталога может не оказаться, либо служба 1С не будет иметь прав на запись.Закрыть() объекта ЗаписьТекста, данные из буфера памяти не успеют сброситься на диск.Разберем по шагам, как настроить программу и доработать код, чтобы навсегда исключить проблему пустых файлов.
В начале процедуры-обработчика регламентного задания обязательно добавляем проверку, является ли текущая база рабочей. В Библиотеке Стандартных Подсистем (БСП) для этого предусмотрена штатная функция ОбщегоНазначения.ЭтоРабочаяИнформационнаяБаза().
Процедура ВыгрузитьСотрудниковВCSV() Экспорт
Если Не ОбщегоНазначения.ЭтоРабочаяИнформационнаяБаза() Тогда
ЗаписьЖурналаРегистрации("Выгрузка AD",
УровеньЖурналаРегистрации.Предупреждение,
, ,
"Выполнение отменено: текущая информационная база является копией.");
Возврат;
КонецЕсли;
// Далее следует основной код формирования файла...
КонецПроцедуры
Чтобы избежать влияний прав доступа RLS в фоновом сеансе, явно включаем привилегированный режим. Чтобы сторонние службы не считывали полупустой файл во время его записи, формируем данные во временный файл, явно закрываем поток и выполним атомарное перемещение посредством метода ПереместитьФайл().
УстановитьПривилегированныйРежим(Истина);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("csv");
ЗаписьФайла = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8);
// Заполняем файл данными
ЗаписьФайла.ЗаписатьСтроку("Code;Fullname;Status");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Код КАК Код,
| Сотрудники.Наименование КАК ФИО
|ИЗ
| Справочник.Сотрудники КАК Сотрудники";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаДанных = Выборка.Код + ";" + Выборка.ФИО;
ЗаписьФайла.ЗаписатьСтроку(СтрокаДанных);
КонецЦикл;
ЗаписьФайла.Закрыть();
// Атомарная перезапись итогового файла сетевого ресурса
ИмяИтоговогоФайла = "\\server\share\export_ad.csv";
ПереместитьФайл(ИмяВременногоФайла, ИмяИтоговогоФайла);
Для предотвращения запусков из тестовых и технологических копий выполним административные настройки:
DoNotCopy.txt в каталоге базы. При первом запуске копии на вопрос платформы о перемещении базы необходимо отвечать "Это копия информационной базы", чтобы БСП заблокировала работу с внешними ресурсами.export_ad_ZUP_PROD.csv), что позволит сразу увидеть, из какой именно информационной базы приходит пустой файл.