Как настроить регламентное задание в 1С 8.3 на управляемых формах для автоматической выгрузки данных из регистра сведений в Excel?

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

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

Понимание принципов работы регламентных заданий в 1С

Прежде чем мы приступим к практической реализации, давайте выясним, что такое регламентное задание и как оно функционирует в среде 1С:Предприятия 8.3. Регламентные задания – это специальные объекты конфигурации, предназначенные для выполнения определенного программного кода на сервере 1С по заданному расписанию. Хотя в этой статье мы рассмотрим классический способ с использованием общего модуля, существуют и другие подходы, например, реализация регламентных заданий на основе дополнительных обработок. Они позволяют автоматизировать широкий спектр задач, от обслуживания базы данных до генерации сложных отчетов.

Ключевым аспектом является то, что регламентное задание выполняется на сервере 1С в фоновом режиме, независимо от того, запущены ли у пользователей клиентские приложения. Это делает их незаменимыми для задач, требующих регулярного выполнения без участия человека. Для успешного функционирования регламентных заданий требуется, чтобы был запущен сервер 1С:Предприятия и его агент сервера. Именно агент сервера управляет очередью и запуском регламентных и фоновых заданий.

В нашем случае мы хотим, чтобы регламентное задание выполняло следующую последовательность действий:

  1. Запускалось в заданное время (например, ежедневно в 18:00).
  2. Подключалось к базе данных 1С на сервере.
  3. С помощью запроса выбирало актуальные данные из определенного регистра сведений.
  4. Формировало из этих данных табличный документ.
  5. Сохраняло сформированный табличный документ в формате Excel (XLSX) на указанный сетевой диск.
  6. Протоколировало результат своей работы в журнал регистрации.

Давайте разберем каждый из этих шагов подробнее.

Пошаговая настройка регламентного задания

Для создания регламентного задания нам потребуется выполнить несколько шагов в конфигураторе 1С.

Шаг 1: Создание общего модуля с экспортной процедурой

Первым делом мы создадим общий модуль, в котором будет размещена наша экспортная процедура. Эта процедура будет содержать всю логику по получению данных и формированию Excel-файла. Создадим новый общий модуль и назовем его, например, МодульРегламентныхЗаданий. Очень важно установить для него флажки "Сервер" и "Вызов сервера". Без этих флагов процедура не сможет быть вызвана из регламентного задания, так как регламентные задания всегда выполняются на сервере.

Внутри этого модуля мы определим экспортную процедуру. Использование ключевого слова Экспорт делает процедуру доступной для вызова извне, в том числе из регламентного задания.

Рассмотрим структуру такой процедуры:


Процедура ВыгрузитьЦеныВExcel() Экспорт
    // Здесь будет размещен весь код по выгрузке данных.
    // Мы подробно разберем его далее.
КонецПроцедуры

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

Шаг 2: Создание и настройка самого регламентного задания в конфигурации

Теперь, когда у нас есть процедура, которую мы хотим выполнять, нам нужно создать объект регламентного задания в конфигурации. Для этого:

  1. Откроем конфигуратор 1С.
  2. В дереве конфигурации найдем ветку "Общие" -> "Регламентные задания".
  3. Щелкнем правой кнопкой мыши по ветке "Регламентные задания" и выберем "Добавить".
  4. В открывшемся окне свойств нового регламентного задания заполним следующие поля:
    • Имя: Присвоим понятное имя, например, ВыгрузкаЦенНоменклатурыВExcel.
    • Синоним: Более дружелюбное название, которое будет отображаться в пользовательском режиме (например, "Выгрузка цен номенклатуры в Excel").
    • Имя метода: Это критически важное поле. Здесь мы должны указать полное имя нашей экспортной процедуры в формате ИмяОбщегоМодуля.ИмяПроцедуры. В нашем случае это будет МодульРегламентныхЗаданий.ВыгрузитьЦеныВExcel.
    • Использование: Убедимся, что установлено значение Истина, чтобы задание было активным.
    • Предопределенное: Установим Истина, если хотим, чтобы задание всегда присутствовало в списке регламентных заданий без возможности удаления пользователем.

После заполнения основных полей сохраним конфигурацию.

Шаг 3: Настройка расписания регламентного задания

