Как программно сохранить табличный документ в Excel и настроить автоматическую выгрузку на сервере

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

В процессе разработки в среде «1С:Предприятие» часто возникает задача автоматизировать выгрузку отчетов или печатных форм в формат Excel — для этого подойдёт утилита выгрузки и экспорта данных в XLS/XLSX без Excel. Это может быть как простое сохранение по нажатию кнопки пользователем, так и полностью автономная работа регламентного задания на сервере. В этой статье мы подробно разберем, как реализовать этот функционал, какие методы использовать и как избежать типичных ошибок, связанных с правами доступа и сетевыми путями.

Основной метод сохранения табличного документа

Для программного сохранения любого сформированного табличного документа (например, при экспорте справочников) в 1С используется встроенный метод Записать(). Этот метод универсален и позволяет сохранять данные в различных форматах, включая XLS, XLSX, PDF и другие.

Рассмотрим простейший пример кода, который сохраняет документ по указанному пути (аналогично можно реализовать сохранение табличных частей):


// Создаем или получаем готовый табличный документ
ТабДок = Новый ТабличныйДокумент;
// ... здесь логика заполнения табличного документа ...

// Сохраняем в формате Excel 2007 (XLSX)
ПутьКФайлу = "C:\Reports\MyReport.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Метод Записать() принимает два основных параметра: путь к файлу (строка) и тип файла (системное перечисление ТипФайлаТабличногоДокумента). Если второй параметр не указан, система попытается сохранить файл в формате MXL по умолчанию.

Выбор правильного формата: XLS или XLSX?

Проанализируем ситуацию с выбором формата файла. На платформе 1С доступны несколько вариантов для Excel, и выбор правильного критичен для корректной работы системы:

Поэтому в современном коде мы всегда рекомендуем использовать ТипФайлаТабличногоДокумента.XLSX, а для старых файлов использовать конвертер из xls в xlsx. Для настройки регулярной отправки данных есть модуль автоматического создания и выгрузки отчетов в Excel по расписанию.

Особенности работы в регламентных заданиях на сервере

Часто разработчики сталкиваются с проблемой: код прекрасно работает при ручном запуске («под клиентом»), но выдает ошибку или ничего не делает при выполнении в регламентном задании. Выясним причину этого поведения.

Когда код выполняется на сервере (в контексте &НаСервере или в серверном модуле), система сталкивается с рядом ограничений:

  1. Отсутствие интерактивности: На сервере нельзя вызывать диалоговые окна, предупреждения или вопросы. Метод Записать() должен иметь четко определенный путь.
  2. Права учетной записи: Сервер 1С:Предприятия запускается от имени определенного пользователя ОС (например, USR1CV8). Именно у этого пользователя должны быть права на запись в целевую папку.
  3. Сетевые ресурсы и UNC-пути: Это самая частая причина ошибок. Если вы пытаетесь записать файл на сетевой диск (например, Z:\Reports\), серверная сессия его не увидит, так как сетевые диски подключаются для конкретного пользователя при входе в систему.

Для решения проблемы с сетевыми папками всегда используйте полные UNC-пути. Рассмотрим пример правильного указания пути:


// Неправильно для сервера:
// Путь = "Z:\SharedFolder\report.xlsx"; 

// Правильно для сервера:
Путь = "\\ServerName\SharedFolder\report.xlsx";
ТабДок.Записать(Путь, ТипФайлаТабличногоДокумента.XLSX);

Проверка прав доступа учетной записи сервера

Если запись по UNC-пути все равно не работает, проанализируем настройки безопасности Windows. Пользователь, от имени которого запущен процесс rphost (сервер 1С), должен иметь права «Запись» и «Изменение» на целевую сетевую папку. Если сервер 1С работает под локальной системной учетной записью, он не сможет выйти в сеть. В таком случае необходимо перенастроить запуск службы 1С от имени доменного пользователя.

Интерактивный выбор пути пользователем

Если задача стоит так, чтобы пользователь сам выбирал, куда сохранить файл, нам понадобится объект ДиалогВыбораФайла. Разберем по шагам, как это реализовать в управляемом приложении:


&НаКлиенте
Процедура СохранитьОтчет(Команда)
    
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Заголовок = "Выберите путь для сохранения отчета";
    Диалог.ПолноеИмяФайла = "МойОтчет.xlsx";
    Диалог.Фильтр = "Файлы Excel (*.xlsx)|*.xlsx";
    
    Если Диалог.Выбрать() Тогда
        ВыбранныйПуть = Диалог.ПолноеИмяФайла;
        // Теперь вызываем серверную процедуру для формирования и записи
        ЗаписатьДокументНаСервере(ВыбранныйПуть);
    КонецЕсли;
    
КонецПроцедуры

Важно помнить, что в веб-клиенте прямая запись на диск пользователя через ТабличныйДокумент.Записать() невозможна из-за ограничений безопасности браузера. В этом случае используется механизм временных хранилищ.

Правильная передача файла с сервера клиенту

Рассмотрим наиболее надежную схему: формирование файла на мощном сервере и передача его пользователю. Это позволяет избежать проблем с правами доступа к локальным дискам пользователя со стороны сервера.

Алгоритм действий следующий:

  1. На сервере формируем ТабличныйДокумент.
  2. Сохраняем его во временный файл во временном каталоге сервера с помощью ПолучитьИмяВременногоФайла("xlsx").
  3. Помещаем файл во временное хранилище.
  4. На клиенте получаем файл из хранилища и предлагаем пользователю его скачать.

&НаСервере
Функция СформироватьИСохранитьВоХранилище()
    ТабДок = СформироватьПечатнуюФорму(); // Ваша функция формирования
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
    ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
    
    ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
    АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
    
    УдалитьФайлы(ИмяВременногоФайла); // Очищаем за собой
    Возврат АдресХранилища;
КонецФункции

&НаКлиенте
Процедура КомандаСохранить(Команда)
    Адрес = СформироватьИСохранитьВоХранилище();
    ПолучитьФайл(Адрес, "Отчет.xlsx", Истина);
КонецПроцедуры

Использование метода ПолучитьФайл() — это «золотой стандарт» для работы в современных конфигурациях. Он одинаково хорошо работает в тонком клиенте и в браузере, обеспечивая безопасность и удобство для пользователя.

Заключение

Мы проанализировали основные способы программного взаимодействия с форматом Excel в 1С. Главное правило — всегда учитывать контекст выполнения кода (сервер или клиент) и формат файла (отдавая предпочтение XLSX). При автоматизации выгрузок через регламентные задания критически важно использовать UNC-пути и проверять права доступа системной учетной записи службы 1С — эти задачи решает обработка автовыгрузки и рассылки печатных форм из 1С.

← На главную