В процессе разработки корпоративных систем на платформе 1С часто возникает задача нормативного регулирования действий пользователей. Одним из наиболее эффективных инструментов является принудительное ознакомление сотрудников с инструкциями или регламентами непосредственно в интерфейсе программы. Рассмотрим подробно, как реализовать механизм, при котором форма подтверждения открывается автоматически при входе в систему и блокирует остальной функционал до тех пор, пока пользователь не поставит «галочку» о согласии.
Прежде всего, нам необходимо место для хранения информации о том, кто и когда подтвердил свое ознакомление. Для этих целей идеально подходит Регистр сведений. Проанализируем структуру такого регистра. Мы рекомендуем создать непериодический регистр сведений СоглашенияПоРаботеСПрограммой со следующими реквизитами:
Сотрудник (тип: СправочникСсылка.Пользователи или СправочникСсылка.Сотрудники).Согласен (тип: Булево).ДатаПодписания (тип: Дата).Использование измерения Сотрудник позволит системе автоматически контролировать уникальность записей: у одного пользователя не может быть более одной записи о согласии, что значительно упрощает последующую проверку.
Разберем, в каком месте кода лучше всего инициировать открытие формы. Платформа 1С предоставляет два основных события в модуле управляемого приложения: ПередНачаломРаботыСистемы и ПриНачалеРаботыСистемы. Выясним причину, почему для нашей задачи подходит именно второе.
Процедура ПередНачаломРаботыСистемы выполняется на очень раннем этапе, когда клиентское приложение еще не до конца инициализировано. Попытка открыть форму в этот момент может привести к некорректной работе веб-клиента или проблемам с отображением окон. Напротив, в процедуре ПриНачалеРаботыСистемы вся инфраструктура клиента готова. Рассмотрим пример кода в модуле управляемого приложения:
Процедура ПриНачалеРаботыСистемы()
// Вызываем процедуру открытия формы ознакомления
ПараметрыОткрытия = Новый Структура;
ОткрытьФорму("Обработка.ПодтверждениеОбОзнакомленииСИнструкциями.Форма", ПараметрыОткрытия, , , , , , РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры
Обратите внимание на параметр РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс. Это критически важный момент для соблюдения регламента: форма откроется поверх всех окон и не позволит пользователю перейти к журналам документов или отчетам, пока он не выполнит требуемое действие.
Теперь проанализируем ситуацию, когда форма не должна открываться, если пользователь уже ставил отметку ранее. Наиболее элегантным решением будет проверка условия непосредственно внутри формы обработки в событии ПриСозданииНаСервере. Если проверка показывает, что согласие уже есть, мы просто отменяем создание формы.
Рассмотрим реализацию серверной проверки кода:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Определяем текущего пользователя системы
ТекущийПользовательСистемы = Пользователи.ТекущийПользователь();
// Выполняем запрос к регистру сведений для проверки наличия отметки
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Соглашения.Согласен КАК Согласен
|ИЗ
| РегистрСведений.СоглашенияПоРаботеСПрограммой КАК Соглашения
|ГДЕ
| Соглашения.Сотрудник = &Сотрудник";
Запрос.УстановитьПараметр("Сотрудник", ТекущийПользовательСистемы);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Если флаг согласия уже установлен, отменяем открытие формы
Если Выборка.Согласен Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Использование метода Отказ = Истина позволяет «тихо» закрыть форму еще до того, как она отобразится на экране пользователя. Таким образом, те, кто уже ознакомился с инструкцией, даже не заметят попытки открытия окна.
В обсуждениях часто встречается подход поиска пользователя по наименованию (строке). Мы настоятельно рекомендуем избегать этого. Сравнение строк ПользователиИнформационнойБазы.ТекущийПользователь().ПолноеИмя с наименованием в справочнике ненадежно, так как полные имена могут меняться или дублироваться.
Лучше всего использовать Параметры сеанса. Если ваша конфигурация использует БСП (Библиотеку стандартных подсистем), используйте ПараметрыСеанса.ТекущийПользователь. Если конфигурация самописная, создайте аналогичный параметр сеанса и заполняйте его при старте. Это гарантирует связь по ссылке (Уникальному идентификатору), что исключает любые ошибки идентификации.
Важно понимать, что обычная «галочка» в базе данных имеет ограниченную юридическую силу. Чтобы такое подтверждение могло служить доказательством в спорных ситуациях, проанализируем следующие рекомендации:
ИмяКомпьютера(), а также IP-адрес пользователя.ВерсияИнструкции. При запуске сравнивайте версию в регистре с актуальной версией документа. Если они не совпадают — открывайте форму снова.Если ваши сотрудники работают через браузер, следует учитывать механизмы блокировки всплывающих окон. Платформа 1С обходит эти ограничения при использовании стандартных методов ОткрытьФорму, но только если вызов инициирован действием пользователя или правильно встроен в цепочку запуска. Именно поэтому перенос кода из ПриСоздании формы в событие ПриНачалеРаботыСистемы модуля приложения является ключом к стабильной работе блокировки интерфейса в веб-клиенте.
Посмотрим на финальный алгоритм действий пользователя:
ПриНачалеРаботыСистемы.Следуя этим шагам, мы создаем надежный и отказоустойчивый механизм контроля знаний и регламентов внутри системы 1С.