Фоновые задания на отдельном сервере. Универсальное регламентное задание. Создание метаданных регламентного задания
Проблема не новая и время от времени обсуждается на всевозможных 1С-ных форумах. Самое простое и популярное решение - это перезагрузка сервера 1С. К сожалению, этот вариант не всегда допустим или крайне нежелателен. На такой случай существуют более деликатные решения.
Вот один из таких способов в виде краткой пошаговой инструкции:
1. С помощью консоли администрирования серверов 1С ищем проблемное ф оновое задание в списке соединений (например, по времени начала его работы, сравнив с временем начала работы регламентированного задания в консоли заданий). Определяем рабочий процесс, в котором находится зависшее соединение.
2. Открываем свойства этого процесса и отмечаем его как неиспользуемый (если используется один единственный процесс, то предварительно необходимо создать новый рабочий процесс - для того, чтобы все активные соединения переподключились к нему). Запоминаем номер PID данного процесса.
3. Дожидаемся когда все текущие соединения переместятся из отключенного процесса в один из используемых. В конечном итоге в нашем процессе должны остаться только проблемные соединения, которые мы и хотим удалить.
4. На компьютере с сервером 1С с помощью диспетчера задач ищем соответствующий ему процесс rphost.exe по PID отключенного рабочего процесса и удаляем его.
5 . На всякий случай можно удалить отключенный нами рабочий процесс 1С с пощью админ. консоли и, при необходимости, создать новый.
6. Готово. Можно войти в консоль заданий и проверить работоспособность регламентного задания.
Некоторые задачи в документообороте и учете бывает необходимо выполнять периодически. Например, по двадцатым числам. Или ежедневно.
Обычно в компании стараются создать правила о выполнении таких задач – кто, когда и как должен выполнить задачу, кто проконтролировать.
Такие задачи называют – регламентированными, то есть выполняемые согласно регламента.
В ИТ часто регламентированно выполняется мониторинг.
Это хорошо знакомо системным администратором – есть специальные программы, которые периодически проверяют работоспособность серверов и сетевой инфрастуктуры и сообщают смс или электронным письмом администратору.
Аналогичные вещи существуют для вебмастеров – для проверки доступности сайта в течении суток.
В 1С задачи мониторинга и любые другие периодические задачи, которые должны выполняться автоматически по расписанию, выполняются с помощью механизма Регламентые задания 1С.
Поговорим сегодня про них.
Регламентные задания 1С
Регламентные задания 1С – это , который позволяет выполнять , как это делает , а по расписанию.
Само регламентное задание 1С в конфигураторе – это способ указать настройки и задать расписание. Кстати, расписание можно менять динамически потом в режиме 1С Предприятие.
Фоновые задания можно создавать из текста программы на языке 1С произвольно без регламентного задания 1С – для параллельных вычислений на сервере.
Выполнение регламентных заданий 1С можно отключить временно – в .
Добавление регламентного задания 1С
Регламентные задания 1С находятся в конфигурации в ветке Общие/Регламентные задания 1С. Добавим новое регламентное задание 1С, укажем его имя.
В свойстве регламентного задания 1С Имя метода – указывается , также как и в . Функция будет находиться в общем модуле с установленной галочкой Сервер в свойствах, то есть модуль должен быть добавлен заранее.
Свойство регламентного задания 1С — Наименование задания – определяет название, под которым будет фигурировать задание в средствах управления заданиями.
Свойство регламентного задания 1С – Ключ – позволяет сгруппировать несколько разных регламентных заданий 1С. Одновременно может быть запущено только одно задание с одинаковым значением ключа. Само значение может быть произвольным. Пустое значение не учитывается при контроле (то есть считается не заполненным).
Свойство регламентного задания 1С – Предопределенное – определяет, что при запуске 1С Предприятия такое задание будет создано и в единственном экземпляре с указанными в конфигураторе расписанием. Не предопределенные задания появляются в момент наступления расписания программно.
В типовых конфигурациях, например Бухгалтерии редакции 2.0, такие регламентные задания 1С как Обновление конфигурации и Пересчет итогов – предопределенные, а такие как Обмен данными или Отложенные движения – не предопределенные.
Использование – включает задание (то есть оно будет выполняться только если галочка Использование установлена).
Повтор при аварийном завершении – как легко догадаться означает перезапуск задания, если оно не смогло выполниться успешно с первого раза – указывается сколько раз перезапускать и через сколько после аварийного завершения.
Управление регламентным заданием 1С и мониторинг
Для управления регламентными заданиями 1С существует специальная типовая обработка Консоль заданий. Ее можно найти в том числе на .
Эта обработка относится к так называемым универсальным внешним типовым обработкам 1С, которые часто не включаются в конфигурации, а распространяются отдельно, например, на дисках ИТС.
С помощью обработки консоль заданий можно:
- Включить/выключить выполнение регламентного задания 1С
- Назначить/изменить расписание регламентного задания 1С (да и другие параметры)
- Указать пользователя 1С, от имени которого будет выполнена регламентное задание 1С
- Посмотреть — какие задачи когда были выполнены и с каким результатом, ошибки выполнения заданий 1С
- Выполнить задание.
Копии баз данных и регламентные задания 1С
Если используется серверная 1С, то бывает следующая ситуация:
- В своих целях (например, для программирования) делается копия рабочей базы
- В копии базы работается, тестируется и так далее
- Забывается выключить регламентные задания 1С в такой тестовой базе.
Пока регламентные задания 1С выполняют задачи, связанные только со своей информационной базой, то ничего в этом нет.
Однако частенько регламентные задания 1С могут сохранять какие-либо файлы, данные в другие базы, проводить обмен, высылать электронные письма.
В этом случае может получится интересная смесь между результатом выполнения регламентных заданий 1С в рабочей базе и копиях.
Регламентные задачи 1С для в копиях рабочей базы нужно отключать в .
Выполнение и невыполнение регламентных задач 1С
При создании регламентных заданий 1С необходимо помнить:
- Задачи выполняются сами собой – их необходимо мониторить
- Задачи выполняются в модуле на сервере
- Задачи выполняются под другим пользователем Windows, под другими правами.
Во-первых нужно проверить, что задача выполняется и может быть выполнена как регламентное задание 1С.
Во-вторых серверный модуль значит, что недоступны многие вещи, которые доступны на клиенте. Например, иногда, не все документы могут быть проведены только на сервере, так как в их алгоритме может быть предусмотрено, что проведение запускается пользователем вручную и могут быть использованы не серверные функции, например
Предупреждение(«Привет!»)
В-третьих, если задача имеет дело с чем-то вне базы 1С, то важное значение приобретают права пользователя Windows, под которым выполняется задание.
Особенно важен при разработке третий пункт. Если модуль не может быть выполнен на сервере – задание не будет выполняться в принципе. Для проверки нужно хотя бы раз запустить задание и посмотреть результат «Задание выполнено» в обработке Консоль заданий.
Позволяет нам производить какие-либо вычисления в системе незаметно для пользователя, то есть в фоне. Более того данный механизм позволяет нам распараллелить процесс вычисления. Распараллелить мы можем даже процедуру, которая будет выполняться. Для этого наше фоновое задание должно запускать еще несколько фоновых заданий. В этом случае процессы распараллеливаются и, если у нас многопроцессорная, многоядерная система, наш алгоритм будет работать эффективно. После запуска нескольких процессов мы можем сказать системе, что необходимо дождаться окончания выполнения этих процессов для того, чтобы потом каким-то образом свести результат.
К примеру, в типовых конфигурациях, в то время как пользователь работает, происходит выполнение различного рода сервисных фоновых заданий. Об этом может свидетельствовать записи журнала регистрации, в котором фиксируется факт выполнения таких действий. Причем на работу пользователя это никак не влияет, он просто их не замечает.
В идеале фоновое задание реализуется в варианте клиент-сервер, в этом случае вся нагрузка переходит на сервер. Что касается файлового варианта, то работа фонового задания возможна, но она имеет некоторые особенности.
Вот что выдаст система если не учесть эти особенности, и запустить фоновое задание в файловом варианте информационной базы.
1С фоновое задание имеет некоторые ограничения. Поскольку оно выполняется на стороне сервера, то нет возможности интерактивной работы с пользователем. К примеру нельзя вывести сообщение, ну и вообще какую-то информацию. Все эти данные нужно сохранять в рамках информационной базы и дальше каким-то образом обрабатывать.
Обратившись к синтакс-помощнику можно получить более детальные сведения о фоновых заданиях 1С. Здесь следует отметить, что это объект исключительно программный и он никак не сохраняется в базе данных. То есть мы создаем экземпляр класса, инициализируем свойства и запускаем его на выполнение.
Какие же средства мы имеем для управления фоновыми заданиями? Этим средством является объект метаданных"МенеджерФоновыхЗадания" . У этого объекта есть метод "Выполнить" , с помощью этого метода, как раз и запускается фоновое задание.
Имеет он следующие параметры:
"ИмяМетода"
- имя процедуры или функции, которую нужно выполнить, причем это должна быть процедура или функция серверного контекста;
"Параметры" - массив параметров, количество элементов которого должно соответствовать количеству параметров нашей процедуры/функции, указанной в параметре "ИмяМетода" ;
"Ключ" - некий ключ уникальности, представляющий из себя строчку, по которой система понимает нужно ли запускать фоновое задание либо такое задание уже запущено;
"Наименование" - здесь можно указать произвольное описание нашего метода.
Возвращаемым значением является объект "ФоновоеЗадание" , содержащий текущее имя метода, текущий ключ и еще несколько свойств и методов. Одним из таких методов является метод "ОжидатьЗавершения" . Его задачей является то, что мы может указать системе, чтобы ничего не производилось пока не будет завершено фоновое задание.
Фоновое задание 1С 8.2, 8.3 - Пример использования
Приведем пример работы с фоновыми заданиями 1С. Сначала создадим простой алгоритм, который будет ненадолго загружать систему 1С таким образом, чтобы мы ничего не могли в это время делать.
Для этого:1. Создадим общий модуль "ОбработчикиФоновыхЗаданий" , который будет компилироваться на стороне сервера;
2. Опишем в нем экспортную процедуру "ПроизветиФоновоеВычисление(Параметр)" , которая принимает один параметр строкового типа;
Процедура ПроизветиФоновоеВычисление(Параметр) Экспорт ВремНач = ТекущаяДата() ; Пока ТекущаяДата() - ВремяНач < = 6 Цикл КонецЦикла ; КонецПроцедуры Процедура КнНажатие() ОбработчикиФоновыхЗаданий. ПроизветиФоновоеВычисление("Какой-то параметр" ) ; КонецПроцедурыГотово. Теперь при запуске обработки и нажатии на кнопку происходит подвисание системы на несколько секунд, в процессе которого ничего нельзя сделать. Это как раз то, что нам и нужно было сделать.
Теперь обеспечим произведение этих вычислений в фоне, то есть чтобы фоновое задание 1С 8.2, 8.3 выполнялось, но нам не мешало.
Для этого:1. В обработке, в событии нажатия кнопки пропишем следующий код.
Процедура КнНажание() Параметры = Новый Массив; Параметры. Добавить("Какой-то параметр" ) ; ФоновоеЗадание. Выполнить ("ОбработчикиФоновыхЗаданий.ПроизветиФоновоеВычисление" , Параметры, Новый УникальныйИдентификатор, "Тестовое задание" ) ; КонецПроцедурыЗдесь первым параметром мы передаем имя процедуры общего модуля, а вторым - массив параметров. Третьим параметром нужно передать уникальный ключ и четвертым некоторое описание нашей процедуры.
В данной статье приведен пример работы с фоновыми заданиями, как в 1С производится запуск фоновых заданий , каким образом можно получить список заданий при помощи метода "ПолучитьФоновыеЗадания()" . Итак, данный метод возвращает нам некоторый массив. Посмотрим что же он содержит.
Cразу оговорюсь, что приведенный пример разрабатывался в клиент-серверном варианте работы базы.
На рисунке представленном выше видно содержимое данного массива.
Обратите внимание на поле "Состояние" . Оно содержит информацию о том, успешно ли было выполнено запущенное фоновое задание или же оно еще выполняется.
Также там содержится информация о неудачном выполнении задания. Еще этот массив содержит информацию о ключах, уникальных идентификаторах, наименовании фоновых заданий. Информация о выполняющихся и выполненных заданиях хранится в информационной базе, но есть ограничение на количество хранимых записей в таблице. Это количество составляет порядка 1000 записей. То есть при добавлении новых элементов старые удаляются. Также задание удаляется из таблицы если оно было выполнено более суток назад.
Пример работы с фоновым заданием 1C - Метод "ПолучитьФоновыеЗадания"
Давайте также рассмотрим работу с фоновыми заданиями на примере метода "ПолучитьФоновыеЗадания()" . В данном методе есть возможность установить отбор на получаемые записи. То есть в качестве параметра метода нам нужно передать структуру.
Структура может содержать поля: Уникальный идентификатор, Ключ, Состояние, Начало, Конец, Наименование, ИмяМетода, РегламентноеЗадание .
Например, если бы нам нужны были только выполняющиеся задания мы бы накладывали отбор с именем элемента структуры "Состояние" и значением бы мы указали системное перечисление "СостояниеФоновогоЗадания" в состояние активно. Итак, для начала необходимо добиться того, чтобы в демонстрационной базе появились записи о выполнении фоновых заданий 1С.
Для реализации примера сделаем следующее:
1. Создадим общий модуль "ОбработчикиФоновыхЗаданий" , выполняемый на сервере.
И добавим в него следующий код:
Процедура ПроизвестиФоновоеВычисление(Параметр) ЭкспортВремНач = ТекущаяДата() ;
Пока ТекущаяДата() - ВремНач Цикл
КонецЦикла ;
КонецПроцедуры2. Создадим обработку, разместим на форме кнопку "Выполнить задание в фоне" и в процедуре обработки события нажатия на кнопку добавим код:
&НаКлиенте Процедура ВыполнитьЗадание(Команда) ВыполнитьФоновоеЗаданиеНаСервере() ; КонецПроцедуры
Описание вызываемой процедуры:
&НаСервере Процедура ВыполнитьФоновоеЗаданиеНаСервере() ПараметрыФоновогоЗадания = Новый Массив; ПараметрыФоновогоЗадания. Добавить("Какой-то параметр" "Тестовое задание" ) ; ПараметрыФоновогоЗадания = Новый Массив; ПараметрыФоновогоЗадания. Добавить("Какой-то параметр" ) ; ФоновыеЗадания. Выполнить ("ОбработчикиФоновыхЗаданий.ПроизвестиФоновоеВычисление" , ПараметрыФоновогоЗадания, Новый УникальныйИдентификатор, "Тестовое задание 2" ) ; КонецПроцедуры // ВыполнитьФоновоеЗаданиеНаСервере()
Теперь запустим 1С в режиме предприятия и запустим выполнение фонового задания.
Готово. Этими действиями мы добились того, что в нашей демонстрационной базе появились записи о выполнении фоновых заданий 1С и теперь можно продемонстрировать пример получения их массива, содержащегося в нашей базе.
Добавим на форму еще одну кнопку "Получить фоновые задания" . Напишем в процедуре обработки нажания следующий код:
&НаКлиенте Процедура ПолучитьФоновыеЗадания(Команда) ПолучитьФоновыеЗаданияНаСервере() ; КонецПроцедуры
Текст процедуры на сервере:
&НаСервере Процедура ПолучитьФоновыеЗаданияНаСервере() ПараметрыОтбора = Новый Структура("Наименование" , "Тестовое задание 2" ) ; СписокФоновыхЗаданий = ФоновыеЗадания. ПолучитьФоновыеЗадания(ПараметрыОтбора) ; Для каждого Задание Из СписокФоновыхЗаданий Цикл Сообщить(Задание. Наименование) ; КонецЦикла ; КонецПроцедуры // ПолучитьФоновыеЗаданияНаСервере()
Запустим 1С на выполнение и нажмем кнопку "Получить фоновые задания" .
Регламентные задания в 1С предназначены для выполнения определенных процедур по расписанию, с некоторой периодичностью.
Регламентные задания хранятся в информационной базе, имеют расписание запуска. Сам запуск производится полностью автоматически, если режим работы информационной базы клиент-серверный. Если же база файловая, то необходимо выполнить следующие действия:
- выделить специального пользователя для выполнения регламентных заданий;
- должна быть открыта база под этим пользователем, в которой периодически должна выполняться функция ВыполнитьОбработкуЗаданий().
Создание регламентного задания
Регламентные задания — объект метаданных конфигурации 1С. Находится в группе Общие. Рассмотрим параметры и свойства регламентных заданий.
Имя метода — путь к экспортной процедуре в общем модуле, которая будет выполняться по заданному расписанию. Процедура должна выполняться на сервере. В этом регламентные задания чем-то похожи на объект Подписка на событие.
Ключ — позволяет создать несколько регламентных заданий одного типа. Например, выполнение синхронизации данных между несколькими информационными базами может быть реализовано с помощью одного объекта метаданных РегламентноеЗадание , при этом самих регламентных заданий будет создано несколько (по количеству баз для обмена). Различаться эти регламентные задания будут с помощью свойства Ключ. Одновременно может выполняться только одно задание с одинаковым ключом.
Использование — флаг, показывающий, включено ли регламентное задание.
Предопределенное — здесь можно провести аналогию с предопределенными элементами справочника. Предопределенные элементы создаются в конфигураторе и применяются пользователями в работе. Обычные элементы пользователь создает сам. С регламентными заданиями точно так же: если оно предопределенное, то оно существует и может выполняться по расписанию сразу после создания в конфигураторе. Если же флаг Предопределенное не установлен, то пользователю нужно самому создать одно или несколько регламентных заданий данного типа (например, через Консоль заданий ).
Количество повторов при аварийном завершении задания — определяет, сколько раз будет выполнен перезапуск фонового задания, если оно было завершено с ошибкой.
Интервал повтора при аварийном завершении задания — определяет, с какой периодичностью будет выполнен перезапуск фонового задания, если оно было завершено с ошибкой.
Программная работа с регламентными заданиями
В данных примерах будем рассматривать работу с обычными, не предопределенными, регламентными заданиями.
Программное создание регламентного задания
//Создаем задание
"ИмяРегдаментногоЗадания"
)
;
//Устанавливаем ключ регламентного задания (не обязательно)
Задание.
Ключ =
"КлючЗадания"
;
//Включаем регламентное задание
Задание.
Использование =
Истина
;
//Записываем регламентное задание
Задание.
Записать()
;
Программное получение регламентного задания для изменения параметров
В этом примере предположим, что существует только одно регламентное задание данного типа. Если заданий несколько, то, зная , нетрудно внести в код соответствующие изменения.
"ИмяРегламентногоЗадания"
]
)
)
;
Если
Задания.
Количество()
>
0
Тогда
Задание=
Задания[
0
]
;
Иначе
Задание =
РегламентныеЗадания.
СоздатьРегламентноеЗадание("ИмяРегламентногоЗадания"
)
;
КонецЕсли ;
//Регламентное задание находится в переменной Задание. Можно изменять его параметры.
Вызов диалога изменения расписания регламентного задания
Для работы с расписанием регламентного задания существует особый тип диалога. Все еще предполагаем, что у нас есть только одно регламентное задание данного типа.
//Получаем массив с регламентными заданиями нужного типа
Задания=
РегламентныеЗадания.
ПолучитьРегламентныеЗадания(новый Структура("Метаданные"
,
Метаданные.
РегламентныеЗадания[
"ИмяРегламентногоЗадания"
]
)
)
;
//Если задание существует, то по условию оно одно
Если
Задания.
Количество()
>
0
Тогда
Задание=
Задания[
0
]
;
//Если задания нет, создадим его
Иначе
Задание =
РегламентныеЗадания.
СоздатьРегламентноеЗадание("ИмяРегламентногоЗадания"
)
;
КонецЕсли ;
Расписание= Задание. Расписание;
//Создаем диалог изменения расписания регламентного задания
ДиалогРедактирования=
Новый
ДиалогРасписанияРегламентногоЗадания (Расписание)
;
//Показываем диалог пользователю и обрабатываем изменения расписания
Если
ДиалогРедактирования.
ОткрытьМодально()
Тогда
Задание.
Расписание =
ДиалогРедактирования.
Расписание;
Задание.
Записать()
;
КонецЕсли
;