1с 8.3 регламентные задания пример на сервере. Фоновые задания: особенности, возможности, настройка
». В ней мы рассмотрим новые возможности, которые не касаются интерфейса системы, но существенным образом расширяют предоставляемый функционал платформы «1С:Предприятие 8».
Применимость
В статье рассматривается платформа «1С:Предприятие» версии 8.3.4.437. Вся функциональность, описанная в статье, актуализирована до редакции 8.3.11.
Прочие новшества в «1С:Предприятие 8.3»
Продолжим знакомиться с новшествами платформы «1С:Предприятие 8.3».
Фоновые и регламентные задания в файловой информационной базе
Во многих типовых конфигурациях на платформе 8.2 существовала константа, в которой указывался пользователь, под которым выполнялись задания в файловом варианте.
При начале работы системы под этим пользователем происходило подключение обработчика ожидания, который с определенной периодичностью вызывал метод встроенного языка ВыполнитьОбработкуЗаданий() .
Такой подход создавал дополнительные затруднения и неудобства для использования регламентных заданий в файловой базе.
Это могло быть особенно критично при работе с такими конфигурациями, как “Комплексная автоматизация” или “Управление производственным предприятием” , в которых регламентные задания играют довольно важную роль.
Если
ЭтоФайловаяИБ
Тогда
=
Константы.ПользовательДляВыполненияРегламентныхЗаданийВФайловомВарианте.Получить
();
Если
глЗначениеПеременной
(“глТекущийПользователь”
)
=
ПользовательДляВыполненияРеглЗаданий
Тогда
// с интервалом секунд вызываем процедуру работы с регламентными заданиями
ПоддержкаРегламентныхЗаданиеДляФайловойВерсии
();
ИнтервалДляОпроса
=
Константы.ИнтервалДляОпросаРегламентныхЗаданийВФайловомВарианте.Получить
();
Если
ИнтервалДляОпроса
=
Неопределено
ИЛИ
ИнтервалДляОпроса
=
0
Тогда
ИнтервалДляОпроса
=
60
;
КонецЕсли
;
ПодключитьОбработчикОжидания
(“ПоддержкаРегламентныхЗаданиеДляФайловойВерсии”
,
ИнтервалДляОпроса
);
КонецЕсли
;
КонецЕсли
;
В платформе 8.3 реализована работа фоновых и регламентных заданий в файловой информационной базе без использования вызова метода глобального контекста ВыполнитьОбработкуЗаданий() .
Фоновые и регламентные задания выполняются непосредственно в одном из клиентских приложений (тонкий, толстый клиент) или расширением веб-сервера.
Фоновое задание, запущенное каким-либо сеансом, выполняется тем же клиентским приложением, которое его инициировало.
Фоновые задания выполняются последовательно, т.е. на одном клиентском приложении в один момент времени может выполняться только одно фоновое задание (в том числе и регламентное).
Регламентные задания выполняются только одним клиентским приложением. Для управления запуском регламентных заданий предназначен ключ командной строки /AllowExecuteScheduledJobs .
Регламентные задания выполняются первым по порядку запуска клиентским приложением, которому не запрещено выполнение регламентных заданий (для запрещения сеанс должен быть запущен с параметром командной строки /AllowExecuteScheduledJobs -Off ).
Когда этот сеанс завершается, выполнение переходит к какому-либо из оставшихся запущенными сеансов.
Если в строке запуска клиентского приложения явно указана необходимость запуска регламентных заданий (в командной строке указано /AllowExecuteScheduledJobs -Force ), то регламентные задания начинают выполняться на нем, независимо от наличия других сеансов.
Обработка регламентных заданий происходит один раз в 60 секунд.
Заметим, что регламентные задания прикладного решения (в файловом варианте) начинали выполняться не ранее, чем через 1 минуту после запуска клиентского приложения. Начиная с редакции 8.3.8 это время увеличили вдвое, и поэтому регламентные задания начинают выполняться максимум через 2 минуты после запуска клиента (в файловом варианте).
Такое решение обусловлено уменьшением задержки при старте приложения. Кроме того, в релизе 8.3.7 была добавлена возможность быстрого определения того, что текущий сеанс является сеансом фонового задания. Это реализовано за счет нового метода глобального контекста ПолучитьТекущийСеансИнформационнойБазы(), а также нового метода у сеанса информационной базы ПолучитьФоновоеЗадание() .
Ниже показан код, который иллюстрирует вышеописанное:
Для увеличения нажмите на изображение.
Вычисление контрольных сумм
В платформе появились механизмы для вычисления контрольных сумм данных.
Напомним, что контрольная сумма (хеш) – это некоторое значение, рассчитанное по набору данных путём применения определённого алгоритма и используемое для проверки целостности данных при их передаче или хранении.
Хеши могут использоваться для проверки идентичности данных (например, необходимо удостовериться, что при передаче файла он не был поврежден; проверить, были ли внесены изменения в файл, и если да, то загрузить его в базу повторно).
Для этого в платформе был реализован объект ХешированиеДанных , доступный на сервере, в толстом клиенте, внешнем соединении, а также на сервере мобильного приложения.
Данный объект имеет два метода: Добавить() и ДобавитьФайл() , которые обновляют хеш-сумму с учетом данных, переданных в параметрах.
Платформа 8.3.4.437 поддерживает вычисление следующих хеш-функций: CRC32 , MD5 , SHA1 , SHA256 . Но функции SHA1 и SHA256 не поддерживаются на мобильной платформе.
Рассмотрим простой пример. Предполагается, что на сервере в каталоге программы есть файл “ragent.exe ”. Необходимо рассчитать MD5 -сумму для этого файла.
Для этого создадим внешнюю обработку, на форме которой разместим команду Рассчитать . Обработчик содержит следующий код:
&НаКлиенте
Процедура
Рассчитать
(Команда
)
Результат
=
РассчитатьНаСервере
();
Сообщить
(Строка
(Результат
));
КонецПроцедуры
&НаСервере
Функция
РассчитатьНаСервере
()
Хеш
=
Новый
ХешированиеДанных
(ХешФункция
.MD5
);
Хеш.ДобавитьФайл
(КаталогПрограммы
()
+
“ragent.exe”
);
Возврат
Хеш.ХешСумма
;
КонецФункции
В платформе редакции 8.3.10+ в методе Добавить() объекта ХешированиеДанных стало возможным использовать поток двоичных данных, что значительно упростило их использование в решении различных прикладных задач по обновлению хеш-сумм.
Работа с защищенными версиями протоколов SMTP/POP3
В платформе 8.3 появилась возможность использовать защищенные версии протоколов SMTP/POP3 (встречаются термины SMTPS/POP3S или SSLSMTP/SSLPOP3 ).
Для объекта ИнтернетПочтовыйПрофиль реализованы новые свойства:
- ИспользоватьSSLSMTP ;
- ИспользоватьSSLPOP3 ;
- ТолькоЗащищеннаяАутентификацияSMTP ;
- ТолькоЗащищеннаяАутентификацияPOP3 .
Свойства АутентификацияSMTP и АутентификацияPOP3 объекта ИнтернетПочтовыйПрофиль , а также перечисления СпособSMTPАутентификации и СпособPOP3Аутентификации использовать не рекомендуется – они поддерживаются для совместимости.
Использование защищенного протокола SMTPS дает возможность отправлять почту из 1С , пользуясь почтовым ящиком Google .
Рассмотрим пример. На форме расположим поля для ввода темы письма и адреса получателя, а для ввода текста письма – поле форматированного документа.
Для увеличения нажмите на изображение.
При нажатии на кнопку Отправить будет выполняться следующий код:
&НаКлиенте
Процедура
Отправить
(Команда
)
Почта
=
Новый
ИнтернетПочта
;
Профиль
=
Новый
ИнтернетПочтовыйПрофиль
;
Профиль.АдресСервераSMTP
=
“smtp.googlemail.com”
;
Профиль.ПользовательSMTP
=
“[email protected]”
;
Профиль.ПарольSMTP
=
“PASSWORD”
;
Профиль.ИспользоватьSSLSMTP
=
Истина
;
Профиль.ПортSMTP
=
465
;
Попытка
Почта.Подключиться
(Профиль
);
Исключение
Сообщить
(ОписаниеОшибки
());
Возврат
;
КонецПопытки
;
ПочтовоеСообщениеТекст
=
“”
;
Вложения
=
Новый
Структура
;
Текст.ПолучитьHTML
(ПочтовоеСообщениеТекст
,
Вложения
);
ПочтовоеСообщение
=
Новый
ИнтернетПочтовоеСообщение
;
ПочтовоеСообщение.Получатели.Добавить
(Кому
);
ПочтовоеСообщение.Тема
=
Тема
;
ПочтовоеСообщение.Тексты.Добавить
(ПочтовоеСообщениеТекст
,
ТипТекстаПочтовогоСообщения.HTML
);
Почта.Послать
(ПочтовоеСообщение
);
Почта.Отключиться
();
КонецПроцедуры
Заметим, что в нашем примере в случае, если SMTP-сервер не смог отправить электронное сообщение адресату (-ам), то метод Почта.Послать(ПочтовоеСообщение) генерировал исключение. Это вызывало у разработчиков определенные неудобства, т.к. была не очевидна причина генерации исключения.
В редакции 8.3.9 данное поведение изменилось, и теперь метод Послать() возвращает соответствие, ключом которого является адресат, а значением – диагностика от почтового сервера. Это позволяет точно определить причины неудачной отправки почтового сообщения каждому из адресатов. В режиме совместимости с версией 8.3.8 поведение не изменилось.
Двусторонняя печать
В платформе 8.2 двусторонней печатью сама платформа не управляла, управлять этой функцией возможно было только с помощью драйвера принтера.
В платформе 8.3 появилась возможность управления двусторонней печатью для табличного документа, графической схемы (из встроенного языка и интерактивно) и текстового документа (только интерактивно).
Во встроенном языке появились системные перечисления:
- ТипДвустороннейПечати (Нет, ПереворотВверх, ПереворотВлево);
- (Авто, ЗеркальноСверху, ЗеркальноСлева, НеИспользовать).
А у объектов ТабличныйДокумент и ГрафическаяСхема появились свойства ДвусторонняяПечать и ЧередованиеРасположенияСтраниц , при помощи которых можно изменять расположение напечатанных страниц.
В редакции платформы 8.3.9 у системного перечисления ТипДвустороннейПечати добавилось новое значение ИспользоватьНастройкиПринтера . Выбор данного значения позволил использовать настройки принтера при печати документов системы. В режиме совместимости с версией 8.3.8 поведение не изменилось и соответствующие настройки принтера игнорируются.
Диалог публикации информационной базы на веб-сервере сделан более функциональным. Теперь публикация из конфигуратора позволяет задавать все параметры файла default.vrd .
Для диалога публикации веб-клиента и Web-сервисов через конфигуратор реализована:
- возможность управления доступностью Web-сервисов по умолчанию (атрибут pointEnableCommon элемента ws );
- возможность управления исполнением фоновых заданий в файловом варианте (атрибут allowexecutescheduledjobs элемента ws ).
Если флажок “Публиковать Web-сервисы по умолчанию” на закладке “Основные” установлен, то при обновлении публикации выбранные Web-сервисы будут опубликованы автоматически.
В противном случае Web-сервисы будут отмечены как непубликуемые. Этому флажку соответствует атрибут pointEnableCommon элемента ws в файле default.vrd , предназначенном для настройки веб-клиента и Web-сервисов.
Атрибут pointEnableCommon элемента ws отвечает за возможность использования в данной информационной базе Web-сервисов, которые опубликованы без явного указания разрешения использования (атрибут enable элемента point ).
Если атрибут имеет значение true , то все Web-сервисы, для которых явно не указано значение атрибута enable элемента point , будут разрешены для использования.
В противном случае использование таких Web-сервисов будет запрещено.
Настройка “Фоновые задания в файловом режиме” соответствует атрибуту allowexecutescheduledjobs элемента ws в файле default.vrd .
Атрибут allowexecutescheduledjobs управляет возможностью исполнения регламентных заданий расширением веб-сервера для файлового варианта информационной базы.
Атрибут может принимать следующие значения:
- off – в этом случае расширение веб-сервера не будет выполнять регламентные задания. Выполнять регламентные задания будет клиентское приложение (если таковое существует), которое подключается к информационной базе напрямую, без использования веб-сервера.
- force
– в этом случае расширение веб-сервера будет выполнять регламентные задания.
Если значение этого атрибута не задано, то регламентные задания будет выполнять то приложение, с помощью которого будет осуществлено первое подключение к информационной базе.
Окно публикации на веб-сервисе в актуальном релизе платформы стало еще более удобным и эргономичным. Теперь параметры, описывающие OpenID-аутентификацию, вынесены на отдельную вкладку.
Нумерация объектов информационной базы
В платформе 8.3 переработан механизм автоматической нумерации объектов информационной базы. Контроль уникальности номера или кода (в том числе и полученного в результате автоматической генерации номера или кода) всегда производится во время записи объекта.
В текст сообщения о нарушении уникальности номера или кода добавлено указание, какой номер или код не уникален.
Изменилось использование освободившегося номера или кода. Новый номер или код назначается без использования освободившихся номеров или кодов, если есть уже выданные номера или коды с большим (по порядку) префиксом номера или кода.
Агрегатные функции языка выражений системы компоновки данных
В языке выражений системы компоновки данных реализованы новые агрегатные функции:
- Каждый();
- Любой();
- СтандартноеОтклонениеГенеральнойСовокупности();
- СтандартноеОтклонениеВыборки();
- ДисперсияВыборки();
- ДисперсияГенеральнойСовокупности();
- КовариацияГенеральнойСовокупности();
- КовариацияВыборки();
- Корреляция();
- РегрессияНаклон();
- РегрессияОтрезок();
- РегрессияКоличество();
- РегрессияR2();
- РегрессияСреднееX();
- РегрессияСреднееY();
- РегрессияСреднееSXX();
- РегрессияСреднееSYY();
- РегрессияСреднееSXY().
Как видно из названий, это статистические функции, значит, у разработчиков появилась возможность создавать сложные отчеты, не прибегая к разработке процедур расчета статистических данных.
Для увеличения нажмите на изображение.
Как видно по рисунку, в выпадающем списке нет новых функций, однако если ввести их вручную, то сообщения об ошибке не будет, а отчет будет сформирован:
Также представляет интерес новая функция КлассификацияABC() . Результатом работы функции будет номер класса, начиная с 1 (1 соответствует классу А, 2 – классу B, 3 – классу C и т.д.).
Продемонстрируем работу этой функции. Создадим новый внешний отчет “Классификация товаров” на основе запроса:
ВЫБРАТЬ
РасходТовараТовары.Товар
,
РасходТовараТовары.Количество
ИЗ
Документ.РасходТовара.Товары
КАК
РасходТовараТовары
Определим новое вычисляемое поле Класс :
Для увеличения нажмите на изображение.
Произведем настройку ресурсов следующим образом:
Для увеличения нажмите на изображение.
В пользовательском режиме отчет выглядит следующим образом:
В заключение отметим, что от редакции к редакции в платформе 1С 8.3 механизм СКД постоянно улучшается и дорабатывается, и в рамках нашей “новичковой” статьи данные изменения привести в полном виде не представляется возможным. Да это и кажется излишним, т.к., работая на актуальной версии платформы, вы всегда можете воспользоваться различными справочными системами для помощи с разбором того или иного аспекта работы данного механизма.
Кроме того, не забывайте и про наш отдельный курс Профессиональная разработка отчетов в 1С 8.3 на Системе Компоновки Данных , который до атома разбирает все тонкости и подводные камни при работе с данным механизмом. Посмотрите сами демо и .
Итак, давайте подведем промежуточные итоги. До этого момента мы познакомились и с новыми возможностями интерфейса «Такси» и управляемых форм, а также с некоторыми ранее не предоставляемыми возможностями самой платформы. Теперь настало время посмотреть, какие удобные возможности стали доступны и разработчику в конфигураторе.
Вынесенный нами в заголовок статьи вопрос является актуальным для многих системных администраторов, работающих с данным продуктом. По мере возможностей мы стараемся рассказывать о параметрах, влияющих на производительность 1С и развенчивать популярные мифы. Сегодня, на примере одного недавнего случая, мы хотим рассказать вам об еще одном аспекте, способном серьезно влиять на производительность - регламентных заданиях.
Начнем с реального случая. Не так давно к нам обратился один наш клиент с жалобой на "тормоза" 1С у одного из его сотрудников. Симптомы выражались в том, что через некоторый промежуток времени конфигурация Управление Торговлей 10 начинала сильно тормозить, а проще говоря подвисала на какое-то время.
При более подробном разборе ситуации выяснилось, что это происходит только у одного сотрудника, причем на любом рабочем месте, происходит давно, но если раньше "тормоза" продолжались около секунды, то теперь, после обновления, они могут продолжаться до 15-20 секунд, что делает работу крайне некомфортной.
В принципе, исходных данных уже достаточно, чтобы сделать первые выводы. Приведем их еще раз:
- "Тормоза" происходят постоянно, с определенной периодичностью
- "Тормозит" только у одного пользователя
- "Тормозит" на любом рабочем месте
Чтобы подтвердить свои догадки заглянем в Настройки параметров учета :
Действительно, "проблемный" пользователь указан как пользователь для выполнения регламентных заданий. Как выяснилось, когда-то давно от имени этого пользователя работало задание автообмена РИБ. Осталось посмотреть, что именно являлось причиной эпизодического "торможения". Это тоже несложно сделать:
А вот и "виновник торжества" - задание обновления индекса полнотекстового поиска, которое запускалось один раз в 2,5 минуты. В данном случае проблема была полностью решена отключением выполнения регламентных заданий под этим пользователем, однако это не всегда возможно или целесообразно, поэтому ниже мы рассмотрим каким образом можно управлять регламентными заданиями и как сделать так, чтобы они не оказывали негативного влияния на производительность.
Обычное приложение
В конфигурациях на основе обычного приложения единого инструментария для управления регламентными заданиями нет. Во многом это связано с тем, что на момент их первоначальной разработки сама концепция регламентных заданий была развита довольно слабо.
Управление многими регламентными заданиями производится через настройку связанных с ними подсистем. Например, настройки регламентных заданий, связанных с обменом данными следует искать в настройках обмена, связанные с ЕГАИС в настройках торговлей алкоголем и т.д.
На первый взгляд все довольно логично, но отсутствие единого инструмента затрудняет возможность контроля за настроенными регламентными заданиями и оптимальностью их настроек. Хорошо, если заданий одно - два, а если их больше или, как в нашем случае, есть подозрение на какое-либо из регламентных заданий, но вы не имеете представления кто и что настраивал в этой базе.
В этом случае следует воспользоваться внешней обработкой КонсольЗаданий (JobsConsole ), которая входит в набор стандартных обработок на диске ИТС. Обработка предоставляет единый интерфейс для всех заданий и позволяет выполнять их централизованную настройку, а также контролировать выполняющиеся в текущее время задания.
Данный список нужно тщательно изучить, все ненужные задания следует отключить, а у нужных привести расписание в соответствие с насущными потребностями и здравым смыслом. Например, в нашем случае, нет никакой необходимости обрабатывать ответы ЕГАИС раз в 30 секунд (эта настройка сделана для тестирования) и в рабочем режиме вполне достаточно будет делать это скажем раз в полчаса.
Управляемое приложение
В конфигурациях на основе управляемого приложения регламентным заданиям отведена более значительная роль, с их помощью могут выполняться различные задания по обслуживанию информационной базы и поддержанию ее в актуальном состоянии, но в тоже время именно регламентные задания чаще всего становятся причиной "тормозов".
Для управления регламентными заданиями предназначен отельный пункт в меню Администрирование - Поддержка и обслуживание .
Сразу можно отметить, что заданий значительно прибавилось (для примера мы взяли одну и ту же конфигурацию - Розница) и их грамотная настройка способна существенно улучшить производительность информационной базы. Настройки по умолчанию выполнены 1С исходя из потребностей средней сферической фирмы в вакууме и не являются оптимальными даже близко.
Прежде всего отключаем то, что явно ненужно, с чем вы не работаете. Потом оптимизируем расписание редко используемых функций, скажем обновление классификатора банков в Рознице, как и проверку контрагентов, можно проводить раз в неделю в нерабочее время или в конце (начале) рабочего дня.
Отдельное внимание следует уделить всему, что связано с поисковым индексом. Полнотекстовый поиск безусловно удобная вещь, но работа с его индексом является весьма и весьма ресурсоемкой задачей. Поэтому не стоит впадать в крайность и отказываться от него, но следует серьезно пересмотреть и настроить его параметры.
Начнем с извлечения текста , данная операция позволяет производить поиск по содержимому приложенных файлов, поэтому если вы не используете их, не производите поиск по ним, или у вас там одни изображения - то данную операцию можно отключить, в любом случае выполнять ее раз в 85 секунд - явный перебор.
Обновление индекса ППД - одна из самых ресурсоемких операций, по умолчанию выполняется раз в минуту.
А теперь подумаем, как часто в базе добавляется либо обновляется информация, по которой вы наиболее часто проводите поиск? Явно не каждую минуту, поэтому вполне достаточно будет обновлять индекс гораздо реже: раз час, раз в день или вообще раз в неделю.
Тоже самое относится и к слиянию индекса ППД , если вы обновляете индекс раз в день, то следует настроить слияние на выполнение раз в неделю, при этом выбрав в качестве начала задания наименее мешающее работе время.
Эти несложные операции позволят вам без особого ущерба для функциональности конфигурации поднять комфортность работы с ней на новый уровень за счет отказа от частого выполнения достаточно ресурсоемких операций. Только не следует впадать в крайности, грамотно рассудите, насколько вам необходимы те или иные возможности и как часто следует выполнять связанные с ними задания.
Теги:
Позволяет нам производить какие-либо вычисления в системе незаметно для пользователя, то есть в фоне. Более того данный механизм позволяет нам распараллелить процесс вычисления. Распараллелить мы можем даже процедуру, которая будет выполняться. Для этого наше фоновое задание должно запускать еще несколько фоновых заданий. В этом случае процессы распараллеливаются и, если у нас многопроцессорная, многоядерная система, наш алгоритм будет работать эффективно. После запуска нескольких процессов мы можем сказать системе, что необходимо дождаться окончания выполнения этих процессов для того, чтобы потом каким-то образом свести результат.
К примеру, в типовых конфигурациях, в то время как пользователь работает, происходит выполнение различного рода сервисных фоновых заданий. Об этом может свидетельствовать записи журнала регистрации, в котором фиксируется факт выполнения таких действий. Причем на работу пользователя это никак не влияет, он просто их не замечает.
В идеале фоновое задание реализуется в варианте клиент-сервер, в этом случае вся нагрузка переходит на сервер. Что касается файлового варианта, то работа фонового задания возможна, но она имеет некоторые особенности.
Вот что выдаст система если не учесть эти особенности, и запустить фоновое задание в файловом варианте информационной базы.
1С фоновое задание имеет некоторые ограничения. Поскольку оно выполняется на стороне сервера, то нет возможности интерактивной работы с пользователем. К примеру нельзя вывести сообщение, ну и вообще какую-то информацию. Все эти данные нужно сохранять в рамках информационной базы и дальше каким-то образом обрабатывать.
Обратившись к синтакс-помощнику можно получить более детальные сведения о фоновых заданиях 1С. Здесь следует отметить, что это объект исключительно программный и он никак не сохраняется в базе данных. То есть мы создаем экземпляр класса, инициализируем свойства и запускаем его на выполнение.
Какие же средства мы имеем для управления фоновыми заданиями? Этим средством является объект метаданных"МенеджерФоновыхЗадания" . У этого объекта есть метод "Выполнить" , с помощью этого метода, как раз и запускается фоновое задание.
Имеет он следующие параметры:
"ИмяМетода"
- имя процедуры или функции, которую нужно выполнить, причем это должна быть процедура или функция серверного контекста;
"Параметры" - массив параметров, количество элементов которого должно соответствовать количеству параметров нашей процедуры/функции, указанной в параметре "ИмяМетода" ;
"Ключ" - некий ключ уникальности, представляющий из себя строчку, по которой система понимает нужно ли запускать фоновое задание либо такое задание уже запущено;
"Наименование" - здесь можно указать произвольное описание нашего метода.
Возвращаемым значением является объект "ФоновоеЗадание" , содержащий текущее имя метода, текущий ключ и еще несколько свойств и методов. Одним из таких методов является метод "ОжидатьЗавершения" . Его задачей является то, что мы может указать системе, чтобы ничего не производилось пока не будет завершено фоновое задание.
Фоновое задание 1С 8.2, 8.3 - Пример использования
Приведем пример работы с фоновыми заданиями 1С. Сначала создадим простой алгоритм, который будет ненадолго загружать систему 1С таким образом, чтобы мы ничего не могли в это время делать.
Для этого:1. Создадим общий модуль "ОбработчикиФоновыхЗаданий" , который будет компилироваться на стороне сервера;
2. Опишем в нем экспортную процедуру "ПроизветиФоновоеВычисление(Параметр)" , которая принимает один параметр строкового типа;
Процедура ПроизветиФоновоеВычисление(Параметр) Экспорт ВремНач = ТекущаяДата() ; Пока ТекущаяДата() - ВремяНач < = 6 Цикл КонецЦикла ; КонецПроцедуры Процедура КнНажатие() ОбработчикиФоновыхЗаданий. ПроизветиФоновоеВычисление("Какой-то параметр" ) ; КонецПроцедурыГотово. Теперь при запуске обработки и нажатии на кнопку происходит подвисание системы на несколько секунд, в процессе которого ничего нельзя сделать. Это как раз то, что нам и нужно было сделать.
Теперь обеспечим произведение этих вычислений в фоне, то есть чтобы фоновое задание 1С 8.2, 8.3 выполнялось, но нам не мешало.
Для этого:1. В обработке, в событии нажатия кнопки пропишем следующий код.
Процедура КнНажание() Параметры = Новый Массив; Параметры. Добавить("Какой-то параметр" ) ; ФоновоеЗадание. Выполнить ("ОбработчикиФоновыхЗаданий.ПроизветиФоновоеВычисление" , Параметры, Новый УникальныйИдентификатор, "Тестовое задание" ) ; КонецПроцедурыЗдесь первым параметром мы передаем имя процедуры общего модуля, а вторым - массив параметров. Третьим параметром нужно передать уникальный ключ и четвертым некоторое описание нашей процедуры.
Фоновые задания в «1С» могут запускаться автоматически по расписанию (т.е. являться экземплярами регламентных заданий), или разработчик сам может инициировать запуск фонового задания для выполнения произвольного алгоритма (яркий пример формирование отчетов в фоне).ВАЖНО!!! Для файловых баз, начиная с версии платформы 8.3.3.641, не требуется запуск отдельного сеанса, в котором будут выполняться фоновые задания. Т.е. раньше в файловых базах для запуска фоновых заданий требовалось выполнять метод глобального контекста «ВыполнитьОбработкуЗаданий()» . Подробности по этой ссылке .
Процедура запуска произвольного алгоритма в фоновом задании
Для запуска нашего алгоритма в отдельном фоновом задании, мы будем использовать метод «Выполнить()» менеджера фоновых заданий: Синтаксис: Выполнить(<ИмяМетода>, <Параметры>, <Ключ>, <Наименование>)- <ИмяМетода> (обязательный); Тип: Строка
Имя экспортируемой процедуры или функции неглобального общего модуля, который может быть выполнен на сервере, в форме ИмяМодуля.ИмяМетода. - <Параметры> (необязательный); Тип: Массив
Массив параметров, передаваемых в метод. Количество и типы параметров должны соответствовать параметрам метода. (подробнее в Синтакс-помощнике) - <Ключ> (необязательный); Тип: Строка
Если ключ задан, то он должен быть уникальным среди ключей активных фоновых заданий, имеющих такое же имя метода, что и у данного фонового задания. - <Наименование> (необязательный); Тип: Строка.
Описание задания.
Процедура выполнения фонового задания
В нашем случае мы будем использовать экспортную процедуру расположенную в общем модуле «ОбщийМодульСервер» (думаю излишне пояснять что модуль должен быть серверным) Процедура ЗаписатьИнформациюОТоварахВФоне(ПараметрФоновогоЗадания) Экспорт ЗапросДанных = Новый Запрос("ВЫБРАТЬ | Товары.Ссылка КАК Номенклатура |ИЗ | Справочник.Номенклатура КАК Товары"); Выборка = ЗапросДанных.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл МЗ = РегистрыСведений.ДанныеОТоварах.СоздатьМенеджерЗаписи(); МЗ.Период = ТекущаяДата(); МЗ.Номенклатура = Выборка.Номенклатура; МЗ.Информация = ПараметрФоновогоЗадания; МЗ.Записать(); КонецЦикла; КонецПроцедуры В целях демонстрации работы фонового задания, мы будем формировать записи в нашем регистре сведений, для каждой номенклатуры, при этом параметр будет передаваться из формы в которой происходит запуск фонового задания.Команда запуска фонового задания
Параметр который будем передавать в процедуру выполнения, будем брать из реквизита управляемой формы (реквизит с типом «Строка»):Код модуля управляемой формы будет выглядеть следующим образом: &НаКлиенте Процедура ЗапускФоновогоЗадания(Команда) ЗапускФоновогоЗаданияНаСервере(); КонецПроцедуры &НаСервере Процедура ЗапускФоновогоЗаданияНаСервере() // Формируем массив с параметрами ПараметрыЗадания = Новый Массив; ПараметрыЗадания.Добавить(ПараметрЗадания); // Запускаем фоновое выполнение алгоритма ФоновыеЗадания.Выполнить(// Наш экспортный метод в общем модуле "ОбщийМодульСервер.ЗаписатьИнформациюОТоварахВФоне", // Передаем массив с параметрами ПараметрыЗадания, // Указываем ключ задания Новый УникальныйИдентификатор, // Указываем наименование фонового задания "Наше фоновое задание"); КонецПроцедуры
Результат выполнения
В результате выполнения фонового задания, будут сформированы записи в регистре сведений (что нам и требовалось).Регламентные задания в 1С предназначены для выполнения определенных процедур по расписанию, с некоторой периодичностью.
Регламентные задания хранятся в информационной базе, имеют расписание запуска. Сам запуск производится полностью автоматически, если режим работы информационной базы клиент-серверный. Если же база файловая, то необходимо выполнить следующие действия:
- выделить специального пользователя для выполнения регламентных заданий;
- должна быть открыта база под этим пользователем, в которой периодически должна выполняться функция ВыполнитьОбработкуЗаданий().
Создание регламентного задания
Регламентные задания — объект метаданных конфигурации 1С. Находится в группе Общие. Рассмотрим параметры и свойства регламентных заданий.
Имя метода — путь к экспортной процедуре в общем модуле, которая будет выполняться по заданному расписанию. Процедура должна выполняться на сервере. В этом регламентные задания чем-то похожи на объект Подписка на событие.
Ключ — позволяет создать несколько регламентных заданий одного типа. Например, выполнение синхронизации данных между несколькими информационными базами может быть реализовано с помощью одного объекта метаданных РегламентноеЗадание , при этом самих регламентных заданий будет создано несколько (по количеству баз для обмена). Различаться эти регламентные задания будут с помощью свойства Ключ. Одновременно может выполняться только одно задание с одинаковым ключом.
Использование — флаг, показывающий, включено ли регламентное задание.
Предопределенное — здесь можно провести аналогию с предопределенными элементами справочника. Предопределенные элементы создаются в конфигураторе и применяются пользователями в работе. Обычные элементы пользователь создает сам. С регламентными заданиями точно так же: если оно предопределенное, то оно существует и может выполняться по расписанию сразу после создания в конфигураторе. Если же флаг Предопределенное не установлен, то пользователю нужно самому создать одно или несколько регламентных заданий данного типа (например, через Консоль заданий ).
Количество повторов при аварийном завершении задания — определяет, сколько раз будет выполнен перезапуск фонового задания, если оно было завершено с ошибкой.
Интервал повтора при аварийном завершении задания — определяет, с какой периодичностью будет выполнен перезапуск фонового задания, если оно было завершено с ошибкой.
Программная работа с регламентными заданиями
В данных примерах будем рассматривать работу с обычными, не предопределенными, регламентными заданиями.
Программное создание регламентного задания
//Создаем задание
"ИмяРегдаментногоЗадания"
)
;
//Устанавливаем ключ регламентного задания (не обязательно)
Задание.
Ключ =
"КлючЗадания"
;
//Включаем регламентное задание
Задание.
Использование =
Истина
;
//Записываем регламентное задание
Задание.
Записать()
;
Программное получение регламентного задания для изменения параметров
В этом примере предположим, что существует только одно регламентное задание данного типа. Если заданий несколько, то, зная , нетрудно внести в код соответствующие изменения.
"ИмяРегламентногоЗадания"
]
)
)
;
Если
Задания.
Количество()
>
0
Тогда
Задание=
Задания[
0
]
;
Иначе
Задание =
РегламентныеЗадания.
СоздатьРегламентноеЗадание("ИмяРегламентногоЗадания"
)
;
КонецЕсли ;
//Регламентное задание находится в переменной Задание. Можно изменять его параметры.
Вызов диалога изменения расписания регламентного задания
Для работы с расписанием регламентного задания существует особый тип диалога. Все еще предполагаем, что у нас есть только одно регламентное задание данного типа.
//Получаем массив с регламентными заданиями нужного типа
Задания=
РегламентныеЗадания.
ПолучитьРегламентныеЗадания(новый Структура("Метаданные"
,
Метаданные.
РегламентныеЗадания[
"ИмяРегламентногоЗадания"
]
)
)
;
//Если задание существует, то по условию оно одно
Если
Задания.
Количество()
>
0
Тогда
Задание=
Задания[
0
]
;
//Если задания нет, создадим его
Иначе
Задание =
РегламентныеЗадания.
СоздатьРегламентноеЗадание("ИмяРегламентногоЗадания"
)
;
КонецЕсли ;
Расписание= Задание. Расписание;
//Создаем диалог изменения расписания регламентного задания
ДиалогРедактирования=
Новый
ДиалогРасписанияРегламентногоЗадания (Расписание)
;
//Показываем диалог пользователю и обрабатываем изменения расписания
Если
ДиалогРедактирования.
ОткрытьМодально()
Тогда
Задание.
Расписание =
ДиалогРедактирования.
Расписание;
Задание.
Записать()
;
КонецЕсли
;