23:30 

журнал регистраций

Раэн
Познавая все до предела, сам оставайся бесконечен. Лао Цзы

Добавить в какой-либо общий модуль процедуру

// Универсальная процедура, регистрирующая изменения реквизитов объекта (справочник, документ, план обмена, ПВХ)
// в журнале регистрации
Процедура РегистрацияИзмененийРеквизитовОбъекта(Объект) Экспорт
Перем МетаданныеОбъекта;

Если НЕ Объект.Ссылка.Пустая() Тогда
МетаданныеОбъекта = Объект.Метаданные();

СтрокаСобытие = "Данные.ИзменениеРеквизитов." + МетаданныеОбъекта.Имя;
ПрежнийОбъект = Объект.Ссылка;

СтрокаСообщениеРеквизит = "Изменён реквизит ";
СтрокаСообщениеТабЧасть = "Изменена таб.часть ";
СтрокаСообщениеТабЧастьУдалено = "Удалено ";
СтрокаСообщениеТабЧастьДобавлено = "Добавлено ";

ЭтоСправочник = Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект.Ссылка));
ЭтоПланОбмена = ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект.Ссылка));
ЭтоПВХ = ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект.Ссылка));
ЭтоДокумент = Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект.Ссылка));

Если ЭтоДокумент Тогда
Если ПрежнийОбъект.Номер <> Объект.Номер Тогда
ЗаписьЖурналаРегистрации(СтрокаСобытие, УровеньЖурналаРегистрации.Предупреждение, МетаданныеОбъекта, Объект.Ссылка, СтрокаСообщениеРеквизит + " номер " + Символы.ВК + "Прежний: " + ПрежнийОбъект.Номер + ". Новый: " + Объект.Номер);
КонецЕсли;
Если ПрежнийОбъект.Дата <> Объект.Дата Тогда
ЗаписьЖурналаРегистрации(СтрокаСобытие, УровеньЖурналаРегистрации.Предупреждение, МетаданныеОбъекта, Объект.Ссылка, СтрокаСообщениеРеквизит + " дата " + Символы.ВК + "Прежний: " + ПрежнийОбъект.Дата + ". Новый: " + Объект.Дата);
КонецЕсли;
Иначе
Если СокрЛП(ПрежнийОбъект.Наименование) <> СокрЛП(Объект.Наименование) Тогда
ЗаписьЖурналаРегистрации(СтрокаСобытие, УровеньЖурналаРегистрации.Предупреждение, МетаданныеОбъекта, Объект.Ссылка, СтрокаСообщениеРеквизит + " наименование " + Символы.ВК + "Прежнее: " + ПрежнийОбъект.Наименование + Символы.ВК + "Новое: " + Объект.Наименование);
КонецЕсли;
Если СокрЛП(ПрежнийОбъект.Код) <> СокрЛП(Объект.Код) Тогда
ЗаписьЖурналаРегистрации(СтрокаСобытие, УровеньЖурналаРегистрации.Предупреждение, МетаданныеОбъекта, Объект.Ссылка, СтрокаСообщениеРеквизит + " код " + Символы.ВК + "Прежний: " + ПрежнийОбъект.Код + ". Новый: " + Объект.Код);
КонецЕсли;
Если ЭтоСправочник Тогда
Если МетаданныеОбъекта.Иерархический И (ПрежнийОбъект.Родитель <> Объект.Родитель) Тогда
ЗаписьЖурналаРегистрации(СтрокаСобытие, УровеньЖурналаРегистрации.Предупреждение, МетаданныеОбъекта, Объект.Ссылка, "Изменена группа " + Символы.ВК + "Прежняя: " + ПрежнийОбъект.Родитель + Символы.ВК + "Новая: " + Объект.Родитель);
КонецЕсли;
Если (МетаданныеОбъекта.Владельцы.Количество() <> 0) И (ПрежнийОбъект.Владелец <> Объект.Владелец) Тогда
ЗаписьЖурналаРегистрации(СтрокаСобытие, УровеньЖурналаРегистрации.Предупреждение, МетаданныеОбъекта, Объект.Ссылка, "Изменён владелец элемента " + Символы.ВК + "Прежний: " + ПрежнийОбъект.Владелец + Символы.ВК + "Новый: " + Объект.Владелец);
КонецЕсли;
КонецЕсли;
КонецЕсли;

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

Если МетаданныеОбъекта.ТабличныеЧасти.Количество() > 0 Тогда

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

