Задача: вести журнал логов изменения записей регистра сведений
Решение:
Штатного механизма как в Документа или Справочниках нет (ну собственно и правильно, т.к. запись сейчас есть, через минуту её нет). Потому разработаем собственный механизм. Общий алгоритм будет следующий:
- при открытии форма регистра — запоминаем структуру и значения данных записи регистра
- при записи регистра из формы — сравниваем новые данные с охраненными, и при выявлении изменений, записываем оные в отдельный регистр «изменений».
При открытии формы регистра, получаем его структуру из метаданных, и запоминаем значения:
&НаКлиенте
Перем ДанныеФормыДоИзменения;
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
СохранитьИзмененияЕслиТаковыеЕсть(ДанныеФормыДоИзменения)
КонецПроцедуры
&НаСервере
Функция ПолучитьДанныеДоОбновления()
ДанныеПоРегистру=Метаданные.РегистрыСведений.СГ_ГР_ТранспортныйФайлПриборыУчета;
ДоступныеПоля=Новый Структура();
для каждого стр из ДанныеПоРегистру.Измерения цикл
ДоступныеПоля.Вставить(стр.имя,неопределено);
конеццикла;
для каждого стр из ДанныеПоРегистру.Ресурсы цикл
ДоступныеПоля.Вставить(стр.имя,неопределено);
конеццикла;
Данные=Новый Структура();
для каждого стр из ДоступныеПоля цикл
ключ=стр.Ключ;
значение=ЭтотОбъект.Запись[Стр.Ключ];
Данные.Вставить(ключ,Строка(значение));
конеццикла;
возврат Данные;
КонецФункции
При сохранении данных из формы регистра:
НаСервере
Функция СохранитьИзмененияЕслиТаковыеЕсть(ДанныеФормыДоИзменения)
для каждого стр из ДанныеФормыДоИзменения цикл
если стр.Значение<>Строка(ЭтотОбъект.Запись[Стр.Ключ]) тогда
СК_ГР_РаботаСТранспортнымиФайлами.СделатьЗаписьОбИзменении(
ЭтотОбъект.Запись["dt"],
перечисления.СК_ГР_РегистрДляОбработки.Приборы,
Строка(Стр.Ключ),
Строка(стр.Значение),
Строка(ЭтотОбъект.Запись[Стр.Ключ])
);
конецесли;
конеццикла;
КонецФункции
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ДанныеФормыДоИзменения=ПолучитьДанныеДоОбновления();
КонецПроцедуры
В сам регистр «изменений», пишем так:
// Запись в регистр данных об изменении какого то поля в регистрах
// Вход:
// Период - Дата загрузки из регистра
// Изменяемый регистр - перечисления.СК_ГР_РегистрДляОбработки
// Поле - изменяемое поле (строка)
// Было - значение которое было (строка)
// Стало - значение которое стало (строка)
Функция СделатьЗаписьОбИзменении(Период,Регистр,Поле,Было,Стало) экспорт
МенеджерЗаписи = РегистрыСведений.СК_ГР_ИсторияИзменений.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период=ТекущаяДата();
МенеджерЗаписи.ПериодЗагрузки = Период;
МенеджерЗаписи.ИзменяемыйРегистр = Регистр;
МенеджерЗаписи.ИзменяемоеПоле = Поле;
МенеджерЗаписи.Было = Было;
МенеджерЗаписи.Стало = Стало;
МенеджерЗаписи.Исполнитель = Пользователи.ТекущийПользователь();
МенеджерЗаписи.Записать();
КонецФункции