Как скрыть весь интерфейс в 1С:Предприятии 8.3 и оставить только одну обработку

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При проектировании корпоративных информационных систем часто возникает задача создания специализированных рабочих мест. Типичный пример: пользователю необходимо дать возможность загружать данные в базу через внешнюю обработку XML. При этом сам импорт требует административных прав (для записи справочников, проведения документов и изменения регистров), но пускать такого пользователя в стандартный интерфейс системы крайне нежелательно из соображений безопасности и юзабилити.

В этой статье мы подробно разберем, как решить эту задачу изящно и безопасно. Мы проанализируем ошибки разработчиков при настройке прав, рассмотрим использование встроенных механизмов платформы 1С:Предприятие 8.3 (таких как режим «Киоск» и управление панелями) и научимся правильно применять привилегированный режим на сервере.

Почему возникает ошибка «Нет прав для запуска требуемого клиента»?

Посмотрим на ситуацию, описанную в обсуждении: разработчик попытался полностью забрать роли у пользователя, надеясь включить УстановитьПривилегированныйРежим в процедуре ПередНачаломРаботыСистемы. Это привело к закономерной ошибке инициализации сеанса.

Выясним причину этой проблемы. Метод УстановитьПривилегированныйРежим работает исключительно на сервере и не может повлиять на базовую проверку прав платформой в момент запуска клиентского приложения. Чтобы сеанс 1С в принципе мог стартовать, у пользователя в конфигураторе должна быть назначена хотя бы одна роль, обладающая следующими минимальными системными правами:

  1. Запуск тонкого клиента (или толстого/веб-клиента в зависимости от способа подключения).
  2. Интерактивное открытие внешних обработок (если обработка запускается как внешний файл .epf).
  3. Минимальные права на чтение базовых классификаторов (в типовых конфигурациях для этого достаточно назначить стандартную роль Пользователь).

Таким образом, правильная стратегия заключается в следующем: мы даем пользователю минимальную роль, которая позволяет только запустить программу и открыть форму нужной обработки, а все действия по записи данных выполняем в привилегированном режиме на сервере.

Решение 1. Использование специального режима основного окна («Киоск»)

Начиная с версии платформы 8.3.10, разработчикам доступен мощный инструмент для кастомизации интерфейса — режимы основного окна. Если нам нужно, чтобы пользователь видел исключительно рабочую область нашей обработки, рассмотрим режим «Киоск» (Kiosk).

В режиме «Киоска» окно программы разворачивается на весь экран. При этом полностью скрываются:

Разберем по шагам, как настроить запуск в режиме киоска программно. Для этого в модуле управляемого приложения найдем обработчик ПередНачаломРаботыСистемы и добавим проверку пользователя:


Процедура ПередНачаломРаботыСистемы(Отказ)
    
    #Если Клиент Тогда
        Если ИмяПользователя() = "ЗагрузчикДанных" Тогда
            // Устанавливаем режим Киоска для конкретного пользователя
            КлиентскоеПриложение.УстановитьРежимОсновногоОкна(РежимОсновногоОкнаКлиентскогоПриложения.Киоск);
        КонецЕсли;
    #КонецЕсли
    
КонецПроцедуры

Важное примечание: Так как в режиме «Киоск» отсутствуют стандартные кнопки закрытия окна 1С, пользователь не сможет выйти из программы обычным способом. Нам обязательно нужно предусмотреть в форме самой обработки кнопку «Выход», при нажатии на которую будет выполняться код:


&НаКлиенте
Процедура КнопкаВыходНажатие(Команда)
    ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры

Если режим «Киоск» кажется слишком радикальным, можно использовать режим РежимОсновногоОкнаКлиентскогоПриложения.РабочееМесто. Он сохраняет стандартную рамку окна и кнопку закрытия приложения, но также полностью очищает рабочую область от системных панелей.

Решение 2. Программное скрытие панелей интерфейса «Такси»

Если мы хотим оставить стандартное окно программы, но полностью убрать все панели (разделы, функции, открытые окна), мы можем очистить их состав программно при старте сеанса конкретного пользователя.

Проанализируем пример кода, который необходимо разместить в модуле управляемого приложения в процедуре ПриНачалеРаботыСистемы:


Процедура ПриНачалеРаботыСистемы()
    
    Если ИмяПользователя() = "ЗагрузчикДанных" Тогда
        // Создаем новый пустой объект настроек интерфейса
        НовыеНастройки = Новый НастройкиИнтерфейсаКлиентскогоПриложения;
        
        // Получаем текущую структуру панелей
        СоставПанелей = НовыеНастройки.ПолучитьСостав();
        
        // Очищаем все области экрана от панелей
        СоставПанелей.Верх.Очистить();
        СоставПанелей.Лево.Очистить();
        СоставПанелей.Низ.Очистить();
        СоставПанелей.Право.Очистить();
        
        // Применяем пустой состав панелей
        НовыеНастройки.УстановитьСостав(СоставПанелей);
        
        // Сохраняем настройки в системное хранилище для текущего пользователя
        ХранилищеСистемныхНастроек.Сохранить(
            "Общее/НастройкиИнтерфейсаКлиентскогоПриложения", 
            "", 
            НовыеНастройки
        );
    КонецЕсли;
    