Далее нам необходимо настроить расписание, по которому будет запускаться наше регламентное задание. Расписание задается в режиме 1С:Предприятия. Для этого:

  1. Запустим 1С:Предприятие в режиме пользователя (обычно под администратором или пользователем с полными правами).
  2. Перейдем в раздел "Администрирование" (или соответствующий раздел, где доступны настройки регламентных заданий).
  3. Найдем пункт "Регламентные и фоновые задания". Для более удобного администрирования можно использовать альтернативную консоль заданий, которая заменяет стандартную обработку.
  4. В списке найдем наше созданное регламентное задание по синониму (например, "Выгрузка цен номенклатуры в Excel").
  5. Дважды щелкнем по нему или нажмем кнопку "Настроить расписание".
  6. В открывшемся окне "Расписание" мы можем гибко настроить частоту и время запуска:
    • Вкладка "Общие": Здесь можно указать период повтора (например, "Каждый день", "Каждую неделю" и т.д.). Для нашей задачи выберем "Ежедневно".
    • Вкладка "Дневное": Здесь мы указываем время начала выполнения. Установим флажок "Начинать с" и выберем 18:00:00. Если требуется один запуск в день, этого достаточно. Мы можем оставить интервал повтора пустым или установить его равным 24 часам, если хотим явно указать, что задание должно выполняться не чаще одного раза в сутки.
    • Другие вкладки ("Недельное", "Месячное", "Годовое"): Позволяют настроить более сложные расписания, например, по определенным дням недели или числам месяца. Для нашей задачи эти вкладки не требуются.
  7. После настройки расписания нажмем "ОК" и закроем форму регламентного задания. Убедимся, что галочка "Включено" для нашего задания активна.

Теперь регламентное задание настроено и готово к выполнению по расписанию. Осталось реализовать саму логику выгрузки.

Реализация логики выгрузки отчета в Excel

Возвращаемся к нашей экспортной процедуре ВыгрузитьЦеныВ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. Обрабатываем возможные ошибки
        // В случае возникновения ошибки, записываем ее описание в журнал регистрации.
        ЗаписьЖурналаРегистрации("РегламентноеЗадание.ВыгрузкаЦен", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка при выгрузке цен: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Давайте подробно разберем ключевые моменты этого кода:

  1. Определение пути к файлу: Мы формируем полный путь к файлу Excel, включая сетевой ресурс. Важно использовать уникальное имя файла, добавляя текущую дату и время, чтобы каждая выгрузка создавала новый файл, а не перезаписывала предыдущий. Например: "\\сетевой_путь\ЦеныНоменклатуры_20231027_1800.xlsx".
  2. Создание ТабличногоДокумента: Объект Новый ТабличныйДокумент – это основа для формирования таблиц в 1С. Мы будем "рисовать" в нем наши данные.
  3. Получение данных с помощью запроса: Мы используем объект Запрос для получения актуальных данных из регистра сведений ЦеныНоменклатуры. Метод СрезПоследних(&Дата, ) позволяет получить последние записи регистра на указанную дату, что идеально подходит для цен. Мы выбираем поля Номенклатура, ХарактеристикаНоменклатуры и Цена. Обратите внимание: мы обращаемся к наименованиям объектов, чтобы в Excel попадали не ссылки, а читаемые названия (Номенклатура.Наименование, ХарактеристикаНоменклатуры.Наименование).
  4. Заполнение ТабличногоДокумента:
    • Сначала мы вручную заполняем первую строку заголовками столбцов: "Номенклатура", "Характеристика", "Цена". Мы можем также установить ширину колонок с помощью свойства ШиринаКолонки для лучшего отображения.
    • Затем мы проходим по каждой строке результата запроса (Пока Выборка.Следующий() Цикл) и заполняем соответствующие ячейки ТабличногоДокумента. Переменная НомерСтроки помогает нам отслеживать текущую строку в таблице.
  5. Настройка внешнего вида ТабличногоДокумента: Свойства Автомасштаб, НапечататьЗаголовки и РазмерКолонтитула позволяют улучшить внешний вид и печатные характеристики документа, что будет полезно при его просмотре в Excel.
  6. Сохранение в Excel: Метод ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX) выполняет непосредственное сохранение сформированных данных в файл Excel. ТипФайлаТабличногоДокумента.XLSX указывает на современный формат Excel.
  7. Журнал регистрации: Использование функции ЗаписьЖурналаРегистрации() позволяет нам отслеживать выполнение регламентного задания и оперативно реагировать на возможные ошибки. Мы записываем сообщения об успешном завершении и о любых исключениях, которые могут возникнуть. Это очень важный аспект для мониторинга автоматизированных процессов.
  8. Обработка исключений: Блок Попытка...Исключение...КонецПопытки – стандартный механизм обработки ошибок в 1С. Он позволяет нашей процедуре корректно завершиться даже при возникновении непредвиденных ситуаций (например, нет доступа к файлу, ошибка в запросе) и записать информацию об ошибке в журнал.

