При работе с системой 1С:Предприятие часто возникает необходимость автоматизировать рутинные операции, такие как ежедневная выгрузка данных для аналитики, формирования отчетов или обмена информацией с другими системами. Одним из наиболее эффективных инструментов для этого являются регламентные задания. В этой статье мы подробно рассмотрим, как создать и настроить такое задание для автоматической выгрузки данных из регистра сведений в файл Excel на сетевой диск, а также разберем важные нюансы, связанные с правами доступа и формированием самого файла.
Прежде чем мы приступим к практической реализации, давайте выясним, что такое регламентное задание и как оно функционирует в среде 1С:Предприятия 8.3. Регламентные задания – это специальные объекты конфигурации, предназначенные для выполнения определенного программного кода на сервере 1С по заданному расписанию. Хотя в этой статье мы рассмотрим классический способ с использованием общего модуля, существуют и другие подходы, например, реализация регламентных заданий на основе дополнительных обработок. Они позволяют автоматизировать широкий спектр задач, от обслуживания базы данных до генерации сложных отчетов.
Ключевым аспектом является то, что регламентное задание выполняется на сервере 1С в фоновом режиме, независимо от того, запущены ли у пользователей клиентские приложения. Это делает их незаменимыми для задач, требующих регулярного выполнения без участия человека. Для успешного функционирования регламентных заданий требуется, чтобы был запущен сервер 1С:Предприятия и его агент сервера. Именно агент сервера управляет очередью и запуском регламентных и фоновых заданий.
В нашем случае мы хотим, чтобы регламентное задание выполняло следующую последовательность действий:
Давайте разберем каждый из этих шагов подробнее.
Для создания регламентного задания нам потребуется выполнить несколько шагов в конфигураторе 1С.
Шаг 1: Создание общего модуля с экспортной процедурой
Первым делом мы создадим общий модуль, в котором будет размещена наша экспортная процедура. Эта процедура будет содержать всю логику по получению данных и формированию Excel-файла. Создадим новый общий модуль и назовем его, например, МодульРегламентныхЗаданий. Очень важно установить для него флажки "Сервер" и "Вызов сервера". Без этих флагов процедура не сможет быть вызвана из регламентного задания, так как регламентные задания всегда выполняются на сервере.
Внутри этого модуля мы определим экспортную процедуру. Использование ключевого слова Экспорт делает процедуру доступной для вызова извне, в том числе из регламентного задания.
Рассмотрим структуру такой процедуры:
Процедура ВыгрузитьЦеныВExcel() Экспорт
// Здесь будет размещен весь код по выгрузке данных.
// Мы подробно разберем его далее.
КонецПроцедуры
Данный подход позволяет инкапсулировать всю необходимую логику в одном месте, что упрощает отладку и поддержку кода.
Шаг 2: Создание и настройка самого регламентного задания в конфигурации
Теперь, когда у нас есть процедура, которую мы хотим выполнять, нам нужно создать объект регламентного задания в конфигурации. Для этого:
ВыгрузкаЦенНоменклатурыВExcel.ИмяОбщегоМодуля.ИмяПроцедуры. В нашем случае это будет МодульРегламентныхЗаданий.ВыгрузитьЦеныВExcel.Истина, чтобы задание было активным.Истина, если хотим, чтобы задание всегда присутствовало в списке регламентных заданий без возможности удаления пользователем.После заполнения основных полей сохраним конфигурацию.
Шаг 3: Настройка расписания регламентного задания
Далее нам необходимо настроить расписание, по которому будет запускаться наше регламентное задание. Расписание задается в режиме 1С:Предприятия. Для этого:
Теперь регламентное задание настроено и готово к выполнению по расписанию. Осталось реализовать саму логику выгрузки.
Возвращаемся к нашей экспортной процедуре ВыгрузитьЦеныВExcel() в общем модуле МодульРегламентныхЗаданий. Здесь мы напишем код, который будет получать данные из регистра сведений и формировать Excel-файл.
Мы будем использовать объект ТабличныйДокумент, который является универсальным инструментом для работы с табличными данными в 1С и позволяет сохранять их в различных форматах, включая XLSX.
Процедура ВыгрузитьЦеныВExcel() Экспорт
Попытка
// 1. Определяем путь к файлу
// Мы формируем уникальное имя файла с датой и временем, чтобы избежать перезаписи
// и сохранить историю выгрузок.
// "\\сетевой_путь\" - это путь к сетевому ресурсу, доступному для сервера 1С.
ПутьКФайлу = "\\сетевой_путь\ЦеныНоменклатуры_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmm") + ".xlsx";
// 2. Создаем экземпляр ТабличногоДокумента
ТабДок = Новый ТабличныйДокумент;
// Можно задать имя параметров печати, если есть заранее созданный макет
// ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЦЕН_НОМЕНКЛАТУРЫ";
// 3. Получаем данные из регистра сведений "ЦеныНоменклатуры"
// Мы используем запрос для получения среза последних цен на текущую дату.
// Это гарантирует, что мы получим актуальные данные.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Номенклатура.Наименование КАК Номенклатура,
| ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры.Наименование КАК ХарактеристикаНоменклатуры,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК ЦеныНоменклатурыСрезПоследних"; // СрезПоследних без отбора по Характеристике
Запрос.УстановитьПараметр("Дата", ТекущаяДата());
Выборка = Запрос.Выполнить().Выбрать();
// 4. Заполняем ТабличныйДокумент полученными данными
// Сначала добавим заголовки столбцов.
// Используем метод Область() для доступа к конкретным ячейкам.
ТабДок.Область("R1C1").Текст = "Номенклатура";
ТабДок.Область("R1C1").ШиринаКолонки = 30; // Установим ширину колонки для удобства
ТабДок.Область("R1C2").Текст = "Характеристика";
ТабДок.Область("R1C2").ШиринаКолонки = 20;
ТабДок.Область("R1C3").Текст = "Цена";
ТабДок.Область("R1C3").ШиринаКолонки = 15;
// Переходим ко второй строке для вывода данных.
НомерСтроки = 2;
Пока Выборка.Следующий() Цикл
ТабДок.Область("R" + НомерСтроки + "C1").Текст = Выборка.Номенклатура;
ТабДок.Область("R" + НомерСтроки + "C2").Текст = Выборка.ХарактеристикаНоменклатуры;
ТабДок.Область("R" + НомерСтроки + "C3").Текст = Выборка.Цена;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
// Автоматически подгоняем ширину колонок по содержимому для лучшего отображения
ТабДок.Автомасштаб = Истина;
ТабДок.НапечататьЗаголовки = Истина;
ТабДок.РазмерКолонтитулаСверху = 0;
ТабДок.РазмерКолонтитулаСнизу = 0;
// 5. Сохраняем ТабличныйДокумент в файл Excel
// Указываем полный путь и тип файла.
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
// 6. Записываем информацию об успешной выгрузке в журнал регистрации
ЗаписьЖурналаРегистрации("РегламентноеЗадание.ВыгрузкаЦен", УровеньЖурналаРегистрации.Информация, , , "Выгрузка цен номенклатуры успешно завершена. Файл: " + ПутьКФайлу);
Исключение
// 7. Обрабатываем возможные ошибки
// В случае возникновения ошибки, записываем ее описание в журнал регистрации.
ЗаписьЖурналаРегистрации("РегламентноеЗадание.ВыгрузкаЦен", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка при выгрузке цен: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Давайте подробно разберем ключевые моменты этого кода:
"\\сетевой_путь\ЦеныНоменклатуры_20231027_1800.xlsx".ТабличногоДокумента: Объект Новый ТабличныйДокумент – это основа для формирования таблиц в 1С. Мы будем "рисовать" в нем наши данные.Запрос для получения актуальных данных из регистра сведений ЦеныНоменклатуры. Метод СрезПоследних(&Дата, ) позволяет получить последние записи регистра на указанную дату, что идеально подходит для цен. Мы выбираем поля Номенклатура, ХарактеристикаНоменклатуры и Цена. Обратите внимание: мы обращаемся к наименованиям объектов, чтобы в Excel попадали не ссылки, а читаемые названия (Номенклатура.Наименование, ХарактеристикаНоменклатуры.Наименование).ТабличногоДокумента:
ШиринаКолонки для лучшего отображения.Пока Выборка.Следующий() Цикл) и заполняем соответствующие ячейки ТабличногоДокумента. Переменная НомерСтроки помогает нам отслеживать текущую строку в таблице.ТабличногоДокумента: Свойства Автомасштаб, НапечататьЗаголовки и РазмерКолонтитула позволяют улучшить внешний вид и печатные характеристики документа, что будет полезно при его просмотре в Excel.ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX) выполняет непосредственное сохранение сформированных данных в файл Excel. ТипФайлаТабличногоДокумента.XLSX указывает на современный формат Excel.ЗаписьЖурналаРегистрации() позволяет нам отслеживать выполнение регламентного задания и оперативно реагировать на возможные ошибки. Мы записываем сообщения об успешном завершении и о любых исключениях, которые могут возникнуть. Это очень важный аспект для мониторинга автоматизированных процессов.Попытка...Исключение...КонецПопытки – стандартный механизм обработки ошибок в 1С. Он позволяет нашей процедуре корректно завершиться даже при возникновении непредвиденных ситуаций (например, нет доступа к файлу, ошибка в запросе) и записать информацию об ошибке в журнал.При работе с регламентными заданиями, особенно при взаимодействии с внешними ресурсами, такими как сетевые диски, мы часто сталкиваемся с проблемами прав доступа и безопасности. Давайте рассмотрим эти аспекты.
Это одна из наиболее частых причин, по которой регламентные задания, работающие с файлами, завершаются с ошибкой "Отказано в доступе". Критически важно, чтобы пользователь, от имени которого запущена служба агента сервера 1С:Предприятия, имел полные права на чтение и запись в сетевую папку, куда мы хотим сохранять файл Excel. Разберем подробнее:
1C:Enterprise 8.3 Server Agent) может быть запущена от имени системной учетной записи (например, Local System). Эта учетная запись имеет ограниченный доступ к сетевым ресурсам и обычно не обладает нужными правами.svc_1c_agent) с минимально необходимыми правами.svc_1c_agent) необходимые права на запись и чтение в целевую сетевую папку (например, \\сетевой_путь\). Это включает в себя как права на общий доступ к папке (Share Permissions), так и права файловой системы (NTFS Permissions).Никогда не запускайте службу 1С от имени учетной записи доменного администратора или других высокопривилегированных пользователей, если это не абсолютно необходимо. Это создает серьезную угрозу безопасности.
Как мы уже упоминали, активное использование ЗаписьЖурналаРегистрации() – это ваш основной инструмент для мониторинга выполнения регламентных заданий. Регулярно проверяйте журнал регистрации на предмет сообщений от вашего регламентного задания, используя для этого либо стандартный просмотрщик, либо более мощные инструменты, такие как обработка для анализа журнала регистрации. Фильтруйте по источнику (например, "РегламентноеЗадание.ВыгрузкаЦен") и уровню важности ("Информация", "Ошибка"), чтобы быстро находить нужные записи.
Это позволит вам оперативно выявлять проблемы, связанные как с программным кодом, так и с внешними факторами (например, недоступность сетевого ресурса, нехватка памяти на сервере и т.д.).
Отладка кода, выполняемого в регламентном задании, может быть немного сложнее, чем отладка обычных клиентских или серверных процедур. Однако существуют методы:
ВыгрузитьЦеныВExcel(). Затем в пользовательском режиме (под отладчиком) мы можем вручную запустить регламентное задание (через форму "Регламентные и фоновые задания" -> "Выполнить сейчас"). Это позволит нам пошагово отладить код.Таким образом, мы рассмотрели полный цикл создания и настройки регламентного задания для автоматической выгрузки данных в Excel, начиная от кодирования логики и заканчивая нюансами администрирования. Следуя этим рекомендациям, вы сможете эффективно автоматизировать многие задачи в своей системе 1С:Предприятие.