Задача: вести журнал логов изменения записей регистра сведений
Решение:
Штатного механизма как в Документа или Справочниках нет (ну собственно и правильно, т.к. запись сейчас есть, через минуту её нет). Потому разработаем собственный механизм. Общий алгоритм будет следующий:
- при открытии форма регистра — запоминаем структуру и значения данных записи регистра
- при записи регистра из формы — сравниваем новые данные с охраненными, и при выявлении изменений, записываем оные в отдельный регистр «изменений».
При открытии формы регистра, получаем его структуру из метаданных, и запоминаем значения:
		
		
			
			
			
			
				
					
				| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | &НаКлиенте Перем ДанныеФормыДоИзменения;   &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) 	СохранитьИзмененияЕслиТаковыеЕсть(ДанныеФормыДоИзменения) КонецПроцедуры   &НаСервере Функция ПолучитьДанныеДоОбновления() 	ДанныеПоРегистру=Метаданные.РегистрыСведений.СГ_ГР_ТранспортныйФайлПриборыУчета; 	ДоступныеПоля=Новый Структура(); 	для каждого стр из ДанныеПоРегистру.Измерения цикл 		ДоступныеПоля.Вставить(стр.имя,неопределено); 	конеццикла;	 	для каждого стр из ДанныеПоРегистру.Ресурсы цикл 		ДоступныеПоля.Вставить(стр.имя,неопределено); 	конеццикла;	 	 	Данные=Новый Структура(); 	для каждого стр из ДоступныеПоля цикл 		 ключ=стр.Ключ; 		 значение=ЭтотОбъект.Запись[Стр.Ключ]; 		 Данные.Вставить(ключ,Строка(значение)); 	 конеццикла;		 	 возврат Данные; КонецФункции | 
				
			 
		 
При сохранении данных из формы регистра:
		
		
			
			
			
			
				
					
				| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | НаСервере Функция СохранитьИзмененияЕслиТаковыеЕсть(ДанныеФормыДоИзменения) 	для каждого стр из ДанныеФормыДоИзменения цикл 		если стр.Значение<>Строка(ЭтотОбъект.Запись[Стр.Ключ]) тогда 			СК_ГР_РаботаСТранспортнымиФайлами.СделатьЗаписьОбИзменении( 				ЭтотОбъект.Запись["dt"], 				перечисления.СК_ГР_РегистрДляОбработки.Приборы, 				Строка(Стр.Ключ), 				Строка(стр.Значение), 				Строка(ЭтотОбъект.Запись[Стр.Ключ]) 			); 		конецесли;	 	конеццикла; КонецФункции	   &НаКлиенте Процедура ПриОткрытии(Отказ) 	ДанныеФормыДоИзменения=ПолучитьДанныеДоОбновления(); КонецПроцедуры   | 
				
			 
		 
В сам регистр «изменений», пишем так:
		
		
			
			
			
			
				
					
				| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // Запись в регистр данных об изменении какого то поля в регистрах // Вход: //		Период - Дата загрузки из регистра //		Изменяемый регистр - перечисления.СК_ГР_РегистрДляОбработки //		Поле - изменяемое поле (строка) //		Было - значение которое было (строка) //		Стало - значение которое стало (строка) Функция СделатьЗаписьОбИзменении(Период,Регистр,Поле,Было,Стало) экспорт 		 	МенеджерЗаписи = РегистрыСведений.СК_ГР_ИсторияИзменений.СоздатьМенеджерЗаписи();  		МенеджерЗаписи.Период=ТекущаяДата(); 		МенеджерЗаписи.ПериодЗагрузки = Период;  		МенеджерЗаписи.ИзменяемыйРегистр = Регистр;  		МенеджерЗаписи.ИзменяемоеПоле = Поле;  		МенеджерЗаписи.Было = Было;  		МенеджерЗаписи.Стало = Стало;  		МенеджерЗаписи.Исполнитель = Пользователи.ТекущийПользователь();  	МенеджерЗаписи.Записать();    			 КонецФункции	 |