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

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

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

Перем СтарыеЗаписи; // Заполняется ПередЗаписью для использования ПриЗаписи.

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

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

Процедура ПередЗаписью(Отказ, Замещение)
	
	// АПК:75-выкл проверка ОбменДанными.Загрузка должна быть после записи изменений в журнал.
	Если ПользователиСлужебныйПовтИсп.РегистрироватьИзмененияПравДоступа() Тогда
		ПодготовитьЗаписьИзмененийВЖурналРегистрации(ЭтотОбъект, Замещение, СтарыеЗаписи);
	КонецЕсли;
	// АПК:75-вкл
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
КонецПроцедуры

Процедура ПриЗаписи(Отказ, Замещение)
	
	// АПК:75-выкл проверка ОбменДанными.Загрузка должна быть после записи изменений в журнал.
	Если ПользователиСлужебныйПовтИсп.РегистрироватьИзмененияПравДоступа() Тогда
		ЗаписатьИзмененияВЖурналРегистрации(ЭтотОбъект, Замещение, СтарыеЗаписи);
	КонецЕсли;
	// АПК:75-вкл
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

Процедура ЗаписатьИзмененияВЖурналРегистрации(НаборЗаписей, Замещение, СтарыеЗаписи)
	
	Если НаборЗаписей.ДополнительныеСвойства.Свойство("ЭтоСтандартноеОбновлениеРегистра") Тогда
		Возврат;
	КонецЕсли;
	
	Если ОбщегоНазначения.ЭтоУдалениеНабораЗаписей(Замещение) Тогда
		Таблица = НаборЗаписей.Выгрузить(Новый Массив, СписокПолей());
	Иначе
		Таблица = НаборЗаписей.Выгрузить(, СписокПолей());
	КонецЕсли;
	Таблица.Колонки.Добавить("ВидИзменения", Новый ОписаниеТипов("Строка"));
	Таблица.ЗаполнитьЗначения("Добавлено", "ВидИзменения");
	ОтборСтрок = Новый Структура("ГруппаПользователей, Пользователь");
	
	Если ЗначениеЗаполнено(СтарыеЗаписи) Тогда
		Индекс = Таблица.Количество();
		Пока Индекс > 0 Цикл
			Индекс = Индекс - 1;
			НоваяЗапись = Таблица.Получить(Индекс);
			ЗаполнитьЗначенияСвойств(ОтборСтрок, НоваяЗапись);
			НайденныеСтроки = СтарыеЗаписи.НайтиСтроки(ОтборСтрок);
			СтараяЗапись = ?(НайденныеСтроки.Количество() = 0, Неопределено, НайденныеСтроки[0]);
			Если СтараяЗапись = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			Если НоваяЗапись.Используется = СтараяЗапись.Используется Тогда
				Таблица.Удалить(НоваяЗапись);
			Иначе
				НоваяЗапись.ВидИзменения = "Изменено";
			КонецЕсли;
			СтарыеЗаписи.Удалить(СтараяЗапись);
		КонецЦикла;
		Для Каждого СтараяЗапись Из СтарыеЗаписи Цикл
			НоваяСтрока = Таблица.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, СтараяЗапись);
			НоваяСтрока.ВидИзменения = "Удалено";
		КонецЦикла;
	КонецЕсли;
	
	Если Таблица.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ПользователиСлужебный.ЗарегистрироватьИзмененияСоставовГрупп(Таблица);
	
КонецПроцедуры

// Для процедур ПодготовитьЗаписьИзмененийВЖурналРегистрации, ЗаписатьИзмененияВЖурналРегистрации.
Функция СписокПолей()
	
	МетаданныеРегистра = Метаданные();
	
	Поля = Новый Массив;
	Поля.Добавить(МетаданныеРегистра.Измерения.ГруппаПользователей.Имя);
	Поля.Добавить(МетаданныеРегистра.Измерения.Пользователь.Имя);
	Поля.Добавить(МетаданныеРегистра.Ресурсы.Используется.Имя);
	
	Возврат СтрСоединить(Поля, ",");
	
КонецФункции

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

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