gifts2017

Простой способ регистрации изменений реквизитов объектов в 1С Предприятии 8.X (делюсь опытом)

Опубликовал Сергей Ожерельев (Поручик) в раздел Программирование - Практика программирования

Потребовалось отслеживать изменения реквизитов справочников, документов (в т.ч. и табличных частях), так как штатный журнал регистрации не даёт достаточной информации. Поскольку внедрять в рабочую конфу какие-то навороченные подсистемы, коих на данном ресурсе и вообще в сети как грязи, не хотелось, решил я сваять небольшую процедуру регистрации изменений в журнале регистрации. Сама идея подобной фичи возникла после прочтения материалов статьи
Механизм детального отслеживания изменения содержимого документов
http://faq1c.gorbunov.ru/node/1
Что из этого получилось, смотрите ниже.

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

// Возвращает значение или структуру с именами и значениями реквизитов произвольного объекта ссылочного типа
// прочитанные из информационной базы
//
// Параметры:
//  Ссылка - произвольный объект ссылочного типа (справочник, документ, план обмена, ПВХ, задача)
//  СтруктураРеквизитов - Необязательно. Может содержать значения:
//                      строка - имя реквизита объекта.
//                      строка - имена реквизитов, перечисленные через запятую, в формате требований к свойствам структуры.
//                      структура - структура с именами реквизитов.
//
//
// Возвращаемое значение:
//  Структура - если СтруктураРеквизитов имеет тип Структура и заполнен - структура с именами и значениями указанных реквизитов
//  Структура - если СтруктураРеквизитов не указан или не заполнен - структура с именами и значениями всех реквизитов объекта
//  Произвольный - если СтруктураРеквизитов строкового типа - значение данного реквизита
//
Функция ПолучитьРеквизитыОбъекта(Знач Ссылка, Знач СтруктураРеквизитов = Неопределено) Экспорт

   
МетаданныеОбъекта = Ссылка.Метаданные();
   
ИмяТаблицы = МетаданныеОбъекта.ПолноеИмя();

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

   
ТекстЗапроса = "ВЫБРАТЬ ";

   
//Формируем список реквизитов объекта для запроса
   
Если ТипЗнч(СтруктураРеквизитов) = Тип("Строка") И ЗначениеЗаполнено(СтруктураРеквизитов) Тогда

       
ТекстЗапроса = ТекстЗапроса + СокрЛП(СтруктураРеквизитов);
       
//Если передали список реквизитов, инициализируем структуру
       
Если Найти(СтруктураРеквизитов, ",") <> 0 Тогда
           
СтруктураРеквизитов = Новый Структура(СтруктураРеквизитов);
        КонецЕсли;

    ИначеЕсли
ТипЗнч(СтруктураРеквизитов) = Тип("Структура") И СтруктураРеквизитов.Количество() > 0 Тогда

        Для каждого
Реквизит Из СтруктураРеквизитов Цикл ТекстЗапроса = ТекстЗапроса + Реквизит.Ключ + ","; КонецЦикла;

       
//Отрезаем последнюю запятую
       
ТекстЗапроса = Лев(ТекстЗапроса, СтрДлина(ТекстЗапроса) - 1);

    Иначе

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

       
СписокРеквизитов = СписокРеквизитов + "ПометкаУдаления,";

        Для каждого
Реквизит Из МетаданныеОбъекта.Реквизиты Цикл СписокРеквизитов = СписокРеквизитов + Реквизит.Имя + ","; КонецЦикла;

       
//Отрезаем последнюю запятую
       
СписокРеквизитов = Лев(СписокРеквизитов, СтрДлина(СписокРеквизитов) - 1);
       
СтруктураРеквизитов = Новый Структура(СписокРеквизитов);

       
ТекстЗапроса = ТекстЗапроса + СписокРеквизитов;

    КонецЕсли;

   
ТекстЗапроса = ТекстЗапроса + "
        |ИЗ "
+ ИмяТаблицы + "
        |ГДЕ Ссылка = &Ссылка"
;

   
Запрос = Новый Запрос;
   
Запрос.Текст = ТекстЗапроса;
   
Запрос.УстановитьПараметр("Ссылка", Ссылка);

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

    Возврат Неопределено;

КонецФункции
//ПолучитьРеквизитыОбъекта()

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

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

       
МетаданныеОбъекта = Объект.Метаданные();

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

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

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

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

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

           
//This code is ported from http://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) + Символы.ВК + "Прежний: " + Строка(ПрежнийРеквизитЗначение) + Символы.ВК + "Новый: " + Строка(НовыйРеквизитЗначение));
                            КонецЕсли;
                        КонецЕсли;

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

    КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Собственно всё. Со вчерашнего дня сие творчество стоит на дежурстве в рабочей конфигурации.

Скриншот результатов работы процедуры в журнале регистрации

Журнал регистрации

 

 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Михаил (mdzen) 11.05.09 23:31
Интересно.
Как в просмотре журнала это смотрится...
2. Armando Armando (Armando) 12.05.09 10:07
Да, точно. Автор, покажи картинку.
ps. мне еще вот это понравилось:
//This code is ported from http://www.kb.mista.ru/article.php?id=115
"Кофе энд булочка. Ниче, что я по-английски?" - From a joke
3. Сергей Ожерельев (Поручик) 12.05.09 10:22
Как-то так. http://forum.aeroion.ru/download434.png
Имя пользователя и машины я потёр, что бы не попалить
4. Сергей Ожерельев (Поручик) 12.05.09 10:24
(2) :) То, что тебе понравилось, это привычка с модописательства для phpbb
5. Armando Armando (Armando) 12.05.09 10:51
(3) Если реквизит был изменен, то хочется видеть на что именно. А то заблудиться можно. Картинку лучше в статью прилепи.
(4) Я так и понял, что привычка. У меня имха, что это как-то нелепо смотрится.

