Работай! Именем Привилегированного режима!

18.08.25

Разработка - Механизмы платформы 1С

Поймал один баг, связанный с привилегированным режимом, и решил поделиться этой историей.
 
Вступление

Все вы знаете, что есть модуль с возможностью выполнения всего под полными правами — за это отвечает галочка «Привилегированный».
На текущем месте работы у нас такой модуль используется для логирования. У нас есть регистр сведений, на который у обычных пользователей нет права даже на чтение; запись в этот регистр происходит при помощи модуля с привилегированным режимом.
Вдруг понадобилось создать временную внешнюю обработку для выполнения внутреннего функционала, который использует логирование через модуль, описанный выше. И получилось так, что логирование перестало работать, по причине нехватки прав.
Хотя даже не так. Мне сказали починить, но я поначалу не мог повторить нехватку прав, так как у меня всё срабатывало и нормально работало. Сейчас я понимаю, что мне, видимо, «дико везло», так как когда я тестировал — поймал некорректное поведение системы.

Немного сумбурно?
Давайте всё по порядку.

 

Я смог смоделировать данную ситуацию дома, поэтому рассказываю, как это повторить, чтобы стало понятно. 

 
Видео, в котором мне удалось воспроизвести этот баг

 

1 Я взял последнюю версию БСП и включил возможность доработки.

2 Добавил регистр сведений «дсЛогирование»:

3 Создал привилегированный модуль «дсЛогированиеРежимБогаСервер»:

 
 4 Добавил код для логирования в регистр «дсЛогирование»:
Функция ЗаписьЛога(Ключ,СборщикЛога)Экспорт  
	Место = "дсЛогированиеРежимБогаСервер.ЗаписьЛога";
	
	Результат = Истина;

	// ++ 
	текМесто = СтрШаблон("[ДоЗаписи] %1",Место);
	СборщикЛога.Добавить(Новый Структура("Период,Место,Включен",
		ТекущаяДатаСеанса(),текМесто,ПривилегированныйРежим()));
	// -- 

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

		Если НаборЗаписей.Количество() = 0 Тогда
			НоваяЗаписьРегистра = НаборЗаписей.Добавить();

			НоваяЗаписьРегистра.ДатаВремя 	= ДатаВремя;
			НоваяЗаписьРегистра.Ключ 		= Ключ;
			НоваяЗаписьРегистра.ТипЛога 	= ТипЛога;
			
		Иначе
			НоваяЗаписьРегистра = НаборЗаписей[0];
		КонецЕсли;
				
		НоваяЗаписьРегистра.Информация = "ЗаписьЛога";
		
		НаборЗаписей.Записать();
		
		
	Исключение	
		
		Результат = Ложь;
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
		ЗаписьЖурналаРегистрации("Ошибка",УровеньЖурналаРегистрации.Ошибка,,,СтрШаблон("%1 - Ошибка:%2",Место,ТекстОшибки));
		
	КонецПопытки;
	
	Если Не Результат Тогда 
		СборщикЛога.Добавить(Новый Структура("Период,Место,Включен",
			ТекущаяДатаСеанса(),
			СтрШаблон("%1 - Ошибка:%2",Место,ТекстОшибки),
			ПривилегированныйРежим()));	
	КонецЕсли;		
	
	// ++ 
	текМесто = СтрШаблон("[ПослеЗаписи] %1",Место);
	СборщикЛога.Добавить(Новый Структура("Период,Место,Включен",
		ТекущаяДатаСеанса(),текМесто,ПривилегированныйРежим()));
	// --

	
	Возврат Результат;
	
КонецФункции

Примечание:

СборщикЛога – Массив структур в котором я отмечаю время запуска, место запуска, наличие\отсутствие привилегированного режима.

Место – текстом написан название модуля и функции. Используется для логирования.

Ключ – Тип запуска. Обычный запуск или через фоновое задание.

