1С: Сохранение логов изменений регистра сведений
Задача: вести журнал логов изменения записей регистра сведений
Решение:
Штатного механизма как в Документа или Справочниках нет (ну собственно и правильно, т.к. запись сейчас есть, через минуту её нет). Потому разработаем собственный механизм. Общий алгоритм будет следующий:
- при открытии форма регистра — запоминаем структуру и значения данных записи регистра
- при записи регистра из формы — сравниваем новые данные с охраненными, и при выявлении изменений, записываем оные в отдельный регистр «изменений».
При открытии формы регистра, получаем его структуру из метаданных, и запоминаем значения:
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 |
// Запись в регистр данных об изменении какого то поля в регистрах // Вход: // Период - Дата загрузки из регистра // Изменяемый регистр - перечисления.СК_ГР_РегистрДляОбработки // Поле - изменяемое поле (строка) // Было - значение которое было (строка) // Стало - значение которое стало (строка) Функция СделатьЗаписьОбИзменении(Период,Регистр,Поле,Было,Стало) экспорт МенеджерЗаписи = РегистрыСведений.СК_ГР_ИсторияИзменений.СоздатьМенеджерЗаписи(); МенеджерЗаписи.Период=ТекущаяДата(); МенеджерЗаписи.ПериодЗагрузки = Период; МенеджерЗаписи.ИзменяемыйРегистр = Регистр; МенеджерЗаписи.ИзменяемоеПоле = Поле; МенеджерЗаписи.Было = Было; МенеджерЗаписи.Стало = Стало; МенеджерЗаписи.Исполнитель = Пользователи.ТекущийПользователь(); МенеджерЗаписи.Записать(); КонецФункции |