Как настроить автоматический запуск внешней обработки по расписанию в 1С:УТ 10.3

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

В процессе сопровождения и администрирования «1С:Управление торговлей 10.3» (работающей на обычных формах) часто возникает задача автоматизации рутинных процессов. Это может быть регулярный обмен данными, выгрузка документов в текстовые файлы, импорт прайс-листов или отправка уведомлений. Лучший способ решить такую задачу — настроить автоматический запуск внешней обработки по расписанию.

В этой статье мы подробно рассмотрим два основных и наиболее эффективных способа реализации этой задачи для конфигураций на обычных формах: использование встроенных регламентных заданий на стороне сервера 1С и настройку запуска через Планировщик задач Windows с использованием командного файла (батника).

---

Способ 1. Использование планировщика задач Windows (батник + запуск 1С)

Этот метод является классическим, самым надежным и простым в реализации, особенно если ваша информационная база работает в файловом режиме. В файловом режиме регламентные задания не выполняются сами по себе, если в базе нет активных сеансов, в то время как планировщик операционной системы работает всегда.

Суть метода заключается в создании исполняемого файла формата .bat (или .cmd), который запускает платформу 1С с определенными параметрами, открывает нужную внешнюю обработку, выполняет полезный алгоритм и корректно закрывает сеанс.

Разберем этот процесс по шагам.

Шаг 1. Подготовка кода внешней обработки

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

Важный нюанс: если мы просто пропишем закрытие системы в процедуре ПриОткрытии(), то мы (или другие пользователи) не сможем открыть эту обработку вручную для редактирования или тестирования — она будет сразу закрывать 1С. Чтобы избежать этого, мы будем использовать специальный параметр запуска /C.

Откроем модуль формы нашей внешней обработки и напишем следующий код:


Процедура ПриОткрытии()
    
    // Проверяем параметр запуска, переданный из командной строки
    Если ПараметрыЗапуска = "AutoRun" Тогда
        
        Попытка
            ВыполнитьПолезнуюРаботу();
        Исключение
            // Записываем ошибку в журнал регистрации, так как интерактивного пользователя нет
            ЗаписьЖурналаРегистрации("АвтозапускОбработки",
                УровеньЖурналаРегистрации.Ошибка, , ,
                "Ошибка при выполнении обработки: " + ОписаниеОшибки());
        КонецПопытки;
        
        // Завершаем работу системы. Параметр Ложь отключает запрос на подтверждение выхода
        ЗавершитьРаботуСистемы(Ложь);
        
    КонецЕсли;
    
КонецПроцедуры

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

Шаг 2. Создание командного файла (батника)

Теперь создадим текстовый файл с расширением .bat (например, start_task.bat). В нем мы пропишем команду запуска 1С. Обратите внимание, что лучше использовать утилиту запуска 1cestart.exe, расположенную в общей папке — это избавит вас от необходимости переписывать батник при каждом обновлении версии платформы.

Пример содержимого батника для файловой базы:


"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"C:\1C_Bases\UT_10" /N"Robot" /P"RobotPassword" /Execute"C:\ExternalTasks\MyTask.epf" /C"AutoRun" /DisableStartupMessages

Пример содержимого батника для клиент-серверной базы (SQL):


"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"ServerName\BaseName" /N"Robot" /P"RobotPassword" /Execute"C:\ExternalTasks\MyTask.epf" /C"AutoRun" /DisableStartupMessages

Разберем параметры командной строки, которые мы использовали:

Шаг 3. Настройка Планировщика задач Windows

После создания батника переходим в операционную систему:

  1. Откроем «Панель управления» -> «Администрирование» -> «Планировщик задач».
  2. Нажмем «Создать простую задачу» (или «Создать задачу» для детальной настройки).
  3. Укажем имя задачи и настроим триггер запуска (например, «Ежедневно», повторять каждые 10 минут).
  4. В качестве действия выберем «Запустить программу» и укажем путь к нашему файлу start_task.bat.
  5. Важно: Если база файловая или обработка работает с сетевыми папками, в свойствах задачи на вкладке «Общие» установите признак «Выполнять вне зависимости от того, вошел ли пользователь в систему», и укажите учетную запись Windows, у которой гарантированно есть права доступа к сетевым ресурсам и каталогам с базой данных и обработкой.