5 Создал модуль без привилегированного режима «дсЛогированиеСервер», в котором вызываю функцию из привилегированного модуля:

 
Код модуля 
Процедура ОбычныйЗапуск(Ключ="ОбычныйЗапуск", СборщикЛога=Неопределено, АдресРезультата = "") Экспорт 
  	Место = "дсЛогированиеСервер.ОбычныйЗапуск";
	
	Если Не ЗначениеЗаполнено(СборщикЛога) Тогда 
		СборщикЛога = Новый Массив;
	КонецЕсли;
	
	// ++ 
	текМесто = СтрШаблон("[ДоЗаписиВЛог] %1",Место);
	СборщикЛога.Добавить(Новый Структура("Период,Место,Включен",
		ТекущаяДатаСеанса(),текМесто,ПривилегированныйРежим()));
	// -- 
	
		
	дсЛогированиеРежимБогаСервер.ЗаписьЛога(Ключ,СборщикЛога);	
	
	
	// ++ 
	текМесто = СтрШаблон("[ПослеЗаписиВЛог] %1",Место);
	СборщикЛога.Добавить(Новый Структура("Период,Место,Включен",
		ТекущаяДатаСеанса(),текМесто,ПривилегированныйРежим()));
	// --

	Если ЗначениеЗаполнено(АдресРезультата) Тогда 
		ПоместитьВоВременноеХранилище(СборщикЛога,АдресРезультата);
	КонецЕсли;
	
КонецПроцедуры

Примечание:

СборщикЛога – Массив структур в котором я отмечаю время запуска, место запуска, наличие\отсутствие привилегированного режима.

Место – текстом написан название модуля и функции. Используется для логирования.

Ключ – Тип запуска. Обычный запуск или через фоновое задание.

АдресРезультата – При запуске в фоновом задании по данному адресу будет сохранен СборщикЛога.

6 Добавил обработку для выполнения логирования «дсПривилегированныйРежим»:

В обработке есть две кнопки «Обычный запуск» и «Обычный запуск ФЗ». Есть таблица значений для вывода информации из сборщика логов.

 
Код модуля формы
&НаКлиенте
Процедура ОбычныйЗапуск(Команда)
	ОбычныйЗапускНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОбычныйЗапускНаСервере()
	ПройденныйПуть.Очистить();
	СборщикЛога = Новый Массив;
	дсЛогированиеСервер.ОбычныйЗапуск("ОбычныйЗапуск",СборщикЛога); 
	
	Для Каждого ТекущийЛог из СборщикЛога Цикл 
		
		НоваяСтрока = ПройденныйПуть.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекущийЛог);
		
	КонецЦикла;	
КонецПроцедуры

&НаКлиенте
Процедура ОбычныйЗапускФЗ(Команда)
	ОбычныйЗапускФЗНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОбычныйЗапускФЗНаСервере()
	ПройденныйПуть.Очистить();
	
	СборщикЛога = Новый Массив;
	
	ПараметрыВыполнения = Новый Массив;
	ПараметрыВыполнения.Добавить("ОбычныйЗапускФЗ");
	ПараметрыВыполнения.Добавить(СборщикЛога);
	
	ИдентификаторФЗ = Строка(Новый УникальныйИдентификатор);  
	
	АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
	ПараметрыВыполнения.Добавить(АдресХранилища);
	
		
	ФоновыеЗадания.Выполнить("дсЛогированиеСервер.ОбычныйЗапуск",
		ПараметрыВыполнения,ИдентификаторФЗ,"ОбычныйЗапускФЗ");
	
	Задания = ФоновыеЗадания.ПолучитьФоновыеЗадания(
		Новый Структура("Ключ,Наименование",ИдентификаторФЗ,"ОбычныйЗапускФЗ"));	
	Если Задания.Количество() > 0 Тогда 
		Задание = Задания[0];
		Задание = Задание.ОжидатьЗавершенияВыполнения(10);
		Пока Задание.Состояние = СостояниеФоновогоЗадания.Активно Цикл
			Задание = Задание.ОжидатьЗавершенияВыполнения(10);
		КонецЦикла;
		СборщикЛога = ПолучитьИзВременногоХранилища(АдресХранилища);
		Если ТипЗнч(СборщикЛога) = Тип("Массив") Тогда 
			Для Каждого ТекущийЛог из СборщикЛога Цикл 
			
				НоваяСтрока = ПройденныйПуть.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекущийЛог);
				
			КонецЦикла;
		КонецЕсли;	
	КонецЕсли;	
	
