При работе в розничной торговле часто возникает ситуация, когда кассиру, работающему в Рабочем месте кассира (РМК), необходимо вызвать администратора для выполнения корректирующих операций, таких как исправление ошибочно пробитого чека или других административных действий. При этом стандартно кассир обладает ограниченными правами, а администратор – полными. Задача заключается в том, чтобы дать возможность администратору временно получить расширенные права на РМК кассира для выполнения корректировок, не требуя выхода кассира из системы и перезапуска программы.
Стандартный подход к управлению правами доступа в 1С:Предприятии 8.3 подразумевает назначение пользователям определенных ролей и профилей групп доступа. Эти настройки обычно выполняются в режиме "Конфигуратор" или в разделе "Администрирование" и требуют перезапуска программы или повторного входа пользователя для полного вступления изменений в силу. Однако, в условиях динамичной розничной торговли, перезапуск РМК для каждой корректировки крайне неудобен и замедляет работу.
Давайте рассмотрим, как можно решить эту проблему, используя программные механизмы платформы 1С.
Прежде всего, давайте выясним, почему стандартный подход "временно переназначить права" не работает так, как нам хотелось бы:
Таким образом, мы понимаем, что прямое переназначение ролей не является рабочим или безопасным решением для нашей задачи.
Наиболее эффективным и гибким способом решения этой задачи является программно-реализованное повышение прав. Этот подход выходит за рамки стандартных настроек типовой конфигурации и требует доработки кода, но при этом обеспечивает необходимую функциональность без ущерба для безопасности и удобства.
В начале мы предоставляем пользователю-кассиру более широкие права, чем обычно требуются для его повседневной работы. Например, включаем в его профиль те роли, которые необходимы администратору для корректировки данных (например, возможность изменения документов, проведения чеков коррекции). На первый взгляд это может показаться нарушением безопасности, но ключевая особенность этого метода заключается в следующем шагом.
После того как кассиру предоставлены расширенные права, мы программно урезаем его функционал в пользовательском интерфейсе РМК и в логике обработки команд. Это означает, что несмотря на наличие расширенных ролей, кассир не сможет воспользоваться ими, потому что специфические кнопки, поля или команды будут недоступны или их выполнение будет заблокировано на уровне кода. Мы реализуем это путем проверки роли текущего пользователя в различных процедурах обработки событий. Для настройки ограничений без изменения кода конфигурации можно использовать инструмент для управления доступом к формам.
Например, в модулях форм РМК или общих модулях, отвечающих за работу РМК, мы можем добавить проверки:
Если РольДоступна("Кассир") Тогда
// Скрываем или отключаем кнопки для административных операций
ЭлементыФормы.КнопкаКорректировкаЧека.Доступность = Ложь;
ЭлементыФормы.ПолеАдминистратора.Видимость = Ложь;
// Блокируем выполнение определенных команд
ОтменитьСтандартнуюОбработку = Истина;
СообщениеПользователю("У вас нет прав для выполнения этой операции.");
КонецЕсли;
Таким образом, мы контролируем, что кассир видит и что он может делать, даже если у него технически есть расширенные права.
Когда требуется выполнить административную операцию, например, корректировку чека, система должна запросить подтверждение от администратора. Мы создаем процедуру запроса пароля, которую можем разместить, например, в общем модуле или в модуле формы РМК.
Пользователи.ПроверитьПарольПользователя() или просто проверять введенный пароль на соответствие заранее определенному.
// В общем модуле или модуле формы
Функция ЗапроситьПарольАдминистратора() Экспорт
Перем ПарольВведен;
ПарольВведен = Ложь;
// Открываем форму для ввода пароля
ФормаВводаПароля = ОткрытьФорму("ОбщаяФорма.ЗапросПароляАдминистратора");
Если ФормаВводаПароля.ПарольВведен Тогда
ПарольВведен = Истина;
КонецЕсли;
Возврат ПарольВведен;
КонецФункции;
Когда администратор успешно ввел свой пароль и система подтвердила его полномочия, мы временно снимаем программные ограничения, которые были наложены на кассира. Это можно реализовать по-разному:
ПараметрыСеанса.АдминистраторАктивен = Истина). В наших проверках функционала мы теперь будем учитывать эту переменную:
Если РольДоступна("Кассир") И Не ПараметрыСеанса.АдминистраторАктивен Тогда
// Ограничения для кассира
ЭлементыФормы.КнопкаКорректировкаЧека.Доступность = Ложь;
Иначе
// Разрешенные действия для администратора
ЭлементыФормы.КнопкаКорректировкаЧека.Доступность = Истина;
КонецЕсли;
Если после успешной проверки пароля, не меняя глобальные флаги.
Процедура КорректироватьЧекНаСервере()
Если Не ЗапроситьПарольАдминистратора() Тогда
Возврат;
КонецЕсли;
// Здесь выполняем код корректировки чека, доступный только после ввода пароля
// ...
КонецПроцедуры;
Важно помнить, что снятие ограничений должно быть временным и четко контролируемым. После выполнения административной операции или по истечении заданного времени (например, 5-10 минут), флаг "администратор активен" должен быть сброшен, и ограничения должны снова вступить в силу.
Отметим, что напрямую редактировать уже пробитый фискальный чек обычно нельзя. В 1С:Рознице для исправления ошибок в фискальных данных используются специальные документы:
Администратор, используя временно расширенные права, сможет создавать, изменять и проводить эти документы коррекции, пробивая их через ККТ, если это предусмотрено законодательством и настройками ФФД (Формата Фискальных Данных). Для массового исправления ошибок подойдёт обработка для формирования чеков коррекции за период в 1С:Розница 2.3.
Рассмотрим пример, как это может выглядеть в коде.
УправлениеПравамиРМК)
// В общем модуле, например "УправлениеПравамиРМК"
// Процедура для запроса пароля администратора
Функция ПроверитьПарольАдминистратора(Пароль) Экспорт
// Здесь должна быть ваша логика проверки пароля.
// Это может быть проверка с системным пользователем,
// или с заранее определенным паролем, хранящимся где-либо безопасно.
// Пример: простой пароль для демонстрации
Если Пароль = "admin123" Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции;
// Функция для получения флага активности администратора
Функция АдминистраторАктивен() Экспорт
Если ПараметрыСеанса.Свойство("АдминистраторАктивен") Тогда
Возврат ПараметрыСеанса.АдминистраторАктивен;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции;
// Процедура для установки/сброса флага активности администратора
Процедура УстановитьАктивностьАдминистратора(Значение) Экспорт
ПараметрыСеанса.АдминистраторАктивен = Значение;
КонецПроцедуры;
ОбщаяФорма.ЗапросПароляАдминистратора)Эта форма будет содержать поле для ввода пароля и кнопку "ОК".
// В модуле формы "ЗапросПароляАдминистратора"
// Переменная для результата
Перем мПарольВведен;
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
мПарольВведен = Ложь;
КонецПроцедура;
Процедура ОКНажатие(Команда)
Если УправлениеПравамиРМК.ПроверитьПарольАдминистратора(Элементы.ПолеПароль.Значение) Тогда
мПарольВведен = Истина;
Закрыть();
Иначе
СообщениеПользователю("Неверный пароль администратора.");
КонецЕсли;
КонецПроцедуры;
Функция ПарольВведен() Экспорт
Возврат мПарольВведен;
КонецФункции;
ФормаРМК.МодульФормы)
// В модуле формы РМК
Процедура ПриОткрытии()
ОбновитьВидимостьИДоступностьЭлементов();
КонецПроцедуры;
Процедура ПослеЗаписи()
ОбновитьВидимостьИДоступностьЭлементов();
КонецПроцедуры;
Процедура ОбновитьВидимостьИДоступностьЭлементов()
// Предполагаем, что есть кнопка для корректировки чека
Если РольДоступна("Кассир") И Не УправлениеПравамиРМК.АдминистраторАктивен() Тогда
Элементы.КнопкаКорректировкаЧека.Доступность = Ложь;
Элементы.КнопкаКорректировкаЧека.Видимость = Ложь;
// ... другие ограничения
Иначе
Элементы.КнопкаКорректировкаЧека.Доступность = Истина;
Элементы.КнопкаКорректировкаЧека.Видимость = Истина;
// ... другие разрешения
КонецЕсли;
КонецПроцедуры;
Процедура КнопкаКорректировкаЧекаНажатие(Команда)
Если Не УправлениеПравамиРМК.АдминистраторАктивен() Тогда
// Запрашиваем пароль, если администратор не активен
ФормаВводаПароля = ОткрытьФорму("ОбщаяФорма.ЗапросПароляАдминистратора");
Если ФормаВводаПароля.ПарольВведен() Тогда
УправлениеПравамиРМК.УстановитьАктивностьАдминистратора(Истина);
// Устанавливаем таймер для автоматического сброса активности администратора
ПодключитьОбработчикОжидания("СброситьАктивностьАдминистратора", 300, Истина); // Через 300 секунд (5 минут)
ОбновитьВидимостьИДоступностьЭлементов(); // Обновим интерфейс
Иначе
СообщениеПользователю("Операция отменена. Пароль администратора не введен.");
Возврат;
КонецЕсли;
КонецЕсли;
// Если администратор активен (или только что ввел пароль), выполняем корректировку
ВыполнитьКорректировкуЧека();
КонецПроцедура;
Процедура ВыполнитьКорректировкуЧека()
// Здесь размещаем логику корректировки чека
// Например, открытие формы документа "Чек коррекции"
СообщениеПользователю("Выполняем корректировку чека...");
// ...
КонецПроцедуры;
Процедура СброситьАктивностьАдминистратора()
УправлениеПравамиРМК.УстановитьАктивностьАдминистратора(Ложь);
ОтключитьОбработчикОжидания("СброситьАктивностьАдминистратора");
ОбновитьВидимостьИДоступностьЭлементов(); // Обновим интерфейс
СообщениеПользователю("Режим администратора отключен по истечении времени.");
КонецПроцедуры;
Этот пример демонстрирует базовый подход. В реальной системе потребуется более сложная логика для проверки паролей (например, по пользователям ИБ), более гранулярное управление состоянием "администратор активен" и более надежный механизм сброса активности.
Рассмотрим другие подходы и механизмы, которые могут быть полезны или являются частью комплексного решения:
При реализации механизмов временного повышения прав крайне важно уделить внимание вопросам безопасности:
Реализация механизма временного повышения прав администратора в РМК без перезапуска программы — это сложная, но вполне решаемая задача. Она требует тщательного анализа бизнес-процессов, внимательной проработки архитектуры решения и аккуратного кодирования. Следуя описанным шагам и рекомендациям по безопасности, мы можем создать гибкую и надежную систему, которая значительно упростит работу розничного предприятия.