---

Способ 2. Использование регламентных заданий на сервере 1С

Если у вас используется клиент-серверный вариант работы (на базе MS SQL Server, PostgreSQL и т.д.), более профессиональным и архитектурно правильным решением будет перенос логики выполнения обработки непосредственно внутрь конфигурации в виде регламентного задания.

Давайте разберем, как реализовать этот подход.

Шаг 1. Перенос кода в общий модуль

Регламентные задания в 1С выполняются на стороне сервера приложений. На сервере нет интерфейса, форм и окон. Поэтому весь код обработки должен быть полностью очищен от клиентских вызовов (таких как команды открытия форм, предупреждения, методы Предупреждение(), Вопрос(), Сообщить() и т.д.).

Выполним следующие действия в конфигураторе:

  1. Создадим новый общий модуль (например, _РегламентныеЗаданияСервер).
  2. В свойствах общего модуля установим галочки Сервер и Вызов сервера. Снимите галочки Клиент.
  3. Напишем экспортную процедуру, которая будет запускать наш процесс.

Процедура ВыполнитьРегламентнуюВыгрузку() Экспорт
    
    // Внимание: сервер 1С не видит локальные диски вашего компьютера (например, диск F:\)
    // Необходимо использовать только сетевые пути (UNC), доступные службе сервера 1С!
    ПутьККаталогу = "\\ServerName\ExchangeFolder\"; 
    
    НайденныеФайлы = НайтиФайлы(ПутьККаталогу, "*.txt");
    
    Для каждого ИмяФайла Из НайденныеФайлы Цикл
        
        ТекстовыйДокумент = Новый ТекстовыйДокумент;
        Попытка
            ТекстовыйДокумент.Прочитать(ИмяФайла.ПолноеИмя);
            
            // Здесь обрабатываем данные файла...
            // Вместо метода Сообщить() используем запись в Журнал Регистрации:
            ЗаписьЖурналаРегистрации("РегламентноеЗадание.Выгрузка",
                УровеньЖурналаРегистрации.Информация, , ,
                "Успешно обработан файл: " + ИмяФайла.Имя);
                
        Исключение
            // Обработка ошибок чтения
            ЗаписьЖурналаРегистрации("РегламентноеЗадание.Выгрузка",
                УровеньЖурналаРегистрации.Ошибка, , ,
                "Ошибка обработки файла: " + ИмяФайла.ПолноеИмя + ". Описание: " + ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;
    
КонецПроцедуры

Шаг 2. Создание регламентного задания в метаданных

  1. В дереве метаданных конфигуратора перейдем в ветку Общие -> Регламентные задания.
  2. Добавим новое регламентное задание (например, ВыгрузкаДокументовВТекст).
  3. В поле Имя метода выберем нашу экспортную процедуру: _РегламентныеЗаданияСервер.ВыполнитьРегламентнуюВыгрузку.
  4. Установим флаг Использование.
  5. Настроим расписание (например, каждый день, каждые 600 секунд (10 минут)).

Шаг 3. Инициализация и запуск в режиме «1С:Предприятие»

В старых конфигурациях, таких как УТ 10.3, новое регламентное задание может не запуститься автоматически сразу после обновления базы данных. Для его регистрации в системе часто требуется программно создать запись регламентного задания.

Для этого можно запустить консоль заданий (обработку «Консоль заданий») или выполнить в любой внешней обработке следующий одноразовый код инициализации:


МетаданныеЗадания = Метаданные.РегламентныеЗадания.ВыгрузкаДокументовВТекст;

// Проверяем, существует ли уже запущенное задание
МассивЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания(МетаданныеЗадания);

Если МассивЗаданий.Количество() = 0 Тогда
    
    НовоеЗадание = РегламентныеЗадания.СоздатьРегламентноеЗадание(МетаданныеЗадания);
    НовоеЗадание.Использование = Истина;
    НовоеЗадание.Наименование = МетаданныеЗадания.Синоним;
    
    // Настраиваем расписание программно (при необходимости)
    НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
    НовоеРасписание.ПериодПовтораВТечениеДня = 600; // 10 минут в секундах
    НовоеЗадание.Расписание = НовоеРасписание;
    
    НовоеЗадание.Записать();
    Сообщить("Регламентное задание успешно зарегистрировано и запущено!");
    
Иначе
    Сообщить("Регламентное задание уже зарегистрировано в системе.");
КонецЕсли;

---

Архитектурное решение: Универсальное регламентное задание

Если вам требуется запускать не одну, а несколько разных внешних обработок (например, 4 обработки из вашего списка), то снимать конфигурацию с поддержки и под каждую задачу создавать новое регламентное задание в конфигураторе — не самый лучший вариант с точки зрения обновлений и поддержки базы.

Рассмотрим более изящное решение: создание одного универсального регламентного задания, которое будет запускать внешние обработки, хранящиеся прямо в справочнике «Дополнительные внешние обработки» вашей конфигурации УТ 10.3.

Для этого выполним следующие действия:

  1. Создадим в конфигураторе одно регламентное задание УниверсальныйЗапускВнешнихОбработок.
  2. В качестве параметра этого задания будем передавать код или наименование элемента справочника внешних обработок.
  3. Напишем код серверного общего модуля, который будет программно извлекать внешнюю обработку из базы данных во временный файл на сервере и запускать её:

Процедура ЗапуститьВнешнююОбработкуПоКоду(КодОбработки) Экспорт
    
    // Находим обработку в справочнике дополнительных обработок УТ 10.3
    СсылкаНаОбработку = Справочники.ВнешниеОбработки.НайтиПоКоду(КодОбработки);
    
    Если СсылкаНаОбработку.Пустая() Тогда
        ЗаписьЖурналаРегистрации("УниверсальныйЗапуск",
            УровеньЖурналаРегистрации.Ошибка, , ,
            "Не найдена внешняя обработка с кодом: " + КодОбработки);
        Возврат;
    КонецЕсли;
    
    // Получаем двоичные данные файла обработки из хранилища значения
    ДвоичныеДанные = СсылкаНаОбработку.ХранилищеВнешнейОбработки.Получить();
    
    Если ДвоичныеДанные = Неопределено Тогда
        ЗаписьЖурналаРегистрации("УниверсальныйЗапуск",
            УровеньЖурналаРегистрации.Ошибка, , ,
            "Файл обработки пуст в справочнике для элемента: " + СсылкаНаОбработку.Наименование);
        Возврат;
    КонецЕсли;
    
    // Создаем временный файл на сервере 1С
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf");
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    
    Попытка
        // Подключаем внешнюю обработку на сервере
        ОбъектОбработки = ВнешниеОбработки.Создать(ИмяВременногоФайла, Ложь);
        
        // Вызываем экспортную процедуру выполнения, которая обязательно должна быть в модуле объекта обработки
        ОбъектОбработки.ВыполнитьКоманду();
        
    Исключение
        ЗаписьЖурналаРегистрации("УниверсальныйЗапуск",
            УровеньЖурналаРегистрации.Ошибка, , ,
            "Ошибка выполнения обработки " + СсылкаНаОбработку.Наименование + ": " + ОписаниеОшибки());
    КонецПопытки;
    
    // Удаляем временный файл с диска сервера
    Попытка
        УдалитьФайлы(ИмяВременногоФайла);
    Исключение
        // Ошибка удаления не критична для процесса выгрузки
    КонецПопытки;
    
КонецПроцедуры

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

---

Частые ошибки при настройке и методы их решения

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

← На главную