КонецПроцедуры

 

 

Схема работы запуска из конфигуратора.

 
Запуск обработкой из конфигуратора 

 

Схема работы запуска из внешней обработки.

 

Если кратко, то всё работает так же, но в момент логирования — как повезёт.

Может отработать с привилегированным режимом, а может — без.

При этом стандартное поведение, заложенное фирмой 1С, должно работать без привилегированного режима.

То есть в моём случае как раз должна происходить нехватка прав!

Вот так:

 

Но, если вы посмотрите видео выше, то увидите, что при запуске в режиме фонового задания иногда будет вот такая картина. Которая показывает, что все работает вопреки.

 

 

Я не могу понять, как оно отрабатывает, такое ощущение, что в самой платформе что-то периодически перезапускается, и в момент перезапуска можно поймать момент, когда стандартные проверки ещё не применились…
 

Но это, как говорится, — «мысли вслух»😉

 

Как сделать, чтобы логирование работало?

1 Создать нужные роли, дающие права на регистр.

 

 

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

 

 

3 Если у вас конфигурация без БСП или вы не хотите использовать «Дополнительные обработки и отчеты», можно добавить команду, обработку или еще что-то в конфигуратор открывающее вашу обработку:

Пример -> https://its.1c.ru/db/metod8dev/content/3556/hdoc

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

	//Помещаем обработку во временном хранилище
	АдресХранилища = "";
	Результат = ПоместитьФайл(АдресХранилища, "C:\ВнешняяОбработка.epf", , Ложь);           
	ИмяОбработки = ПодключитьВнешнююОбработку(АдресХранилища);
    
	// Откроем форму подключенной внешней обработки
	ОткрытьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма");

КонецПроцедуры 
 
&НаСервере
Функция ПодключитьВнешнююОбработку(АдресХранилища)
	
	ОписаниеЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
	ОписаниеЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
	Возврат ВнешниеОбработки.Подключить(АдресХранилища,,Ложь,ОписаниеЗащиты);

КонецФункции 

 

4 Настроить профиль безопасности.

 

 

 

 

Может быть, есть еще варианты, но я думаю, достаточно и этих.

 

На этом статью завершаю.

Надеюсь, кто-то сэкономит время, а кто-то починит этот баг 😉

Всем интересных задач и удачи!

Вступайте в нашу телеграмм-группу Инфостарт

Привилегированный режим обработка внешняя обработка внешняя Привилегированный баг ошибка БСП права профиль безопасности

См. также

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    15499    TitanLuchs    99    

124

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С v8.3 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    9934    bayselonarrend    126    

63

Механизмы платформы 1С WEB-интеграция Программист 1С v8.3 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    15625    dsdred    77    

125

Механизмы платформы 1С Программист Стажер 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

23.06.2024    17901    bayselonarrend    22    

168

Механизмы платформы 1С Программист Стажер 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    10139    dsdred    22    

84

Механизмы платформы 1С Программист Стажер 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    38167    YA_418728146    35    

75
Отзывы
15. dsdred 3992 19.08.25 08:59 Сейчас в теме
(13) Вот так наверно станет всем понятно.
Смотрим принскрин, демонстрация как работают полные права во внешних обработках по умолчанию.
Прикрепленные файлы:
VyacheslavShilov; +1 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. pbelsib 18.08.25 11:22 Сейчас в теме
Аналогичный баг с нехваткой прав возникал у нас,
когда память rphost подходила к концу, либо сильно фрагментировалась.
т.е. всё работает нормально, до какого-то момента.
потом вылет по нехватке прав, ну и чуть позже, rphost сам перезапускается,
т.к. поплохело ему.
2. dsdred 3992 18.08.25 11:37 Сейчас в теме
Тут баг не совсем с нехваткой. Я бы сказал иногда работает с избытком.

