В современной практике автоматизации на платформе 1С:Предприятие 8.3 часто возникает задача регулярного обмена данными с внешними системами или подготовки отчетов для руководства в формате Excel. Наиболее эффективным способом реализации такой задачи является использование механизма регламентных заданий. Это позволяет системе выполнять тяжелые операции в фоновом режиме, не отвлекая пользователей от оперативной работы. В данной статье мы подробно разберем, как создать надежный механизм выгрузки данных, работающий полностью на стороне сервера.
Проанализируем ситуацию: когда мы запускаем выгрузку в Excel вручную из тонкого клиента, у нас есть доступ к файловой системе пользователя и установленным приложениям (например, Microsoft Office). Однако регламентное задание выполняется на сервере приложений 1С под правами системной учетной записи. Это накладывает два серьезных ограничения:
COMОбъект("Excel.Application") работает нестабильно и медленно.Для решения этих проблем мы рассмотрим наиболее современный и быстрый способ — использование объекта ТабличныйДокумент и его метода Записать(), который позволяет формировать файлы XLSX программно, не требуя установленного офисного пакета на сервере.
Рассмотрим подробнее процедуру, которая будет отвечать за сбор данных и их сохранение. Важно помнить, что процедура регламентного задания должна располагаться в неглобальном общем модуле с установленным флагом "Сервер". Разберем пример кода, который формирует отчет по остаткам товаров.
Процедура ВыполнитьВыгрузкуОстатковВExcel() Экспорт
// 1. Подготовка данных с помощью запроса
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура.Наименование КАК Наименование,
| ТоварыНаСкладахОстатки.Склад.Наименование КАК Склад,
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Количество
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки";
РезультатЗапроса = Запрос.Выполнить();
// 2. Создание табличного документа для формирования Excel
ТабДок = Новый ТабличныйДокумент;
// Сформируем заголовок
Секция = ТабДок.ПолучитьОбласть("R1C1:R1C3");
ТабДок.Область(1, 1).Текст = "Номенклатура";
ТабДок.Область(1, 2).Текст = "Склад";
ТабДок.Область(1, 3).Текст = "Остаток";
// Заполнение данными
Выборка = РезультатЗапроса.Выбрать();
СтрокаНомер = 2;
Пока Выборка.Следующий() Цикл
ТабДок.Область(СтрокаНомер, 1).Текст = Выборка.Наименование;
ТабДок.Область(СтрокаНомер, 2).Текст = Выборка.Склад;
ТабДок.Область(СтрокаНомер, 3).Текст = Выборка.Количество;
СтрокаНомер = СтрокаНомер + 1;
КонецЦикла;
// 3. Сохранение файла на сервере
ПутьКФайлу = "C:\Exchange\Export_Stock.xlsx";
Попытка
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Исключение
ЗаписьЖурналаРегистрации("ВыгрузкаExcel", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
В этом примере мы проанализировали использование метода Записать. Обратите внимание на второй параметр: ТипФайлаТабличногоДокумента.XLSX. Это критически важно, так как старые форматы (XLS) имеют ограничения по количеству строк и требуют больше ресурсов памяти при формировании.
Посмотрим на процесс настройки объекта в конфигураторе. Перейдем в ветку Общие -> Регламентные задания и добавим новый объект ВыгрузкаДанныхВExcel. Нам необходимо заполнить следующие свойства:
МойМодульОбмена.ВыполнитьВыгрузкуОстатковВExcel).Важный момент: если ваша база работает в файловом режиме, для выполнения регламентных заданий должен быть запущен отдельный сеанс 1С. В клиент-серверном варианте задания выполняются процессами rphost автоматически.
Часто программисты сталкиваются с тем, что код корректно работает при ручном запуске, но выдает ошибку в фоновом режиме. Разберем подробнее причины такой ситуации. Когда работает сервер 1С, он обращается к дисковой подсистеме от имени пользователя (обычно USR1CV8). У этого пользователя должны быть полные права на папку, в которую производится запись.
Если вам необходимо сохранить файл на сетевой ресурс, используйте UNC-пути (например, \\ServerName\Share\File.xlsx), а не подключенные сетевые диски (например, Z:\File.xlsx), так как сетевые диски подключаются для конкретного сеанса пользователя и не видны службе сервера.
Проанализируем пример функции для проверки доступности каталога перед записью:
Функция ПроверитьДоступностьКаталога(ПутьККаталогу)
ФайлПроверки = Новый Файл(ПутьККаталогу);
Если НЕ ФайлПроверки.Существует() Тогда
Возврат Ложь;
КонецЕсли;
// Попробуем создать временный файл
ИмяВременногоФайла = ПутьККаталогу + "test_access.tmp";
Попытка
ТекстТест = Новый ЗаписьТекста(ИмяВременногоФайла);
ТекстТест.Записать("test");
ТекстТест.Закрыть();
УдалитьФайлы(ИмяВременногоФайла);
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Если данных очень много (десятки тысяч строк), прямое заполнение ячеек через Область().Текст может работать медленно. Разберем по шагам, как ускорить этот процесс:
Вывести() табличного документа.Поток для записи файла, если требуется экстремальная производительность при работе с текстовыми форматами (CSV/JSON), хотя для Excel стандартный Записать() в формате XLSX обычно справляется хорошо.Посмотрим на пример вывода через СКД, который значительно сокращает объем кода и повышает производительность:
// Пример вывода через СКД в фоновом задании
Схема = ПолучитьОбщуюМакет("МояСхемаВыгрузки");
Настройки = Схема.НастройкиПоУмолчанию;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляРезультатаТабличныйДокумент"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Мы проанализировали ключевые аспекты настройки автоматической выгрузки. Использование встроенных средств платформы 1С (объект ТабличныйДокумент) в связке с РегламентныеЗадания является наиболее стабильным решением. Это исключает зависимость от стороннего ПО (Excel) и позволяет системе гибко управлять ресурсами сервера. Помните о необходимости логирования ошибок через ЗаписьЖурналаРегистрации, так как в фоновых заданиях это единственный способ узнать о возникших проблемах без участия пользователя.
Соблюдая эти рекомендации, вы сможете создать надежный и производительный инструмент для автоматического обмена данными, который будет работать стабильно независимо от нагрузки на систему.