В процессе разработки в среде «1С:Предприятие» часто возникает задача автоматизировать выгрузку отчетов или печатных форм в формат Excel — для этого подойдёт утилита выгрузки и экспорта данных в XLS/XLSX без Excel. Это может быть как простое сохранение по нажатию кнопки пользователем, так и полностью автономная работа регламентного задания на сервере. В этой статье мы подробно разберем, как реализовать этот функционал, какие методы использовать и как избежать типичных ошибок, связанных с правами доступа и сетевыми путями.
Для программного сохранения любого сформированного табличного документа (например, при экспорте справочников) в 1С используется встроенный метод Записать(). Этот метод универсален и позволяет сохранять данные в различных форматах, включая XLS, XLSX, PDF и другие.
Рассмотрим простейший пример кода, который сохраняет документ по указанному пути (аналогично можно реализовать сохранение табличных частей):
// Создаем или получаем готовый табличный документ
ТабДок = Новый ТабличныйДокумент;
// ... здесь логика заполнения табличного документа ...
// Сохраняем в формате Excel 2007 (XLSX)
ПутьКФайлу = "C:\Reports\MyReport.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Метод Записать() принимает два основных параметра: путь к файлу (строка) и тип файла (системное перечисление ТипФайлаТабличногоДокумента). Если второй параметр не указан, система попытается сохранить файл в формате MXL по умолчанию.
Проанализируем ситуацию с выбором формата файла. На платформе 1С доступны несколько вариантов для Excel, и выбор правильного критичен для корректной работы системы:
XLS95 не поддерживается платформой.Поэтому в современном коде мы всегда рекомендуем использовать ТипФайлаТабличногоДокумента.XLSX, а для старых файлов использовать конвертер из xls в xlsx. Для настройки регулярной отправки данных есть модуль автоматического создания и выгрузки отчетов в Excel по расписанию.
Часто разработчики сталкиваются с проблемой: код прекрасно работает при ручном запуске («под клиентом»), но выдает ошибку или ничего не делает при выполнении в регламентном задании. Выясним причину этого поведения.
Когда код выполняется на сервере (в контексте &НаСервере или в серверном модуле), система сталкивается с рядом ограничений:
Записать() должен иметь четко определенный путь.USR1CV8). Именно у этого пользователя должны быть права на запись в целевую папку.Z:\Reports\), серверная сессия его не увидит, так как сетевые диски подключаются для конкретного пользователя при входе в систему.Для решения проблемы с сетевыми папками всегда используйте полные UNC-пути. Рассмотрим пример правильного указания пути:
// Неправильно для сервера:
// Путь = "Z:\SharedFolder\report.xlsx";
// Правильно для сервера:
Путь = "\\ServerName\SharedFolder\report.xlsx";
ТабДок.Записать(Путь, ТипФайлаТабличногоДокумента.XLSX);
Если запись по UNC-пути все равно не работает, проанализируем настройки безопасности Windows. Пользователь, от имени которого запущен процесс rphost (сервер 1С), должен иметь права «Запись» и «Изменение» на целевую сетевую папку. Если сервер 1С работает под локальной системной учетной записью, он не сможет выйти в сеть. В таком случае необходимо перенастроить запуск службы 1С от имени доменного пользователя.
Если задача стоит так, чтобы пользователь сам выбирал, куда сохранить файл, нам понадобится объект ДиалогВыбораФайла. Разберем по шагам, как это реализовать в управляемом приложении:
&НаКлиенте
Процедура СохранитьОтчет(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Выберите путь для сохранения отчета";
Диалог.ПолноеИмяФайла = "МойОтчет.xlsx";
Диалог.Фильтр = "Файлы Excel (*.xlsx)|*.xlsx";
Если Диалог.Выбрать() Тогда
ВыбранныйПуть = Диалог.ПолноеИмяФайла;
// Теперь вызываем серверную процедуру для формирования и записи
ЗаписатьДокументНаСервере(ВыбранныйПуть);
КонецЕсли;
КонецПроцедуры
Важно помнить, что в веб-клиенте прямая запись на диск пользователя через ТабличныйДокумент.Записать() невозможна из-за ограничений безопасности браузера. В этом случае используется механизм временных хранилищ.
Рассмотрим наиболее надежную схему: формирование файла на мощном сервере и передача его пользователю. Это позволяет избежать проблем с правами доступа к локальным дискам пользователя со стороны сервера.
Алгоритм действий следующий:
ТабличныйДокумент.ПолучитьИмяВременногоФайла("xlsx").
&НаСервере
Функция СформироватьИСохранитьВоХранилище()
ТабДок = СформироватьПечатнуюФорму(); // Ваша функция формирования
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
УдалитьФайлы(ИмяВременногоФайла); // Очищаем за собой
Возврат АдресХранилища;
КонецФункции
&НаКлиенте
Процедура КомандаСохранить(Команда)
Адрес = СформироватьИСохранитьВоХранилище();
ПолучитьФайл(Адрес, "Отчет.xlsx", Истина);
КонецПроцедуры
Использование метода ПолучитьФайл() — это «золотой стандарт» для работы в современных конфигурациях. Он одинаково хорошо работает в тонком клиенте и в браузере, обеспечивая безопасность и удобство для пользователя.
Мы проанализировали основные способы программного взаимодействия с форматом Excel в 1С. Главное правило — всегда учитывать контекст выполнения кода (сервер или клиент) и формат файла (отдавая предпочтение XLSX). При автоматизации выгрузок через регламентные задания критически важно использовать UNC-пути и проверять права доступа системной учетной записи службы 1С — эти задачи решает обработка автовыгрузки и рассылки печатных форм из 1С.