При автоматизации бизнес-процессов часто возникает задача ежедневной выгрузки актуального прайс-листа в определенную папку на сервере или FTP-ресурс. Основная сложность заключается в том, что стандартные обработки часто завязаны на интерфейс пользователя: они используют формы, диалоги и элементы управления. Однако регламентные задания в 1С выполняются на стороне сервера в неинтерактивном режиме, где нет понятия "форма" или "текущее окно".
В данной статье мы разберем, как адаптировать существующую обработку для работы в фоновом режиме, программно сформировать табличный документ и сохранить его на жесткий диск без открытия визуального интерфейса.
Рассмотрим типичную ошибку начинающих разработчиков. Попытка вызвать форму из регламентного задания, как показано в примере ниже, приведет к аварийному завершению задания:
// Этот код НЕ будет работать в регламентном задании!
ПараметрыФормы = Новый Структура;
Форма1 = ОткрытьФорму("Обработка.ПечатьПрайсЛистаСКартинками.Форма.ФормаЗаполнения", ПараметрыФормы);
ТабДокумент = Форма1.ЭлементыФормы.ДокументРезультат;
ТабДокумент.Записать("C:\Price.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Проанализируем ситуацию: метод ОткрытьФорму предназначен для клиентского контекста. Серверный процесс (менеджер кластера), выполняющий регламентное задание, не имеет доступа к графической оболочке. Следовательно, нам необходимо полностью исключить использование ЭтаФорма, ЭлементыФормы и любых методов модуля формы.
Для начала нам нужно найти процедуру, которая отвечает за формирование данных. Чаще всего она называется Сформировать, Печать или ОбновитьОтчет. Чтобы она стала доступна регламентному заданию, её необходимо перенести (или продублировать) в Модуль объекта обработки и пометить ключевым словом Экспорт.
Выясним причину зависимости от формы: обычно процедура берет настройки (фильтры по складам, типам цен) напрямую из реквизитов формы. Нам нужно переписать код так, чтобы процедура принимала настройки и ТабличныйДокумент в качестве параметров.
Пример правильной структуры процедуры в модуле объекта:
Процедура ВыгрузитьПрайсВТабличныйДокумент(ТабДок, НастройкиВыгрузки) Экспорт
// Инициализируем построитель отчета или СКД
Построитель = Новый ПостроительОтчета;
// Устанавливаем настройки, переданные извне
Построитель.УстановитьНастройки(НастройкиВыгрузки);
// Выполняем заполнение переданного табличного документа
Построитель.Вывести(ТабДок);
КонецПроцедуры
Теперь создадим общий модуль (например, РегламентныеПроцедурыСервер) с установленными флажками "Сервер" и "Вызов сервера". В нем мы напишем метод, который будет запускаться планировщиком.
Разберем по шагам, что должен делать этот метод:
ТабличныйДокумент.Посмотрим на пример реализации такого метода:
Процедура ВыполнитьРегламентнуюВыгрузкуПрайса() Экспорт
// 1. Создаем объект обработки без открытия формы
ПрайсОбработка = Обработки.ПечатьПрайсЛистаСКартинками.Создать();
// 2. Подготавливаем табличный документ
ТабДок = Новый ТабличныйДокумент;
// 3. Загружаем настройки (можно взять из хранилища настроек пользователя)
КлючОбъекта = "Обработка.ПечатьПрайсЛистаСКартинками/НастройкиВыгрузки";
Настройки = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, "");
// 4. Вызываем формирование
ПрайсОбработка.ВыгрузитьПрайсВТабличныйДокумент(ТабДок, Настройки);
// 5. Определяем путь сохранения.
// Важно: путь должен быть доступен пользователю, от которого запущен сервер 1С!
ПутьКФайлу = "C:\Exchange\PriceList.xlsx";
Попытка
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
ЗаписьЖурналаРегистрации("ВыгрузкаПрайса", УровеньЖурналаРегистрации.Информация, , , "Файл успешно сохранен: " + ПутьКФайлу);
Исключение
ЗаписьЖурналаРегистрации("ВыгрузкаПрайса", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка сохранения: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Проанализируем важный технический аспект: права доступа. Когда мы указываем путь "C:\Exchange\", этот путь относится к локальному диску сервера, на котором работает 1С:Предприятие.
Важные рекомендации по работе с путями:
USR1CV8), под которой работает служба 1С, есть права на запись в целевую папку."\\FileServer\Public\Price.xlsx").ТабличныйДокумент они выводятся корректно (в некоторых старых конфигурациях картинки могут не отображаться при формировании на сервере без специальных настроек).Метод Записать() объекта ТабличныйДокумент поддерживает различные форматы. Рассмотрим наиболее популярные:
ТипФайлаТабличногоДокумента.XLSX — современный формат Excel, наиболее предпочтителен для прайсов.ТипФайлаТабличногоДокумента.PDF — если прайс предназначен для чтения клиентами и не требует редактирования.ТипФайлаТабличногоДокумента.HTML — для публикации цен на сайте.Для оптимизации процесса, особенно если прайс-лист объемный, рекомендуем рассмотреть подробнее возможность архивации файла сразу после формирования. Это сэкономит место на диске и ускорит последующую передачу файла по сети или почте.
// Пример создания ZIP-архива
Архив = Новый ЗаписьZipФайла("C:\Exchange\Price.zip");
Архив.Добавить("C:\Exchange\PriceList.xlsx");
Архив.Записать();
Таким образом, мы исключили интерфейсную зависимость, перенесли логику в модуль объекта и обеспечили корректную работу алгоритма в фоновом режиме. Теперь остается только создать в метаданных новое РегламентноеЗадание, указать созданную процедуру из общего модуля и настроить расписание.