Разукрашенный код намного удобней и приятней смотреть)
6. Armando Armando (Armando) 12.05.09 10:57
И еще. Если это делается для пользователей, то лучше использовать не идентификаторы объектов, а синонимы.
7. Сергей Ожерельев (Поручик) 12.05.09 10:59
>> Если реквизит был изменен, то хочется видеть на что именно.
Ну так кликни по строке в журнале и увидишь полную раскладку по данному событию.
8. Armando Armando (Armando) 12.05.09 11:00
(7) Уже понял. Я просто картинку изучаю))
9. Сергей Ожерельев (Поручик) 12.05.09 11:02
(6) ну тут на каждый чих не наздравствуешься.
10. Юрий Сергеев (registr) 24.05.09 00:02
Полезная вещь.. :) Но я лично, дополнительно решил пойти несколько другим путем - пусть каждый объект еще и сам хранит историю своих изменений, и более подробную...
Motherhubbard; +1 Ответить
11. Сергей Ожерельев (Поручик) 24.05.09 10:25
Если нужна история изменений, да ещё и подробная, да ещё и с восстановлением, вам сюда http://infostart.ru/projects/4040/ или в аналогичные.
12. Сергей Ожерельев (Поручик) 28.05.09 18:04
Немного изменил процедуры. Добавлено обработка отказа и изменения владельца или родителя для элементов справочников.
13. Дмитрий Глеков (glek) 09.06.09 17:04
Ну не знаю, насчет журнала регистрации.
1. Учитывая что анонсировано для 8.1, то почему бы не использовать подписку на события? и типового изменения меньше
2. Кто нить пробовал наложить фильтр на журнал регистрации в случае активной работы? И вы еще хотите туда что-то еще добавлять? и как это потом анализировать?
14. Дмитрий Глеков (glek) 09.06.09 17:05
сорри, не увиждел про подписку.
15. Сергей (Che) Коцюра (CheBurator) 09.06.09 17:14
блин, на семерке этих разработок - вагон и тележка.. и все на 8-ке тех же клоунов лепим.. хоть бы чего нового...
.
1. отслежтвается программное изменение реквизитов? если нет - в сад!
2. способна прога понять, что изменение порядка строк не является изменением? если нет - в сад!
.. пока хватит..
16. Сергей Ожерельев (Поручик) 15.06.09 13:24
CheBurator, взад
1. Отслеживается. Подписка на событие срабатывает в любом случае. Учи матчасть. В сад.
2. не способна, так как и не требовалось по условиям матча. Остальное пох. опять же ва сад.
Luqe; Aleshin94; AndrewVVS; Cyberboy; viddik; wunderland; +6 1 Ответить
17. ValentinV (ValentinV) 17.06.09 20:21
Любопытно.
А пику. Есть ли какие законченные продукты для управления проектами?
Я знаю только: http://v8.1c.ru/solutions/product.jsp?prod_id=32
Уж по деньгам кусаеться.
Надо бы заценить вашу идею.
18. Сергей Ожерельев (Поручик) 19.06.09 12:28
>>>> 2. Кто нить пробовал наложить фильтр на журнал регистрации в случае активной работы? И вы еще хотите туда что-то еще добавлять? и как это потом анализировать?
Кстати для этих целей я внедрил в конфу быстрый журнал регистрации.
http://infostart.ru/projects/3904/
С сабжем добавление не связано.
19. Misha ⁠ (Magister) 13.07.09 18:30
Завтра в работу пустим, посмотрим как покажет себя ))
Из найденного - не регистрирует изменения для ПВХ и планов счетов, ошибка на строчках:
Если МетаданныеОбъекта.Иерархический ....
И
Если (МетаданныеОбъекта.Владельцы.Количество() .....
Нет для них таких свойств метаданных
20. Сергей Ожерельев (Поручик) 17.07.09 23:29
В этиx cтрoкax дoбaвить уcлoвиe ЭтоСправочник. Будет нopмaльнaя cвязь c ceтью, иcпpaвлю.
21. Misha ⁠ (Magister) 21.07.09 12:43
(20)
та это понятно, я для себя исправил уже.

да, ещё - не регистрирует изменение констант. мне в принципе не особо надо было, поэтому не дорабатывал - но теоретически было бы неплохо.
22. Сергей Ожерельев (Поручик) 21.07.09 16:49
Случай для справочников исправил. А с константами песня отдельная и потребности такой у нас тоже нет.
23. Игорешка (V1V) 03.08.09 19:17
Чем не устроил типовой механизм версионирования? Позволяет не только видеть какие реквизиты менялись, что менялось, но также проводит сравнения и откатываться на любую версию. Да и кода многова-то...
24. Сергей Ожерельев (Поручик) 05.08.09 11:25
(23) Версионирование где? В УПП? Есть такое, начиная с релиза 1.2.23

А в других конфах?
Или он, по-твоему, зашит на уровне платформы или появляется по щучьему велению?
25. Игорешка (V1V) 06.08.09 07:26
(24) А в других "конфах" можно эту идею реализовать с минимальными изменениями. Либо дождаться очередного релиза, благо не долго ждать.
26. Сергей Ожерельев (Поручик) 06.08.09 09:28
Желающие, конечно, могут подождать. Учитывая расторопность 1С
27. Артур Аюханов (artbear) 06.08.09 09:32
(25) Совершенно не уверен, что 1С будет подобные "идеи" реализовывать во всех типовых конфах.
Например, ИМХО в БП им это нафиг не нужно, до сих пор механизм полезнейший механизм свойств не добавили :(
В ЗиК-е вполне могут добавить, хотя также очень сомневаюсь.

(23) Кода многовато? ты в УПП-то код версионирования видел? :)
28. Сергей Ожерельев (Поручик) 10.08.09 15:02
Изменений в коде нет.
Поменял только ссылку на источник вдохновения (первоначальная уже не работала).
29. Сергей Ожерельев (Поручик) 07.09.09 21:19
Изменения в коде после одной массовой обработки справочника.
Сделал игнорирование удаления ведущих или ведомых пробелов в строковых реквизитах.
30. Ксения М. (SunnyCat) 11.09.09 08:02
А как бы еще добавить отслеживание изменений в Регистрах сведений? Ладно те, которые регистраторам подчиняются - в большинстве случаев все изменения можно в документах увидеть, а у нас еще есть такие, куда пользователи ручками изменения вносят - изменения налоговых ставок, вычетов НДФЛ, периодических констант и много чего еще, так вот хотелось бы видеть кто, что и когда внес, изменил. По аналогии сделать не удалось - в событиях ПриЗаписи и Запись есть только Отказ и Замещения, сами данные-то не передаются. Киньте идею как реализовать, чтобы данные так же заносились в журнал регистрации? (конфа зарплатная, не типовая, написана на заказ)
31. Артур Аюханов (artbear) 30.01.10 08:25
При использовании этой схемы в 8.1.15/14 мои пользователи стали жаловаться на постоянные блокировки
Причем система до этого работала не один месяц, проблемы с блокировками были незаметны.
В результате анализа выяснил, что ошибка в использовании объектного подхода - типа ПрежнийОбъект.Номер
А прежний объект - это ведь ссылка, и идет получение инфы из базы.
Перевел код на использование запросов, блокировки исчезли.
32. Сергей Ожерельев (Поручик) 31.01.10 02:36
(31) Значит, мне ещё везёт, сам таких жалоб не слышал. Будет время, займусь переписыванием.
33. Артур Аюханов (artbear) 31.01.10 10:20
(32) Могу выложить готовый код.
В мыло или в личку или в аську.
34. Сергей Ожерельев (Поручик) 31.01.10 18:18
(33) Кинь в личку, завтра может помозгую.
Как раз собираюсь конфу обновлять.
35. Сергей Ожерельев (Поручик) 23.07.10 00:21
Не знаю, кому это ещё нужно, но выложил обновлённый вариант с чтением реквизитов запросом.
sound; GIO; +2 Ответить 1
36. Анатолий (Yasen) 23.07.10 07:46
Идея хороша, но изнутри транзакции проведения документа писать лишнее в журнал регистрации - не айс. Это далеко не самый быстрый объект.
Лучше накапливать изменения и записывать их в журнал после того как зафиксирована транзакция и освобождены все блокировки
37. Сергей Ожерельев (Поручик) 23.07.10 12:32
Не спорю, но заморачиваться уже нет особого желания и времени.
38. sound sound (sound) 10.03.11 15:16
(35) Мне надо. То есть тут не последняя версия?
39. Сергей Ожерельев (Поручик) 10.03.11 15:21
(38) Это и есть последняя версия. Та, которую протестил в прежней конторе, перед выпиливанием оттуда.
40. sound sound (sound) 10.03.11 15:24
(39) А все .. понял, сорри, не увидел что текст запроса кусками формируется
PS блин так неудобно стало когда обработку от обсуждения отделили...
41. Андерсен Ковальски (Vovanich) 30.10.11 18:31
Тема актуальная.Кстати в какой модуль это прикручивать?
42. Сергей Ожерельев (Поручик) 30.10.11 18:35
(41) Расскажу за деньги, если читать не умеешь.
43. Андерсен Ковальски (Vovanich) 30.10.11 18:42
Спасиба почитал повнимательнее в том числе код.)))
44. Сергей (seandr) 17.11.11 09:20
Очень простое и гибкое решение... нечто подобное для 7-ки делал в свое время, правда без подписок на событие естетственно ))). По поводу блокировок - ни я ни пользователи не заметили проблем.
45. Сергей Ожерельев (Поручик) 17.11.11 09:31
(44) Как эту статью вижу, так сразу вспоминаю контору, в которой тогда работал. Не от хорошей жизни пришлось выдумывать и прикручивать.
46. Михаил Иванов (wwizard) 13.03.12 13:29
Пожалуйста подскажите тому кто не понимает, а очень надо: в каком документе/модуле это все надо дописать?
47. Сергей Ожерельев (Поручик) 13.03.12 14:56
(46) Обратитесь лучше к специалисту, не то донаписываете.
48. Kani Mago (Kaniman) 03.08.12 11:14
Спасибо! особенно, что просто приведен код для вставки в конфигурацию. То, что надо!
49. Карина Козырева (Люпин) 15.08.12 16:15
Статья супер! Очень пригодилось! Спасибо огромное автору!
50. Сергей Ожерельев (Поручик) 15.08.12 22:09
Кстати говоря, на 8.2 в режиме управляемого приложения, приведенный код будет исполняться на клиенте. В 8.1. с этим в порядке, исполнение идёт на сервере.
51. Андрей М. (StepByStep) 17.12.12 22:33
В 8.2 в управляемом приложении в ряде конфигураций появилась сущность "блокируемые реквизиты", т.е. реквизиты, которые нельзя/не рекомендуется изменять после того, как "элементы" (типа Справочника, ПВХ) используются в документах.
52. Геннадий Долгих (FlyLink) 29.03.13 12:54
53. Сергей Ожерельев (Поручик) 03.06.13 13:52
Что-то волна пошла. Это поделие ещё кому-то интересно?
54. Александр Хомяк (logarifm) 03.06.13 14:13
Из этого всего страдает самое важное - ПРОИЗВОДИТЕЛЬНОСТЬ!!!

