При работе с системой 1С:Предприятие 8.3 пользователи и разработчики часто сталкиваются с необходимостью выгрузки данных в популярный формат Excel (XLSX), а иногда и с обратной задачей — универсальной загрузкой справочников из Excel. Однако, если Microsoft Office не установлен на сервере или клиентской машине, стандартные методы работы с COM-объектами MS Excel становятся недоступны, что приводит к ошибкам. В этом материале мы подробно разберем, как решить эту задачу, используя различные подходы, включая встроенные возможности платформы 1С, альтернативные форматы и сторонние инструменты.
Основная проблема заключается в том, что метод ТабличныйДокумент.Записать() при попытке сохранить в формате XLSX по умолчанию пытается использовать установленный Microsoft Office. Если он отсутствует, вы получите ошибку. Наша задача — найти способы обойти это ограничение, особенно в серверных средах, где установка MS Office часто невозможна или нежелательна.
Начиная с определенных версий платформы 1С:Предприятие 8.3 (обычно с версии 8.3.10-8.3.12, точные версии следует проверять по документации к платформе), разработчики внедрили собственный механизм для генерации файлов XLSX, который не требует наличия установленного Microsoft Office. Этот функционал наиболее удобно использовать через Библиотеку стандартных подсистем (БСП). Для быстрого освоения этих инструментов разработчикам может пригодиться справочник по методам БСП с примерами использования.
УниверсальныеМеханизмы.СохранитьТабличныйДокументВФайл()Самый простой и правильный путь – это воспользоваться функцией УниверсальныеМеханизмы.СохранитьТабличныйДокументВФайл() из БСП. Эта функция предназначена для сохранения табличных документов в различные форматы, включая XLSX, без привлечения COM-объектов MS Office.
Для того чтобы использовать этот подход, нам необходимо убедиться, что наша конфигурация использует БСП и соответствующая версия платформы установлена. Если БСП не встроена в вашу конфигурацию, вы можете интегрировать её или перенести нужный модуль.
Рассмотрим пример кода, который демонстрирует использование этой функции:
&НаСервере
Функция ВыгрузитьОтчетВExcelБезOffice()
// Создадим и заполним табличный документ
ТабДок = Новый ТабличныйДокумент;
ТабДок.ВывестиСекцию("Шапка"); // Предположим, у нас есть макет с секцией "Шапка"
ТабДок.ВывестиСекцию("Данные"); // И секция "Данные"
// Пример заполнения ячеек (замените на свои данные)
ТабДок.Область(1, 1).Текст = "Заголовок отчета";
ТабДок.Область(2, 1).Текст = "Данные 1";
ТабДок.Область(2, 2).Текст = 100;
ТабДок.Область(3, 1).Текст = "Данные 2";
ТабДок.Область(3, 2).Текст = 200;
// Определим имя файла для сохранения
// Для серверного вызова, путь должен быть доступен серверу 1С
КаталогДляСохранения = "C:\Temp\"; // Пример пути на сервере
ИмяФайла = КаталогДляСохранения + "МойОтчет_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".xlsx";
// Укажем формат файла
ФорматФайла = ТипФайлаТабличногоДокумента.XLSX;
Попытка
// Вызовем функцию БСП для сохранения табличного документа
// Она может быть в различных общих модулях, например, "УниверсальныеМеханизмы" или "ФайловыеОперации"
// Если БСП не встроена, нужно будет адаптировать или создать свою функцию
УниверсальныеМеханизмы.СохранитьТабличныйДокументВФайл(ТабДок, ИмяФайла, ФорматФайла);
Сообщить("Табличный документ успешно сохранен в файл Excel: " + ИмяФайла);
Возврат ИмяФайла;
Исключение
Сообщить("Ошибка при сохранении табличного документа в Excel: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
// Пример вызова на клиенте для демонстрации
&НаКлиенте
Процедура КомандаВыгрузитьВExcel(Команда)
ИмяФайлаНаСервере = ВыгрузитьОтчетВExcelБезOffice();
Если ИмяФайлаНаСервере <> Неопределено Тогда
Сообщить("Файл создан на сервере: " + ИмяФайлаНаСервере);
// Дополнительно можно предложить пользователю скачать файл, если это клиент-серверный режим
// Например: ПоместитьФайл(Истина, ИмяФайлаНаСервере, , "МойОтчет.xlsx");
КонецЕсли;
КонецПроцедуры
Важные моменты при использовании этого метода:
СохранитьТабличныйДокументВФайл() является частью БСП. Если вы не используете БСП, вам придется либо интегрировать ее, либо скопировать нужные процедуры из модулей БСП в свою конфигурацию. Обычно эти процедуры находятся в общих модулях, связанных с файловыми операциями или универсальными механизмами.C:\Temp\ в примере) должен быть доступен и иметь права на запись для пользователя, от имени которого запущен сервер 1С.ПоместитьФайл().Этот способ является наиболее предпочтительным, так как он использует возможности самой платформы. Если же ваша цель — выгрузить информацию об объектах системы, стоит рассмотреть готовую обработку экспорта справочников в Excel с фильтрами.
Если вам не требуется полная совместимость с форматированием Excel или ваша платформа слишком старая для встроенного механизма XLSX, мы можем рассмотреть альтернативные форматы, которые легко читаются большинством табличных процессоров, включая MS Excel и LibreOffice Calc. Кстати, импорт данных из форматов XLS, XLSX, ODS и CSV также отлично поддерживается современными инструментами, что удобно для первоначального заполнения базы.
CSV – это текстовый формат, представляющий табличные данные, где значения разделены определенным символом (обычно запятой или точкой с запятой). Этот формат очень прост, но не сохраняет сложного форматирования (цвета, шрифты, объединенные ячейки). Он отлично подходит для выгрузки "сырых" данных.
Выгрузка в CSV осуществляется также с помощью метода ТабличныйДокумент.Записать(), но с другим параметром типа файла:
&НаСервере
Функция ВыгрузитьОтчетВCSV()
ТабДок = Новый ТабличныйДокумент;
// ... Заполнение ТабДок данными, как в предыдущем примере
ТабДок.Область(1, 1).Текст = "Заголовок отчета";
ТабДок.Область(2, 1).Текст = "Данные 1";
ТабДок.Область(2, 2).Текст = 100;
ТабДок.Область(3, 1).Текст = "Данные 2";
ТабДок.Область(3, 2).Текст = 200;
КаталогДляСохранения = "C:\Temp\";
ИмяФайлаCSV = КаталогДляСохранения + "МойОтчет_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".csv";
Попытка
ТабДок.Записать(ИмяФайлаCSV, ТипФайлаТабличногоДокумента.CSV);
Сообщить("Табличный документ успешно сохранен в файл CSV: " + ИмяФайлаCSV);
Возврат ИмяФайлаCSV;
Исключение
Сообщить("Ошибка при сохранении табличного документа в CSV: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Преимущества CSV:
Недостатки CSV:
ODS – это стандартный формат электронных таблиц, используемый LibreOffice Calc и другими приложениями, совместимыми с OpenDocument. Он способен сохранять форматирование, формулы и структуру таблицы, в отличие от CSV.
Выгрузка в ODS также поддерживается методом ТабличныйДокумент.Записать():
&НаСервере
Функция ВыгрузитьОтчетВОDS()
ТабДок = Новый ТабличныйДокумент;
// ... Заполнение ТабДок данными, включая форматирование
ТабДок.Область(1, 1).Текст = "Заголовок отчета";
ТабДок.Область(1, 1).Шрифт = Новый Шрифт("Arial", 12, Истина);
ТабДок.Область(2, 1).Текст = "Данные 1";
ТабДок.Область(2, 2).Текст = 100;
ТабДок.Область(3, 1).Текст = "Данные 2";
ТабДок.Область(3, 2).Текст = 200;
КаталогДляСохранения = "C:\Temp\";
ИмяФайлаODS = КаталогДляСохранения + "МойОтчет_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".ods";
Попытка
ТабДок.Записать(ИмяФайлаODS, ТипФайлаТабличногоДокумента.ODS);
Сообщить("Табличный документ успешно сохранен в файл ODS: " + ИмяФайлаODS);
Возврат ИмяФайлаODS;
Исключение
Сообщить("Ошибка при сохранении табличного документа в ODS: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Для случаев, когда требуется полная гибкость при формировании XLSX-файлов, а встроенные средства платформы по каким-либо причинам не подходят, мы можем рассмотреть использование сторонних библиотек.
Суть подхода заключается в том, что мы можем создать внешнюю компоненту (на .NET с использованием C# или другом языке), которая будет использовать мощные библиотеки для работы с XLSX.
Шаги для реализации:
EPPlus.RegAsm.exe.Новый COMОбъект.Этот метод применяется в более сложных случаях, когда требуется максимальная производительность и специфический функционал библиотек .NET.
В некоторых случаях, когда установка какого-либо ПО на сервер невозможна, а разработка внешних компонентов нецелесообразна, мы можем прибегнуть к использованию онлайн-сервисов для конвертации файлов. Этот подход является скорее обходным путем, чем полноценным решением.
Принцип работы: Выгрузка в MXL или PDF, отправка файла на сервис через HTTPСоединение и получение готового XLSX обратно.
Как мы выяснили, проблема выгрузки табличного документа 1С в Excel без установленного Microsoft Office имеет несколько решений. Выбор конкретного подхода зависит от версии вашей платформы 1С и требований к форматированию.
Мы настоятельно рекомендуем начинать с использования встроенного механизма платформы 1С через БСП. Это самый чистый и надежный способ. Если же ваша работа подразумевает регулярный обмен данными, не забудьте ознакомиться с профессиональными инструментами для загрузки и выгрузки данных, которые значительно экономят время разработки.
Мы призываем вас проанализировать вашу ситуацию и выбрать наиболее подходящий и эффективный метод для решения вашей задачи.