Чужой код под замком: как устроен безопасный режим в 1С 8.3
Содержание
Безопасный режим в 1С нужен, чтобы выполнять код, которому вы не доверяете полностью: внешние обработки, расширения, формулы и алгоритмы, введённые пользователем. В этом режиме платформа запрещает коду работать с файлами, COM-объектами, внешними компонентами, интернетом, запускать программы и включать привилегированный режим. Данные базы код при этом читает и пишет, но только в пределах прав текущего пользователя.
Включают его четырьмя способами, и выбор зависит от того, чей код вы ограничиваете. Свой код — методом УстановитьБезопасныйРежим(Истина). Расширение — флажком в его свойствах. Дополнительную обработку в типовой конфигурации — через её регистрационные сведения. Тонкую настройку «что можно, а что нет» — через профиль безопасности в кластере серверов. Всё это работает на уровне платформы и не зависит от конфигурации: в БП 3.0, ЗУП 3.1 и УТ 11 механизм один.
Что такое безопасный режим в 1С и чем он отличается от обычного выполнения
В обычном режиме код конфигурации может почти всё, что разрешает операционная система рабочему процессу или клиенту. Он открывает файлы на диске, создаёт COMОбъект, подключает внешние компоненты, ходит в интернет через HTTPСоединение, вызывает ЗапуститьПриложение.
Безопасный режим — это флаг выполнения, который платформа проверяет перед каждой «опасной» операцией. Если флаг взведён, операция прерывается исключением. Сам код при этом не меняется: тот же модуль в обычном режиме отработает, а в безопасном упадёт на первой же записи файла.
Три свойства, которые надо знать:
- 🔒 Действие ограничено вызовом. Режим, включённый внутри процедуры, действует до выхода из неё и на всё, что из неё вызвано. После возврата управления платформа восстанавливает прежнее состояние.
- 🚫 Выключить изнутри нельзя. Код, запущенный в безопасном режиме, не может вызвать
УстановитьБезопасныйРежим(Ложь)и «освободиться». Иначе защита не имела бы смысла. - 👤 Права пользователя никуда не деваются. Безопасный режим не даёт и не отнимает доступ к данным. Ограничения ролей и RLS работают как обычно. Привилегированный режим включить нельзя, поэтому обойти RLS код тоже не сможет.
Для чего нужен безопасный режим: когда без него не обойтись
Главная задача — изолировать код, который писали не вы или который попал в базу в обход разработки. Типичные случаи:
- Внешние отчёты и обработки от сторонних авторов. Обработка загрузки банковской выписки или печатной формы от подрядчика. Вы не читали её модуль построчно и не знаете, что она делает с диском.
- Расширения конфигурации . Расширение встраивается в типовую базу без снятия с поддержки. Если оно скачано или куплено, логично сначала запустить его в безопасном режиме.
- Пользовательские формулы и алгоритмы. В справочнике хранится текст формулы расчёта премии или скидки, и код выполняет его через
Вычислить()илиВыполнить(). Любой, кто может редактировать справочник , может вписать туда команду удаления файлов. - Публикация на сервере и в облаке. Если база крутится на общем сервере, ошибочный или вредный код в одной базе не должен трогать файлы других баз и самого сервера.
- Интеграции через внешние модули. Когда код подгружается из файла или из другой системы во время работы.
Если в базе есть произвольные формулы, которые вводят пользователи, оберните их выполнение в безопасный режим всегда. Это самая дешёвая защита: одна строка кода.
Как включить безопасный режим в 1С 8.3
Способ 1. Программно, в своём коде
Метод УстановитьБезопасныйРежим() включает режим до конца текущей процедуры. Правильный шаблон — вынести опасное выполнение в отдельную процедуру:
Процедура ВыполнитьФормулуПользователя(ТекстФормулы, Параметры)
УстановитьБезопасныйРежим(Истина);
// Всё, что ниже, выполняется в безопасном режиме:
// файлы, COM, внешние компоненты и интернет недоступны
Выполнить(ТекстФормулы);
КонецПроцедуры
После выхода из ВыполнитьФормулуПользователя вызывающий код снова работает в обычном режиме. Если включить режим прямо в большой процедуре, под запрет попадёт и ваш собственный код ниже по тексту, включая запись логов в файл.
Проверить текущее состояние можно функцией БезопасныйРежим(). В 8.3 она возвращает Ложь, Истина или строку с именем профиля безопасности, поэтому сравнивайте так:
Если БезопасныйРежим() <> Ложь Тогда
// код выполняется с ограничениями
КонецЕсли;
Способ 2. Для расширения конфигурации
У каждого расширения есть свойство «Безопасный режим». По умолчанию у загружаемого расширения оно включено.
- В пользовательском режиме типовой конфигурации:
Администрирование → Печатные формы, отчеты и обработки → Расширения. В списке у расширения есть флажок «Безопасный режим». - В конфигураторе: откройте конфигурацию расширения и посмотрите её свойства в палитре свойств.
Расширение, которое подменяет печатную форму или добавляет реквизит, обычно спокойно работает в безопасном режиме. Расширение для обмена с сайтом или выгрузки файлов — нет: ему нужен диск или интернет.
Снимайте флажок только у расширений, код которых проверен. Расширение без безопасного режима получает те же возможности, что и сама конфигурация.
Способ 3. Для дополнительных отчётов и обработок (БСП)
В типовых конфигурациях на БСП внешние обработки подключаются через Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки.
Режим здесь задаёт сам автор обработки. В модуле объекта обработки есть функция СведенияОВнешнейОбработке(), которая возвращает структуру регистрационных данных. В ней ключ БезопасныйРежим (по умолчанию Истина) и список разрешений, которые обработке нужны.
Если обработка просит работу вне безопасного режима или дополнительные разрешения, программа покажет это при регистрации. Внимательно читайте этот запрос: обработка печатной формы, которая хочет запускать внешние приложения, — повод остановиться и спросить автора зачем.
Способ 4. Профиль безопасности в кластере серверов
Для клиент-серверных баз есть точная настройка: профили безопасности. Их создают в консоли администрирования серверов в ветке кластера «Профили безопасности». В профиле перечисляют, что разрешено: конкретные виртуальные каталоги, COM-классы, внешние компоненты, приложения, интернет-ресурсы.
Дальше в свойствах информационной базы в той же консоли есть два поля:
| Поле | Что ограничивает |
|---|---|
| Профиль безопасности | Весь код базы, включая саму конфигурацию |
| Профиль безопасности безопасного режима | Только код, выполняемый в безопасном режиме |
Второе поле превращает жёсткий запрет в белый список. Например, расширению обмена разрешают ходить на один адрес сайта и писать в одну папку, а всё остальное остаётся закрытым. Из командной строки профили тоже настраиваются через утилиту rac; набор команд смотрите в справке rac help.
Изменение профиля базы, которая уже работает, влияет на код в открытых сеансах. Пробуйте на копии базы и меняйте настройки в рабочей вне часов работы пользователей.
Если у вас 8.2
В 8.2 был только программный способ: УстановитьБезопасныйРежим() с логическим параметром. Расширений и профилей безопасности там нет, они появились в 8.3.
Ограничения безопасного режима и риски работы в нём
Что код не сможет сделать, когда режим включён:
| Операция | Примеры в коде | В безопасном режиме |
|---|---|---|
| Работа с файлами | ЗаписьТекста, ЧтениеXML из файла, КопироватьФайл | Запрещено |
| COM-объекты | Новый COMОбъект("Excel.Application") | Запрещено |
| Внешние компоненты | ПодключитьВнешнююКомпоненту | Запрещено |
| Запуск программ | ЗапуститьПриложение, КомандаСистемы | Запрещено |
| Интернет | HTTPСоединение, FTPСоединение, почта | Запрещено |
| Привилегированный режим | УстановитьПривилегированныйРежим(Истина) | Запрещено |
| Чтение и запись данных базы | запросы, запись документов | Разрешено в пределах прав |
Всё, что в таблице «запрещено», можно частично открыть профилем безопасности безопасного режима (способ 4).
Чего безопасный режим не защищает
Это главное заблуждение. Безопасный режим ограничивает доступ к окружению, а не к данным.
- 🗑️ Обработка в безопасном режиме удалит все документы за год, если у пользователя есть право их удалять.
- 📝 Перезапишет цены, остатки и реквизиты контрагентов в тех же пределах.
- 🔁 Зациклится и нагрузит сервер: на ресурсы процессора и памяти режим не влияет.
Поэтому внешние обработки в рабочей базе всё равно проверяют на копии и запускают под пользователем с минимально нужными правами.
Издержки для разработчика
- Обработка, которая писала отчёт в Excel через COM, в безопасном режиме упадёт. Нужно переделать вывод через табличный документ и временное хранилище.
- Логирование в файл перестанет работать: пишите в журнал регистрации через
ЗаписьЖурналаРегистрации. - Код, который раньше обходил RLS через привилегированный режим, придётся выносить в общий модуль конфигурации или расширения без безопасного режима.
С чем путают безопасный режим в 1С
Под запросом «безопасный режим 1С» часто ищут совсем другие вещи. Чтобы не настроить не то:
| Понятие | Что это на самом деле | Где задаётся |
|---|---|---|
| Безопасный режим | Ограничение операций кода (файлы, COM, интернет) | Код, свойства расширения, профиль безопасности |
| Защита от опасных действий | Предупреждение пользователю перед открытием внешней обработки, загрузкой расширения и подобными операциями | Свойства пользователя в списке пользователей информационной базы |
| Монопольный режим | Работа в базе одного сеанса; нужен для обновления структуры, загрузки .dt, тестирования и исправления | Запуск конфигуратора или команда в пользовательском режиме |
| Блокировка сеансов | Запрет новых входов на время регламентных работ | Консоль кластера или обработка блокировки в типовой |
| Безопасный режим Windows | Загрузка ОС с минимумом драйверов и служб | Параметры загрузки Windows |
Если нужно выгнать пользователей перед обновлением, безопасный режим здесь не поможет: это задача блокировки сеансов. А окно «Предупреждение безопасности» при открытии файла .epf — это защита от опасных действий, а не безопасный режим. Обработка, открытая после такого предупреждения, работает без ограничений безопасного режима, если её код сам его не включает.
Запуск 1С в безопасном режиме Windows почти никогда не помогает с ошибками программы. В нём может не стартовать драйвер аппаратного ключа защиты и не работать сеть, поэтому база просто не откроется. Ошибки платформы диагностируют в обычном режиме ОС.
Диагностика и устранение ошибок, связанных с безопасным режимом
Типовая картина: обработка или расширение работали у разработчика, а в рабочей базе падают с сообщением о том, что операция запрещена в безопасном режиме. Текст сообщения называет операцию: работу с файлами, создание COM-объекта, подключение компоненты.
Как использовать безопасный режим для диагностики
Режим полезен и как инструмент проверки. Пример: после установки нескольких расширений в базе начались странности, и неясно, какое расширение что делает.
- Сделайте копию базы и работайте на ней.
- Включите безопасный режим у всех расширений из сторонних источников.
- Пройдите проблемный сценарий. Ошибки вида «операция запрещена» покажут, какое расширение лезет к файлам, COM или в интернет.
- Сравните это с тем, что расширение должно делать по описанию. Неожиданная работа с диском у печатной формы — повод разобраться с автором.
Тот же приём работает для внешней обработки: оберните её вызов в процедуру с УстановитьБезопасныйРежим(Истина) на тестовой базе и посмотрите, на какой операции она остановится.