///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОписаниеПеременных

// Используется в обработчике события ПриЗаписи.
Перем СтароеЗначение;

#КонецОбласти

#Область ОбработчикиСобытий

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

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

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

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

#КонецОбласти

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли