Чужой код под замком: как устроен безопасный режим в 1С 8.3

· 10 мин

Содержание

Безопасный режим в 1С нужен, чтобы выполнять код, которому вы не доверяете полностью: внешние обработки, расширения, формулы и алгоритмы, введённые пользователем. В этом режиме платформа запрещает коду работать с файлами, COM-объектами, внешними компонентами, интернетом, запускать программы и включать привилегированный режим. Данные базы код при этом читает и пишет, но только в пределах прав текущего пользователя.

Включают его четырьмя способами, и выбор зависит от того, чей код вы ограничиваете. Свой код — методом УстановитьБезопасныйРежим(Истина). Расширение — флажком в его свойствах. Дополнительную обработку в типовой конфигурации — через её регистрационные сведения. Тонкую настройку «что можно, а что нет» — через профиль безопасности в кластере серверов. Всё это работает на уровне платформы и не зависит от конфигурации: в БП 3.0, ЗУП 3.1 и УТ 11 механизм один.

Что такое безопасный режим в 1С и чем он отличается от обычного выполнения

В обычном режиме код конфигурации может почти всё, что разрешает операционная система рабочему процессу или клиенту. Он открывает файлы на диске, создаёт COMОбъект, подключает внешние компоненты, ходит в интернет через HTTPСоединение, вызывает ЗапуститьПриложение.

Безопасный режим — это флаг выполнения, который платформа проверяет перед каждой «опасной» операцией. Если флаг взведён, операция прерывается исключением. Сам код при этом не меняется: тот же модуль в обычном режиме отработает, а в безопасном упадёт на первой же записи файла.

Три свойства, которые надо знать:

  • 🔒 Действие ограничено вызовом. Режим, включённый внутри процедуры, действует до выхода из неё и на всё, что из неё вызвано. После возврата управления платформа восстанавливает прежнее состояние.
  • 🚫 Выключить изнутри нельзя. Код, запущенный в безопасном режиме, не может вызвать УстановитьБезопасныйРежим(Ложь) и «освободиться». Иначе защита не имела бы смысла.
  • 👤 Права пользователя никуда не деваются. Безопасный режим не даёт и не отнимает доступ к данным. Ограничения ролей и RLS работают как обычно. Привилегированный режим включить нельзя, поэтому обойти RLS код тоже не сможет.

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

Главная задача — изолировать код, который писали не вы или который попал в базу в обход разработки. Типичные случаи:

  1. Внешние отчёты и обработки от сторонних авторов. Обработка загрузки банковской выписки или печатной формы от подрядчика. Вы не читали её модуль построчно и не знаете, что она делает с диском.
  2. Расширения конфигурации . Расширение встраивается в типовую базу без снятия с поддержки. Если оно скачано или куплено, логично сначала запустить его в безопасном режиме.
  3. Пользовательские формулы и алгоритмы. В справочнике хранится текст формулы расчёта премии или скидки, и код выполняет его через Вычислить() или Выполнить(). Любой, кто может редактировать справочник , может вписать туда команду удаления файлов.
  4. Публикация на сервере и в облаке. Если база крутится на общем сервере, ошибочный или вредный код в одной базе не должен трогать файлы других баз и самого сервера.
  5. Интеграции через внешние модули. Когда код подгружается из файла или из другой системы во время работы.

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

Как включить безопасный режим в 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-объекта, подключение компоненты.

Диагностика: выберите симптом

Как использовать безопасный режим для диагностики

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

  1. Сделайте копию базы и работайте на ней.
  2. Включите безопасный режим у всех расширений из сторонних источников.
  3. Пройдите проблемный сценарий. Ошибки вида «операция запрещена» покажут, какое расширение лезет к файлам, COM или в интернет.
  4. Сравните это с тем, что расширение должно делать по описанию. Неожиданная работа с диском у печатной формы — повод разобраться с автором.

Тот же приём работает для внешней обработки: оберните её вызов в процедуру с УстановитьБезопасныйРежим(Истина) на тестовой базе и посмотрите, на какой операции она остановится.

Перед подключением чужой обработки или расширения
Выполнено: 0 / 5

Частые вопросы о безопасном режиме 1С

Безопасный режим замедляет работу 1С?
Заметно — нет. Платформа лишь проверяет флаг перед запрещёнными операциями. Запросы и запись данных выполняются с той же скоростью.
Можно ли включить безопасный режим для всей базы сразу?
Отдельного флажка «вся база в безопасном режиме» нет. Ограничить весь код базы можно профилем безопасности в свойствах информационной базы в консоли кластера.
Работает ли безопасный режим в файловой базе?
Программный способ и флажок у расширений работают. Профили безопасности задаются в кластере серверов, поэтому в файловом варианте их нет.
Защитит ли безопасный режим от шифровальщика?
Код внутри 1С в безопасном режиме не сможет шифровать файлы на диске. Но от вируса, попавшего на компьютер другим путём, он не защищает: это задача антивируса и резервных копий.
Почему обработка без предупреждения открывается у одного пользователя и с предупреждением у другого?
Предупреждение зависит от флажка защиты от опасных действий в свойствах пользователя, а не от безопасного режима. У одного пользователя флажок включён, у другого — нет.