При автоматизации рассылки отчетов, прайс-листов и печатных форм разработчики 1С часто сталкиваются с ситуацией, когда вручную в интерактивном режиме файл Excel формируется корректно, а в фоновом режиме регламентного задания выгружается поврежденным. Внешне такой файл может открываться без табличной сетки, с сильно вытянутыми по вертикали строками, нарушенным форматированием ячеек и аномально большим размером.
Разберем детально, почему возникает такое поведение платформы на стороне сервера, как быстро восстановить работоспособность выгрузки и какие настройки конфигурации и кластера серверов 1С помогут предотвратить повторение проблемы.
Проанализируем технические особенности работы сервера 1С, которые приводят к сбою форматирования электронных таблиц:
rphost) работает в изолированной нулевой сессии Windows (Session 0) под учетной записью USR1CV8. Если для этого пользователя не настроен принтер по умолчанию или отсутствуют нужные шрифты, расчет геометрии ячеек сбивается.УдалитьФайлы() до того, как объект отправки почты освободил файловый дескриптор, возникает исключение либо попытка перезаписи занятого файла.Если сбой уже произошел и клиенты получают искаженные файлы, выполним следующие оперативные действия:
Temp системной учетной записи USR1CV8 (обычно расположена по пути C:\Users\USR1CV8\AppData\Local\Temp). Затем перезапустим службу 1C:Enterprise 8.3 Server Agent. При наличии возможности выполним полную перезагрузку операционной системы сервера для сброса графических пулов памяти.USR1CV8 обладает полными правами на чтение и запись в рабочий каталог кластера и системную временную папку.Рассмотрим, как обеспечить платформе корректную среду для вычисления метрик табличных документов на сервере:
USR1CV8.Чтобы избежать постепенного накопления утечек памяти и дескрипторов GDI в процессах rphost, настроим регулярный автоматический перезапуск рабочих процессов:
86400 секунд (один раз в сутки).Разберем правильный алгоритм формирования и сохранения файлов на стороне сервера. Перед вызовом метода Записать() явно укажем параметры отображения документа, обеспечим уникальность имени временного файла и корректное освобождение ресурсов.
Посмотрим на пример правильной организации кода:
// Формируем уникальное имя файла во временном каталоге
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
// Настраиваем свойства табличного документа перед записью
ТабДокумент.ОтображатьСетку = Истина;
ТабДокумент.АвтоМасштаб = Истина;
// Сохраняем в формате XLSX
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
// Освобождаем ссылку на табличный документ для экономии памяти
ТабДокумент = Неопределено;
// Отправляем сформированный файл по почте
Попытка
ОтправитьПрайсЛистПоПочте(ИмяФайла, Получатель);
Исключение
ЗаписьЖурналаРегистрации("РассылкаПрайса", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
// Корректно удаляем временный файл
Попытка
УдалитьФайлы(ИмяФайла);
Исключение
// Файл может временно удерживаться почтовым клиентом или антивирусом
ЗаписьЖурналаРегистрации("УдалениеВременногоФайла", УровеньЖурналаРегистрации.Предупреждение,,,
"Не удалось удалить временный файл: " + ИмяФайла);
КонецПопытки;
Использование метода ПолучитьИмяВременногоФайла() гарантирует изоляцию потоков разных клиентов при параллельной рассылке и исключает конфликты перезаписи файлов со схожими именами.