Важные моменты и возможные проблемы

При работе с регламентными заданиями, особенно при взаимодействии с внешними ресурсами, такими как сетевые диски, мы часто сталкиваемся с проблемами прав доступа и безопасности. Давайте рассмотрим эти аспекты.

Права доступа сервера 1С к сетевым ресурсам

Это одна из наиболее частых причин, по которой регламентные задания, работающие с файлами, завершаются с ошибкой "Отказано в доступе". Критически важно, чтобы пользователь, от имени которого запущена служба агента сервера 1С:Предприятия, имел полные права на чтение и запись в сетевую папку, куда мы хотим сохранять файл Excel. Разберем подробнее:

  1. Учетная запись службы: По умолчанию служба агента сервера 1С (1C:Enterprise 8.3 Server Agent) может быть запущена от имени системной учетной записи (например, Local System). Эта учетная запись имеет ограниченный доступ к сетевым ресурсам и обычно не обладает нужными правами.
  2. Рекомендованный подход:
    • Создадим специального пользователя домена (например, svc_1c_agent) с минимально необходимыми правами.
    • В свойствах службы агента сервера 1С изменим учетную запись, от имени которой она запускается, на этого доменного пользователя.
    • Предоставим этому доменному пользователю (svc_1c_agent) необходимые права на запись и чтение в целевую сетевую папку (например, \\сетевой_путь\). Это включает в себя как права на общий доступ к папке (Share Permissions), так и права файловой системы (NTFS Permissions).
    • Перезапустим службу агента сервера 1С после изменения учетной записи.
  3. Проверка прав: Мы можем вручную попробовать создать файл в этой сетевой папке, используя учетную запись, от имени которой запускается служба 1С. Если это не удается, то и регламентное задание не сможет записать файл.

Никогда не запускайте службу 1С от имени учетной записи доменного администратора или других высокопривилегированных пользователей, если это не абсолютно необходимо. Это создает серьезную угрозу безопасности.

Мониторинг через журнал регистрации

Как мы уже упоминали, активное использование ЗаписьЖурналаРегистрации() – это ваш основной инструмент для мониторинга выполнения регламентных заданий. Регулярно проверяйте журнал регистрации на предмет сообщений от вашего регламентного задания, используя для этого либо стандартный просмотрщик, либо более мощные инструменты, такие как обработка для анализа журнала регистрации. Фильтруйте по источнику (например, "РегламентноеЗадание.ВыгрузкаЦен") и уровню важности ("Информация", "Ошибка"), чтобы быстро находить нужные записи.

Это позволит вам оперативно выявлять проблемы, связанные как с программным кодом, так и с внешними факторами (например, недоступность сетевого ресурса, нехватка памяти на сервере и т.д.).

Отладка регламентных заданий

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

  1. Запуск процедуры вручную: В режиме отладки в конфигураторе мы можем установить точку останова внутри нашей процедуры ВыгрузитьЦеныВExcel(). Затем в пользовательском режиме (под отладчиком) мы можем вручную запустить регламентное задание (через форму "Регламентные и фоновые задания" -> "Выполнить сейчас"). Это позволит нам пошагово отладить код.
  2. Вызов процедуры из внешней обработки: Для более удобной отладки мы можем создать временную внешнюю обработку, в которой будет кнопка, вызывающая нашу экспортную процедуру из общего модуля. Это позволит быстро запускать и отлаживать код без ожидания расписания.

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

← На главную