В процессе сопровождения и администрирования «1С:Управление торговлей 10.3» (работающей на обычных формах) часто возникает задача автоматизации рутинных процессов. Это может быть регулярный обмен данными, выгрузка документов в текстовые файлы, импорт прайс-листов или отправка уведомлений. Лучший способ решить такую задачу — настроить автоматический запуск внешней обработки по расписанию.
В этой статье мы подробно рассмотрим два основных и наиболее эффективных способа реализации этой задачи для конфигураций на обычных формах: использование встроенных регламентных заданий на стороне сервера 1С и настройку запуска через Планировщик задач Windows с использованием командного файла (батника).
---
Этот метод является классическим, самым надежным и простым в реализации, особенно если ваша информационная база работает в файловом режиме. В файловом режиме регламентные задания не выполняются сами по себе, если в базе нет активных сеансов, в то время как планировщик операционной системы работает всегда.
Суть метода заключается в создании исполняемого файла формата .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
Разберем параметры командной строки, которые мы использовали:
ENTERPRISE — запуск системы в режиме «1С:Предприятие»./F (или /S) — путь к информационной базе (локальный или серверный)./N и /P — имя пользователя и пароль учетной записи в 1С, под которой будет выполняться задача. Рекомендуется создать отдельного пользователя (например, «Робот») с полными правами./Execute — путь к файлу внешней обработки, которую необходимо запустить сразу после старта программы./C "AutoRun" — передача параметра запуска в конфигурацию. Наш код в обработке проверит этот параметр и запустит автоматическое выполнение./DisableStartupMessages — очень важный параметр. Он подавляет появление различных сервисных окон при запуске (например, предложений об обновлении, предупреждений безопасности и сообщений о резервном копировании). Без этого параметра батник может «зависнуть» на стартовом окне.Шаг 3. Настройка Планировщика задач Windows
После создания батника переходим в операционную систему:
start_task.bat.---
Если у вас используется клиент-серверный вариант работы (на базе MS SQL Server, PostgreSQL и т.д.), более профессиональным и архитектурно правильным решением будет перенос логики выполнения обработки непосредственно внутрь конфигурации в виде регламентного задания.
Давайте разберем, как реализовать этот подход.
Шаг 1. Перенос кода в общий модуль
Регламентные задания в 1С выполняются на стороне сервера приложений. На сервере нет интерфейса, форм и окон. Поэтому весь код обработки должен быть полностью очищен от клиентских вызовов (таких как команды открытия форм, предупреждения, методы Предупреждение(), Вопрос(), Сообщить() и т.д.).
Выполним следующие действия в конфигураторе:
_РегламентныеЗаданияСервер).
Процедура ВыполнитьРегламентнуюВыгрузку() Экспорт
// Внимание: сервер 1С не видит локальные диски вашего компьютера (например, диск F:\)
// Необходимо использовать только сетевые пути (UNC), доступные службе сервера 1С!
ПутьККаталогу = "\\ServerName\ExchangeFolder\";
НайденныеФайлы = НайтиФайлы(ПутьККаталогу, "*.txt");
Для каждого ИмяФайла Из НайденныеФайлы Цикл
ТекстовыйДокумент = Новый ТекстовыйДокумент;
Попытка
ТекстовыйДокумент.Прочитать(ИмяФайла.ПолноеИмя);
// Здесь обрабатываем данные файла...
// Вместо метода Сообщить() используем запись в Журнал Регистрации:
ЗаписьЖурналаРегистрации("РегламентноеЗадание.Выгрузка",
УровеньЖурналаРегистрации.Информация, , ,
"Успешно обработан файл: " + ИмяФайла.Имя);
Исключение
// Обработка ошибок чтения
ЗаписьЖурналаРегистрации("РегламентноеЗадание.Выгрузка",
УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка обработки файла: " + ИмяФайла.ПолноеИмя + ". Описание: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Шаг 2. Создание регламентного задания в метаданных
ВыгрузкаДокументовВТекст)._РегламентныеЗаданияСервер.ВыполнитьРегламентнуюВыгрузку.Шаг 3. Инициализация и запуск в режиме «1С:Предприятие»
В старых конфигурациях, таких как УТ 10.3, новое регламентное задание может не запуститься автоматически сразу после обновления базы данных. Для его регистрации в системе часто требуется программно создать запись регламентного задания.
Для этого можно запустить консоль заданий (обработку «Консоль заданий») или выполнить в любой внешней обработке следующий одноразовый код инициализации:
МетаданныеЗадания = Метаданные.РегламентныеЗадания.ВыгрузкаДокументовВТекст;
// Проверяем, существует ли уже запущенное задание
МассивЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания(МетаданныеЗадания);
Если МассивЗаданий.Количество() = 0 Тогда
НовоеЗадание = РегламентныеЗадания.СоздатьРегламентноеЗадание(МетаданныеЗадания);
НовоеЗадание.Использование = Истина;
НовоеЗадание.Наименование = МетаданныеЗадания.Синоним;
// Настраиваем расписание программно (при необходимости)
НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
НовоеРасписание.ПериодПовтораВТечениеДня = 600; // 10 минут в секундах
НовоеЗадание.Расписание = НовоеРасписание;
НовоеЗадание.Записать();
Сообщить("Регламентное задание успешно зарегистрировано и запущено!");
Иначе
Сообщить("Регламентное задание уже зарегистрировано в системе.");
КонецЕсли;
---
Если вам требуется запускать не одну, а несколько разных внешних обработок (например, 4 обработки из вашего списка), то снимать конфигурацию с поддержки и под каждую задачу создавать новое регламентное задание в конфигураторе — не самый лучший вариант с точки зрения обновлений и поддержки базы.
Рассмотрим более изящное решение: создание одного универсального регламентного задания, которое будет запускать внешние обработки, хранящиеся прямо в справочнике «Дополнительные внешние обработки» вашей конфигурации УТ 10.3.
Для этого выполним следующие действия:
УниверсальныйЗапускВнешнихОбработок.
Процедура ЗапуститьВнешнююОбработкуПоКоду(КодОбработки) Экспорт
// Находим обработку в справочнике дополнительных обработок УТ 10.3
СсылкаНаОбработку = Справочники.ВнешниеОбработки.НайтиПоКоду(КодОбработки);
Если СсылкаНаОбработку.Пустая() Тогда
ЗаписьЖурналаРегистрации("УниверсальныйЗапуск",
УровеньЖурналаРегистрации.Ошибка, , ,
"Не найдена внешняя обработка с кодом: " + КодОбработки);
Возврат;
КонецЕсли;
// Получаем двоичные данные файла обработки из хранилища значения
ДвоичныеДанные = СсылкаНаОбработку.ХранилищеВнешнейОбработки.Получить();
Если ДвоичныеДанные = Неопределено Тогда
ЗаписьЖурналаРегистрации("УниверсальныйЗапуск",
УровеньЖурналаРегистрации.Ошибка, , ,
"Файл обработки пуст в справочнике для элемента: " + СсылкаНаОбработку.Наименование);
Возврат;
КонецЕсли;
// Создаем временный файл на сервере 1С
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
Попытка
// Подключаем внешнюю обработку на сервере
ОбъектОбработки = ВнешниеОбработки.Создать(ИмяВременногоФайла, Ложь);
// Вызываем экспортную процедуру выполнения, которая обязательно должна быть в модуле объекта обработки
ОбъектОбработки.ВыполнитьКоманду();
Исключение
ЗаписьЖурналаРегистрации("УниверсальныйЗапуск",
УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка выполнения обработки " + СсылкаНаОбработку.Наименование + ": " + ОписаниеОшибки());
КонецПопытки;
// Удаляем временный файл с диска сервера
Попытка
УдалитьФайлы(ИмяВременногоФайла);
Исключение
// Ошибка удаления не критична для процесса выгрузки
КонецПопытки;
КонецПроцедуры
При использовании этого подхода вам достаточно один раз доработать конфигурацию. После этого любые новые задачи автоматизации вы сможете решать простым добавлением внешней обработки в справочник в режиме «1С:Предприятие» и настройкой расписания для универсального задания.
---
Проанализируем основные проблемы, с которыми сталкиваются разработчики при переносе кода обработок на серверную сторону:
F:\РасхКассОрдер\). При работе на сервере всегда используйте общие сетевые пути формата \\ИмяСервера\ОбщаяПапка\. Также убедитесь, что у учетной записи Windows, под которой запущена служба ragent (сервер приложений 1С), есть права на чтение и запись в эту сетевую папку.
Предупреждение(), Вопрос() или обращением к клиентским общим модулям (например, к функциям с постфиксами ...Клиент). Перед запуском обязательно делайте проверку конфигурации в режиме «Сервер».