Я тестировал на домашней сборке, создал максимально стерильные условия.
3. RustIG 1897 18.08.25 12:15 Сейчас в теме
Я не так давно отлавливал ошибки в УТ и заметил, что в УТ 11.5.20.104 привилегированных модулей нет - представлены на скринах.
Также в БП 3.0.176.38 - нет модулей с привилегированным режимом.
Прикрепленные файлы:
thornhiven; dsdred; +2 Ответить
4. RustIG 1897 18.08.25 12:18 Сейчас в теме
Может проще было бы оставить общий модуль без привилегированного режима, но в каждой функции и процедуре этого модуля прописать программную установку привилегированного режима на время выполнения функции и/или процедуры?
5. dsdred 3992 18.08.25 12:32 Сейчас в теме
(4) Пробовал. Тут суть в том, что это нормальное поведение по версии фирмы 1С, что спадает привилигированный режим. Не нормально, что он иногда срабатывает ))
6. PerlAmutor 160 19.08.25 06:48 Сейчас в теме
Возможно тут дело не в привилегированном режиме, а в параллельном чтении/записи данных в регистр? Когда в нем данных нет, то RLS не срабатывает, когда есть, то не дает читать. Часто такое можно встретить на отчетах СКД, когда один пользователь формирует отчет за один период, где нет данных на объекты ему не доступные, а в другом периоде они есть. Соответственно и ошибка может то появляться то исчезать. Попробуйте наложить исключительную блокировку в фоновом задании или не очищать регистр полностью.

Хотя если ПривилегированныйРежим() возвращает разные признаки, тогда мои догадки не верны.
7. dsdred 3992 19.08.25 06:52 Сейчас в теме
(6) я на видео демонстрировал этот баг на домашнем компьютере. Сидел один в базе и rls не использовал.
8. PerlAmutor 160 19.08.25 06:56 Сейчас в теме
(7) Нигде не нашел на какой версии платформы это происходит.
9. dsdred 3992 19.08.25 06:58 Сейчас в теме
(8) дома на 8.3.27.1644 смог воспроизвести
10. PerlAmutor 160 19.08.25 06:59 Сейчас в теме
(9) А на каких еще версиях он воспроизводится? Доверия к 8.3.27 у меня совсем нет из-за обилия ошибок на старте.
11. dsdred 3992 19.08.25 07:00 Сейчас в теме
(10) через час напишу. На работу дойду и посмотрю какая версия там.
12. dsdred 3992 19.08.25 07:57 Сейчас в теме
13. user1832003 59 19.08.25 08:31 Сейчас в теме
УстановитьПривилегированныйРежим(Истина) в начале процедуры для слабых, да? Лучше искать вот такие костыли в обход бага, чем использовать то, что гарантированно работает?
14. dsdred 3992 19.08.25 08:49 Сейчас в теме
(13) Вы правда считаете, что я так не пробовал?
Поймите, что это стандартное поведение, что привилигированный режим спадает и не устанавливается через УстановитьПривилегированныйРежим(Истина) для внешних обработок.

А вот то что он иногда срабатывает это баг который непонятно как воспроизводится, но в моем случае я его даже на видео заснял.
16. user1832003 59 19.08.25 09:14 Сейчас в теме
(14) а для внешних. Это да. Это даже на итс написано. Не знал? Именно поэтому в бсп и есть костыль с указанием разрешений
17. dsdred 3992 19.08.25 09:16 Сейчас в теме
(16) А на ИТС написано, что для фоновых заданий иногда Привилегированный режим срабатывает?
15. dsdred 3992 19.08.25 08:59 Сейчас в теме
(13) Вот так наверно станет всем понятно.
Смотрим принскрин, демонстрация как работают полные права во внешних обработках по умолчанию.
Прикрепленные файлы:
VyacheslavShilov; +1 Ответить
18. PerlAmutor 160 19.08.25 19:17 Сейчас в теме
Задам главный вопрос. Пользователь с ограниченными правами которому дали роль "Открытие внешних отчетов и обработок" сможет с помощью этого бага включить своего пользователя в группу Администраторы?
Оставьте свое сообщение