Работа пользователя и фоновые процессы: где проходит граница в 1С
Содержание
Интерактивный режим в 1С — это работа, которую выполняет живой пользователь через формы: открыл документ, нажал «Провести», ответил на вопрос программы. Противоположность — фоновый режим, где код работает без окон и без человека: регламентные задания, обмены, длительные отчёты.
Разница не косметическая. В интерактивном режиме можно показать форму, задать вопрос, вывести предупреждение. В фоновом — нельзя: окно некому показать. Отсюда отдельные «интерактивные» права в ролях, ошибки про модальные окна и разное поведение одного и того же кода. Всё ниже относится к платформе 8.3 и общее для типовых конфигураций.
Интерактивный режим 1С: суть и признаки
Платформа различает, кто инициировал действие. Если команду вызвал пользователь из формы — это интерактивное действие. Если тот же объект записал код (обработка, обмен, регламентное задание) — программное.
Признаки интерактивного сеанса:
- 👤 есть пользователь за экраном и клиентское приложение (тонкий, толстый или веб-клиент);
- 🪟 открываются формы, работают диалоги и оповещения;
- 🔘 действия запускаются кнопками и командами интерфейса;
- 🔐 проверяются интерактивные права роли — «Интерактивное добавление», «Интерактивное удаление» и другие.
Фоновый сеанс в консоли кластера виден с приложением «Фоновое задание». Интерактивный — «Тонкий клиент», «Толстый клиент» или «Веб-клиент». По этой колонке администратор быстро понимает, кто сейчас нагружает сервер: люди или задания.
Интерактивные права ограничивают только действия через интерфейс. Код с привилегиями или с правом «Удаление» удалит объект, даже если «Интерактивное удаление» у роли снято.
Какие права в ролях называются интерактивными
У объектов конфигурации есть пары прав: обычное и интерактивное. Обычное разрешает действие вообще, в том числе из кода. Интерактивное — только через формы и кнопки.
| Интерактивное право | Что разрешает пользователю | У каких объектов |
|---|---|---|
| Интерактивное добавление | Создать новый элемент кнопкой «Создать» | Справочники, документы, планы видов характеристик |
| Интерактивная пометка удаления | Поставить пометку удаления | Справочники, документы |
| Интерактивное снятие пометки удаления | Снять пометку | Справочники, документы |
| Интерактивное удаление | Удалить объект сразу, без пометки | Справочники, документы |
| Интерактивное удаление помеченных | Удалить помеченные объекты обработкой | Справочники, документы |
| Интерактивное проведение | Провести документ из формы | Документы |
| Интерактивная отмена проведения | Отменить проведение кнопкой | Документы |
| Интерактивное изменение проведенных | Редактировать уже проведённый документ | Документы |
Интерактивное право не может быть шире обычного. Если у роли нет права «Удаление», флажок «Интерактивное удаление» не даст ничего.
Сеансы, которые не относятся ни к одному из режимов
Кроме пользователей и фоновых заданий, к базе подключаются внешние программы: через COM-соединение, веб-сервисы, HTTP-сервисы, OData. В таких сеансах тоже нет форм и диалогов. С точки зрения кода они ближе к фону: всё выполняется на сервере, вопросы показать некому. Отличие в том, что запрос приходит извне, а не по расписанию внутри базы.
Чем интерактивный режим отличается от фонового
| Параметр | Интерактивный режим | Фоновый режим |
|---|---|---|
| Кто запускает | Пользователь в клиенте | Код, расписание, другое задание |
| Формы и диалоги | Доступны | Недоступны |
| Где выполняется код | Клиент и сервер | Только сервер (в файловом варианте — внутри процесса клиента) |
Сообщения Сообщить() | Сразу в окне сообщений | Накапливаются, их забирает вызывающий код |
| Права | Проверяются обычные и интерактивные | Интерактивные не участвуют |
| Влияние на интерфейс | Пока операция идёт, форма ждёт | Пользователь работает дальше |
| Видно в консоли кластера | «Тонкий клиент», «Веб-клиент» | «Фоновое задание» |
Главное практическое следствие: тяжёлая операция в интерактивном режиме «замораживает» окно. Та же операция в фоне отдаёт управление пользователю сразу, а результат приходит позже.
Файловая база — особый случай
В файловом варианте нет сервера кластера. Фоновые задания исполняет процесс одного из запущенных клиентов. Регламентные задания там работают, только пока открыт сеанс, которому это разрешено, например клиент с параметром запуска /AllowExecuteScheduledJobs -Force. Если базу никто не открыл, расписание стоит.
Когда работает интерактивный режим: примеры из практики
Несколько ситуаций, где граница «пользователь — фон» видна бухгалтеру и администратору.
Формирование отчётов. В БП 3.0, ЗУП 3.1 и УТ 11 многие отчёты строятся длительной операцией: пользователь нажал «Сформировать», а сам расчёт ушёл в фоновое задание. Поэтому во время построения можно переключиться на другую вкладку.
Удаление объектов. Рядовой пользователь в типовой конфигурации ставит только пометку удаления. Само удаление выполняет обработка удаления помеченных, на которую нужно право «Интерактивное удаление помеченных». Это защита от случайной потери данных.
Проведение документов. Кнопка «Провести» — интерактивное проведение, для него у роли должно быть право «Интерактивное проведение». Групповое перепроведение обработкой — уже программная запись.
Регламентные задания. Загрузка курсов валют, обмен с банком, обновление классификаторов идут в фоне по расписанию. Их видно в Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания (в ЗУП и УТ раздел называется «Поддержка и обслуживание»).
Обмены данными. Синхронизация по расписанию — фон. Ручной запуск кнопкой «Синхронизировать» — интерактивное начало, но сам обмен всё равно выполняется длительной операцией.
Пакетный запуск. Администратор запускает обработку из командной строки ночью. Сеанс формально клиентский, но человека за экраном нет. Любой вопрос с кнопкой «Да/Нет» здесь подвесит процесс до утра.
Как ограничить или отключить интерактивный режим: пошагово
Единого переключателя «интерактивный режим вкл/выкл» в 1С нет. Задача решается тремя способами — в зависимости от того, что нужно.
| Цель | Способ | Кто делает |
|---|---|---|
| Запретить пользователям конкретное действие через интерфейс | Снять интерактивное право в роли | Разработчик или администратор |
| Временно выгнать людей, оставив фоновые задания | Блокировка начала сеансов | Администратор |
| Запустить базу без вопросов и окон | Параметры командной строки | Администратор |
Способ 1. Интерактивные права в роли
- Откройте базу в Конфигураторе.
- В дереве конфигурации раскройте ветку
Общие → Ролии откройте нужную роль. - Выберите объект — справочник, документ, регистр.
- В правой части снимите флажки нужных прав: «Интерактивное удаление», «Интерактивная пометка удаления», «Интерактивное проведение» и т. п.
- Сохраните и обновите конфигурацию базы данных.
Правка типовой роли снимает конфигурацию с полной поддержки и усложняет обновления. В типовых конфигурациях удобнее создать свою роль в расширении или настроить профиль групп доступа в режиме «Предприятие»: Администрирование → Настройки пользователей и прав → Профили групп доступа.
Способ 2. Блокировка интерактивных сеансов
Нужна, когда пользователей надо вывести из базы на время обновления или закрытия месяца.
- Откройте
Администрирование → Обслуживание → Блокировка работы пользователей(в ЗУП и УТ —Поддержка и обслуживание). - Укажите текст сообщения, время начала и окончания.
- Установите блокировку. Пользователи получат предупреждение и через несколько минут будут отключены.
В клиент-серверной базе то же делается в консоли кластера. Свойства информационной базы → флажок «Блокировка начала сеансов включена». Отдельный флажок «Блокировка регламентных заданий включена» останавливает фон. Так видно, что интерактивные и фоновые сеансы управляются раздельно.
Блокировка обрывает работу пользователей. Несохранённые документы будут потеряны. Включайте её после предупреждения и в согласованное окно.
Способ 3. Запуск без диалогов
Для ночных и пакетных запусков у 1cv8.exe есть параметры, подавляющие интерактивные окна:
"C:\Program Files\1cv8\<версия>\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /N"Robot" /P"пароль" /Execute"D:\Scripts\nightly.epf" /DisableStartupDialogs /DisableStartupMessages
/DisableStartupDialogs— не показывать диалог выбора базы и окно авторизации;/DisableStartupMessages— не показывать стартовые предупреждения;/Execute— сразу выполнить внешнюю обработку .
Сама обработка тоже не должна задавать вопросов. Если в ней есть ПоказатьВопрос, процесс повиснет.
Интерактивный режим и скорость работы 1С
Пользователь ощущает «тормоза» именно в интерактивном режиме: окно не отвечает, пока сервер считает. Что реально помогает:
- ⏳ Переносить тяжёлое в фон. Пересчёт остатков, массовое перепроведение, выгрузку больших файлов лучше выполнять фоновым заданием или ночью.
- 🗓️ Разводить расписание. Регламентные задания с большой нагрузкой (полнотекстовый индекс, обмены) ставьте на нерабочее время. В рабочий день они конкурируют с людьми за ресурсы.
- 📉 Сокращать клиент-серверные вызовы. Каждое обращение формы к серверу — сетевой обмен. На медленном канале 20 лишних вызовов при открытии формы заметны глазом.
- 🖥️ Следить за файловой базой. Фоновые задания в ней едят ресурсы клиента. Если у бухгалтера всё виснет каждый час, проверьте, не на его компьютере крутится обмен.
- 🧹 Не держать десятки открытых форм. Каждая форма живёт в памяти клиента и на сервере.
Если тормозит только один пользователь, а у остальных всё нормально, начните с его компьютера и канала связи, а не с сервера.
Интерактивный режим в коде 1С: что важно разработчику
Где выполняется код
Клиентский код (&НаКлиенте) существует только в интерактивном сеансе. В фоновом задании клиента нет, работает лишь серверный код. Процедура для фонового задания должна быть экспортной и лежать в серверном общем модуле.
&НаСервереБезКонтекста
Функция ЗапуститьПересчет(ДатаРасчета)
Параметры = Новый Массив;
Параметры.Добавить(ДатаРасчета);
Задание = ФоновыеЗадания.Выполнить("РасчетыСервер.ПересчитатьОстатки", Параметры, , "Пересчёт остатков");
Возврат Задание.УникальныйИдентификатор;
КонецФункции
В типовых конфигурациях на БСП удобнее пользоваться модулем ДлительныеОперации: он сам запускает задание, показывает индикатор и возвращает результат в форму.
Как узнать, что код работает в фоне
Функция ЭтоФоновоеЗадание() Экспорт
ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы();
Возврат ТекущийСеанс.ПолучитьФоновоеЗадание() <> Неопределено;
КонецФункции
Такой флаг полезен в общих процедурах. Например, чтобы в фоне писать проблему в журнал регистрации, а в интерактиве — показывать сообщение.
Диалоги без модальности
В конфигурациях с режимом использования модальности «Не использовать» вызов Вопрос() или Предупреждение() приводит к ошибке. Используйте асинхронные аналоги:
&НаКлиенте
Процедура УдалитьСтроку(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеОтветаНаВопрос", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Удалить выбранную строку?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ПослеОтветаНаВопрос(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
Элементы.Таблица.ТекущиеДанные.Пометка = Истина;
КонецЕсли;
КонецПроцедуры
Проверка интерактивных прав в коде
Если команда формы делает то же, что стандартная кнопка, проверяйте то же право:
Если Не ПравоДоступа("ИнтерактивноеУдаление", Метаданные.Справочники.Номенклатура) Тогда
ВызватьИсключение "Недостаточно прав на удаление номенклатуры";
КонецЕсли;
Иначе своя кнопка станет обходом ограничения, которое администратор настроил в профиле.
Сообщения из фонового задания
Сообщить() в фоне не теряется: сообщения копятся у задания. Вызывающий код забирает их методом ПолучитьСообщенияПользователю() объекта фонового задания и показывает пользователю.
Ошибки, которые выдаёт граница «интерактив — фон»
Если ограничение интерактивных действий не сработало
Пользователь всё равно удаляет или проводит документы, хотя права сняты. Проверьте по порядку:
- Все группы доступа пользователя. Права складываются. Если пользователь состоит в двух группах и в одной из них право есть, оно действует.
- Флажок полных прав. Роль «Полные права» и профиль «Администратор» дают всё, включая интерактивные действия.
- Свои кнопки и обработки. Команда, написанная без проверки
ПравоДоступа(), может удалять или проводить объекты программно, в обход интерактивного права. - Привилегированный режим. Код в привилегированных общих модулях выполняется без проверки прав вообще.
- Повторный вход. Новые права применяются при начале сеанса. Попросите пользователя закрыть программу и зайти снова.