//This code is ported from www.kb.mista.ru/article.php?id=115
Для Каждого МДТЧ ИЗ МетаданныеОбъекта.ТабличныеЧасти Цикл
ИмяТЧ = МДТЧ.Имя;
ТЧ1 = Объект[ИмяТЧ];
ТЧ2 = ПрежнийОбъект[ИмяТЧ];
ТЧ1Количество = ТЧ1.Количество();
ТЧ2Количество = ТЧ2.Количество();
Если ТЧ1Количество <> ТЧ2Количество Тогда
ЗаписьЖурналаРегистрации(СтрокаСобытие, УровеньЖурналаРегистрации.Предупреждение, МетаданныеОбъекта, Объект.Ссылка, СтрокаСообщениеТабЧасть + ИмяТЧ + Символы.ВК + "Прежняя: " + Строка(ТЧ2Количество) + ". Новая: " + Строка(ТЧ1Количество));
КонецЕсли;
Если ТЧ1Количество = ТЧ2Количество Тогда
СтрокаСообщение = СтрокаСообщениеРеквизит;
ИначеЕсли ТЧ2Количество > ТЧ1Количество Тогда
СтрокаСообщение = СтрокаСообщениеТабЧастьУдалено;
ИначеЕсли ТЧ2Количество < ТЧ1Количество Тогда
СтрокаСообщение = СтрокаСообщениеТабЧастьДобавлено;
КонецЕсли;

Для Инд = 0 По Макс(ТЧ1Количество - 1, ТЧ2Количество - 1) Цикл
Для Каждого МДРТЧ ИЗ МДТЧ.Реквизиты Цикл
Реквизит = МДРТЧ.Имя;

// При необходимости проверку можно удалить
Если НЕ ПроверяемыеРеквизитыТабЧасти.Свойство(Реквизит) Тогда
Продолжить;
КонецЕсли;

Если Инд >= ТЧ1Количество Тогда
НовыйРеквизитЗначение = Неопределено;
Иначе
НовыйРеквизитЗначение = ТЧ1[Инд][Реквизит];
КонецЕсли;
Если Инд >= ТЧ2Количество Тогда
ПрежнийРеквизитЗначение = Неопределено;
Иначе
ПрежнийРеквизитЗначение = ТЧ2[Инд][Реквизит];
КонецЕсли;

Если (ЗначениеЗаполнено(ПрежнийРеквизитЗначение) И ЗначениеЗаполнено(НовыйРеквизитЗначение)) ИЛИ (НЕ ЗначениеЗаполнено(ПрежнийРеквизитЗначение) И ЗначениеЗаполнено(НовыйРеквизитЗначение)) ИЛИ (ЗначениеЗаполнено(ПрежнийРеквизитЗначение) И НЕ ЗначениеЗаполнено(НовыйРеквизитЗначение)) Тогда
Если ТипЗнч(НовыйРеквизитЗначение) = Тип("Строка") Тогда
НовыйРеквизитЗначение = СокрЛП(НовыйРеквизитЗначение);
КонецЕсли;
Если ТипЗнч(ПрежнийРеквизитЗначение) = Тип("Строка") Тогда
ПрежнийРеквизитЗначение = СокрЛП(ПрежнийРеквизитЗначение);
КонецЕсли;
Если НовыйРеквизитЗначение <> ПрежнийРеквизитЗначение Тогда
ЗаписьЖурналаРегистрации(СтрокаСобытие, УровеньЖурналаРегистрации.Предупреждение, МетаданныеОбъекта, Объект.Ссылка, СтрокаСообщение + ИмяТЧ + "." + Реквизит + " в строке " + (Инд + 1) + Символы.ВК + "Прежний: " + Строка(ПрежнийРеквизитЗначение) + Символы.ВК + "Новый: " + Строка(НовыйРеквизитЗначение));
КонецЕсли;
КонецЕсли;

КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЕсли;

КонецЕсли;

КонецПроцедуры



Создать подписку на событие для документов

Источник = ДокументОбъект

Событие = ПередЗаписью

Назначить обработчик события

Процедура ПередЗаписьюДокументаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

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

КонецПроцедуры

Создать подписку на событие для справочников (ПВХ, планов обменов)

Источник = ПланВидовХарактеристикОбъект, ПланОбменаОбъект, СправочникОбъект

Событие = ПередЗаписью

Назначить обработчик события

//Регистрируем изменения для справочника, плана обмена, ПВХ
//
Процедура ПередЗаписьюОбъектаПередЗаписью(Источник, Отказ) Экспорт

Если НЕ Отказ Тогда
РегистрацияИзмененийРеквизитовОбъекта(Источник);
КонецЕсли;

КонецПроцедуры

на случай если статья канет в лету. (с) Поручик

@темы: , Программинг

URL
   

Dictum de omni et nullo.

главная