ИМХО - надо использоввать ПОДСИСТЕМУ "Версионирование" предложенною самой 1С.
55. Александр Крынецкий (echo77) 03.06.13 18:16
(54) Надо, только её нет в БП, УТ, и куче других не топовых типовых :-)
56. Maxim Kolkin (the1) 04.06.13 09:48
Я, пожалуй, попробую запилить в свою конфу, посмотрим, как дело пойдет =)
57. Maxim Kolkin (the1) 04.06.13 10:59
Запилил, все работает! Спасибо большое, а то админы давно просили. Единственное, что я добавил, так это возможность вкл/выкл возможность записи в журнал регистрации по значению константы "Вести дополнительный журнал регистрации", мало ли тормоза нарисуются в будущем. А так респект!
58. Maxim Kolkin (the1) 04.06.13 11:11
И да, реально не хватает контроля записи в РС, например Контактная информация или Ответственные лица. Как бы реализовать, нет мыслей?
59. Роман Ложкин (webester) 05.06.13 08:35
Получилось неплохо. Я тоже сделал но мой код все таки немного хуже оказался, может даже заберу твой, зафигачу к себе после обработки напильником. Кароч, жирный "+", жаль нельзя два поставить.
60. Евгений Шабалин (xzorkiix) 06.06.13 19:21
(58) the1, Подпись на события перед записью не предлагать? (в рамках обсуждаемого решения)

