Как правильно вызвать процедуру из регламентного задания и настроить экспорт в XML

Программист IT и автоматизация бизнеса
← На главную

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

Анализируем контекст выполнения: Клиент против Сервера

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

  1. Отсутствие интерфейса: На сервере не существует объектов типа КомандаФормы, Элементы, а также нельзя использовать интерактивные методы вроде Предупреждение() или Вопрос().
  2. Права доступа: Фоновое задание выполняется от имени технического пользователя, под которым запущена служба Агент сервера 1С:Предприятия (обычно это USR1CV8). У этого пользователя нет доступа к вашему рабочему столу или личным папкам "Мои документы".

Исправляем сигнатуру процедуры

Проанализируем типичную ошибку в объявлении метода. Если ваша процедура в общем модуле выглядит так:


Процедура ЗаписьДанных(Команда) Экспорт
    // Код выгрузки
КонецПроцедуры

Она никогда не запустится из регламентного задания. Параметр Команда передается платформой только при нажатии кнопки в интерфейсе. Регламентное задание вызывает метод «напрямую» и, если в настройках задания не указаны параметры, оно ожидает увидеть процедуру без параметров. Правильный вариант для фонового процесса:


Процедура ЗаписьДанных() Экспорт
    // Код выгрузки, не зависящий от элементов формы
КонецПроцедуры

Настройка общего модуля

Чтобы платформа «увидела» ваш метод, необходимо убедиться, что общий модуль, в котором размещен код, настроен правильно. Проверим следующие свойства в палитре свойств модуля:

Проанализируем ситуацию, когда возникает ошибка «Метод задания не найден». Помимо проверки флага Экспорт, обязательно убедитесь, что вы применили изменения конфигурации (нажали F7). В серверном режиме платформа кэширует конфигурацию, и иногда требуется перезапуск фонового задания после обновления базы данных.

Работа с файловой системой на сервере

Рассмотрим вопрос сохранения XML-файла. Попытка записать файл по пути C:\Users\Администратор\Desktop\... обречена на провал, если сервер 1С находится на другом физическом компьютере или если у пользователя службы 1С нет прав на эту папку. Разберем шаги по организации доступа:

  1. Выбор папки: Избегайте системных папок и профилей пользователей. Лучшим решением будет создать отдельный каталог на диске сервера, например D:\Exchange\XML\.
  2. Права доступа: В свойствах папки на вкладке «Безопасность» нужно добавить пользователя USR1CV8 (или того, под которым запущен сервер) и дать ему права «Изменение» и «Запись».
  3. Сетевые пути: Если файл должен попасть на другой компьютер, используйте UNC-пути вида \\ServerName\Folder\file.xml. При этом права должны быть даны как на уровне файловой системы (NTFS), так и на уровне общего доступа (Sharing).

Пример надежного кода для выгрузки

Посмотрим на оптимизированный пример кода, который учитывает серверную специфику и требования к безопасности:


Процедура ЗаписьДанных() Экспорт
    
    // Определяем путь. Лучше вынести его в константу или настройку программы
    ПутьКФайлу = "D:\Exchange\my_document.xml";
    
    ЗаписьXML = Новый ЗаписьXML;
    Попытка
        ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
    Исключение
        // Если не удалось открыть файл, записываем ошибку в журнал регистрации
        ЗаписьЖурналаРегистрации("ВыгрузкаXML", УровеньЖурналаРегистрации.Ошибка, , , 
            "Не удалось открыть файл для записи: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;

    ЗаписьXML.ЗаписатьОбъявлениеXML();
    ЗаписьXML.ЗаписатьНачалоЭлемента("Корневой");
    ЗаписьXML.ЗаписатьАтрибут("ИмяСправочника", "Контрагенты");

    // Используем запрос для получения данных на сервере - это быстрее и надежнее
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Контрагенты.ИНН КАК УНП,
        |   Контрагенты.Наименование КАК Наименование,
        |   Контрагенты.НаименованиеПолное КАК ПолноеНаименование
        |ИЗ
        |   Справочник.Контрагенты КАК Контрагенты";

    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        ЗаписьXML.ЗаписатьНачалоЭлемента("ЭлементСправочника");
        
        ЗаписьXML.ЗаписатьНачалоЭлемента("УНП");
        ЗаписьXML.ЗаписатьТекст(Строка(ВыборкаДетальныеЗаписи.УНП));
        ЗаписьXML.ЗаписатьКонецЭлемента();
        
        ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование");
        ЗаписьXML.ЗаписатьТекст(ВыборкаДетальныеЗаписи.Наименование);
        ЗаписьXML.ЗаписатьКонецЭлемента();
        
        ЗаписьXML.ЗаписатьНачалоЭлемента("ПолноеНаименование");
        ЗаписьXML.ЗаписатьТекст(ВыборкаДетальныеЗаписи.ПолноеНаименование);
        ЗаписьXML.ЗаписатьКонецЭлемента();
        
        ЗаписьXML.ЗаписатьКонецЭлемента(); // ЭлементСправочника
    КонецЦикла;

    ЗаписьXML.ЗаписатьКонецЭлемента(); // Корневой
    ЗаписьXML.Закрыть();
    
    ЗаписьЖурналаРегистрации("ВыгрузкаXML", УровеньЖурналаРегистрации.Информация, , , "Выгрузка успешно завершена");

КонецПроцедуры

Диагностика и отладка фоновых заданий

Если задание все равно не выполняется, проанализируем ситуацию с помощью встроенных инструментов. Выясним причину через Журнал регистрации (меню Администрирование – Обслуживание – Журнал регистрации). Отфильтруйте события по колонке «Приложение» со значением «Фоновое задание».

Для «живой» отладки кода выполним следующие действия:

  1. В Конфигураторе откройте меню Отладка – Подключение.
  2. Нажмите кнопку Автоматическое подключение.
  3. Установите флажок Фоновые задания и нажмите ОК.
  4. Установите точку останова в коде общего модуля. Теперь при срабатывании расписания отладчик прервет выполнение на вашей точке.

Помните, что для работы регламентных заданий в клиент-серверном варианте не нужно держать открытым сеанс пользователя или конфигуратор — достаточно запущенной службы сервера 1С. В файловом же варианте для работы заданий должен быть запущен хотя бы один сеанс пользователя, который будет выступать в роли «планировщика».

← На главную