КонецПроцедуры

После выполнения этого кода при запуске системы пользователь увидит абсолютно чистое окно. Нам останется лишь настроить открытие нашей обработки в качестве начальной страницы или открывать ее принудительно в этой же процедуре с помощью метода ОткрытьФорму.

Решение 3. Реализация привилегированного режима для безопасной записи данных

Теперь разберем архитектурно правильный способ реализации записи данных. Чтобы не давать пользователю полные права в режиме предприятия, мы делегируем выполнение операции загрузки серверному коду, работающему в привилегированном режиме.

Рассмотрим, как это выглядит на практике. В форме нашей обработки импорта при нажатии кнопки «Загрузить» клиентский код передает управление на сервер:


&НаКлиенте
Процедура ВыполнитьЗагрузку(Команда)
    
    // Получаем адрес временного хранилища с файлом XML
    АдресФайлаВоВременномХранилище = ПоместитьФайлыНаСервер(...);
    
    // Вызываем серверный метод выполнения импорта
    ЗагрузитьДанныеНаСервере(АдресФайлаВоВременномХранилище);
    
    ПоказатьПредупреждение(, "Загрузка успешно завершена!");
    
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗагрузитьДанныеНаСервере(Знач АдресФайла)
    
    // Включаем привилегированный режим. 
    // Теперь платформа игнорирует ограничения прав текущего пользователя.
    УстановитьПривилегированныйРежим(Истина);
    
    // Получаем файл из хранилища
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    
    // Вызываем код чтения XML и записи объектов в базу данных
    // Например: ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла); ...
    
    // Обязательно отключаем привилегированный режим по окончании транзакции
    УстановитьПривилегированныйРежим(Ложь);
    
    // Удаляем временный файл с диска сервера
    Попытка
        УдалитьФайлы(ИмяВременногоФайла);
    Исключение
        // Логируем ошибку удаления, если требуется
    КонецПопытки;
    
КонецПроцедуры

Используя этот подход, мы полностью исключаем риски того, что пользователь сможет вручную отредактировать документы или справочники через стандартные интерфейсы списков, поскольку его учетная запись физически не имеет к ним интерактивного доступа.

Решение 4. Автоматизация запуска и закрытия через параметры командной строки

Для минимизации человеческого фактора мы можем полностью автоматизировать процесс работы оператора. Нам не нужно, чтобы пользователь самостоятельно искал обработку в интерфейсе или выбирал файл вручную. Мы можем настроить запуск 1С через ярлык со специальными ключами командной строки.

Рассмотрим пример строки запуска для ярлыка на рабочем столе пользователя:


"C:\Program Files\1cv8\common\1estart.exe" ENTERPRISE /F "C:\Base1C\UNF" /N "LoaderXML" /P "Password123" /Execute "C:\ExternalDataProcessors\UniversalImport.epf"

При использовании параметра /Execute платформа автоматически запустит сеанс 1С под указанной учетной записью и сразу откроет внешнюю обработку, переданную в параметре. Чтобы сделать процесс бесшовным, мы можем написать следующий код внутри модуля формы нашей обработки:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Если файл импорта всегда лежит в одной папке, можем выполнить загрузку сразу
    ПутьКФайлуЗагрузки = "C:\Exchange\import.xml";
    ФайлНаДиске = Новый Файл(ПутьКФайлуЗагрузки);
    
    Если ФайлНаДиске.Существует() Тогда
        ВыполнитьИмпортФайла(ПутьКФайлуЗагрузки);
        
        // После успешной загрузки автоматически закрываем приложение
        ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
    
КонецПроцедуры

При таком сценарии пользователь дважды кликает по ярлыку, видит окно прогресса загрузки данных, после чего сеанс 1С самостоятельно закрывается. Пользователь даже не соприкасается с интерфейсом конфигурации.

Резюме и рекомендации

Для надежного и безопасного решения задачи по скрытию интерфейса рекомендуем придерживаться следующего алгоритма:

  1. Создайте в конфигураторе отдельную роль (например, РольЗагрузчикДанных), в которой разрешите только запуск клиента и интерактивное открытие внешних обработок.
  2. Используйте программное переключение в режим «Киоск» или «Рабочее место» в модуле управляемого приложения для скрытия панелей меню и навигации.
  3. В коде загрузки на сервере обязательно используйте метод УстановитьПривилегированныйРежим(Истина), чтобы обойти ограничения прав текущего пользователя при непосредственной записи объектов базы данных.
  4. При необходимости частых обновлений или регламентных загрузок перенесите логику в регламентное задание, чтобы полностью исключить интерактивную работу пользователя в системе.
← На главную