см. справку по РегистрСведенийНаборЗаписей
метод Метаданные() у объекта есть, см. Имя Регистра, определяем нужно ли по нему вести историю
Отбор - доступен, через него можно же получить текущее состояние ИБ
Сравнить Источник и Текущее состояние в ИБ.
61. Alexey Rozhkov (MartyNSK) 18.06.13 17:45
Буду пробовать у себя в конфе, спасибо за инфу!
62. Timur (timm00) 19.06.13 01:12
Сделано "для себя") подправить?
63. Алексей Опарихин (Al-X) 20.06.13 15:34
Спасибо. Внедряю у себя...
64. Сергей Ожерельев (Поручик) 23.06.13 00:42
Просто удивительно, насколько популярным и востребованным даже спустя четыре года оказалось это поделие.
65. Алексей Земсков (Aleksey.z) 26.06.13 11:24
(64) Поручик, Да вот все ждем когда 1С займется средой разработки. Давно пора журнал регистрации вести в СУБД и серьезно его доработать.
66. Алексей Соловьев (Silenser) 26.06.13 12:15
Решение интересное, но с оговоркой, для больших баз лучше использовать подсистему версионирования из БСП.
В типовом варианте сериализация в XML и сохранение в регистр работать будет значительно быстрее, а значит вероятность получить дедлок существенно меньше, т.к. в обоих случаях работаем в рамках транзакции записи.
67. Maxim Kolkin (the1) 14.08.13 17:15
Вываливается в ошибку в серверном варианте работы базы "Попытка передачи мутабельного значения с клиента на сервер", т.к. подписка на события находится в общем модуле Клиент (обычное приложение) и Сервер, а регистрация изменений происходит в ОМ Сервер. Что бы такого лучше сделать?
68. Сергей Ожерельев (Поручик) 14.08.13 19:02
(67) Внимательно прочитать тему и снять флажок сервер с модуля.
69. Maxim Kolkin (the1) 15.08.13 09:35
(68) внимательно прочитал еще раз

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

добавил

флажок сервер с модуля

а вот это не катит, иначе как у меня будет работать модуль, если его вообще нЕоткуда вызвать?!

Может, подписки и регистрацию изменений разместить в одном модуле?
70. Сергей Ожерельев (Поручик) 15.08.13 09:44
(69) 300 рублей и займусь вашей проблемой.
71. Maxim Kolkin (the1) 15.08.13 10:07
(69) Таки добавил в один модуль, вроде все работает. Буду тестить...

(70) Думаю, сам разберусь ;)
72. Александра Безгодова (ab471vi) 16.09.13 06:20
Спасибо, мне очень пригодилось на управляемых формах!!!
73. Dmitry Che (adream77) 04.03.14 12:07
Понравилось, попробую по возможности.
Прикрепленные файлы: