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

Публикация № 19949

Разработка - Практика программирования

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

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

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

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

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

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

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

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

добавил

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

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

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

(70) Думаю, сам разберусь ;)
72. ab471vi 1 16.09.13 06:20 Сейчас в теме
Спасибо, мне очень пригодилось на управляемых формах!!!
73. adream77 04.03.14 12:07 Сейчас в теме
Понравилось, попробую по возможности.
Прикрепленные файлы:
74. MaximKor 11 06.05.17 17:49 Сейчас в теме
Спасибо за статью! Очень пригодилась!
75. user730384 06.05.17 18:04 Сейчас в теме
76. masik777 02.08.20 11:00 Сейчас в теме
Все здорово, конечно. Но вот понадобилось поставить на УТ 10.3 ( 33.1)
и хотел спросить, заработает ли? Ну или помочь за денежку)) Сергей, ты же писал, что если не за бесплатно, то поможешь)
77. Поручик 4435 20.08.20 16:54 Сейчас в теме
(76) Для УТ 10.3 делалось. Проблема в чём?
Оставьте свое сообщение

См. также

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    37584    unichkin    74    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    28193    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    24850    John_d    22    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    19109    kuzyara    33    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    30622    tormozit    100    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    17314    YPermitin    72    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    8610    Sibars    19    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    34263    Yashazz    50    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    78248    tormozit    131    

О программе Postman для тестирования API и для чего она нужна 1С-нику

Практика программирования Программное обеспечение (software) v8 Бесплатно (free)

Для чего нужна программа Postman для тестирования API и какая от него польза для 1С-программиста.

24.09.2019    12266    budidich    28    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    52165    rpgshnik    63    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    50676    ids79    54    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    48716    tormozit    41    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    29247    YPermitin    24    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    25767    YPermitin    80    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    31984    ids79    16    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    45073    tormozit    74    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    85828    ids79    49    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    36692    avalakh    22    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    24670    json    14    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    16136    m-rv    2    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    61965    ids79    11    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    36439    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    26429    YPermitin    14    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

... и немного теории обмена данными. В частности, разберем боль всех, кто пишет небанальные обмены данными: как набору записей регистра сведений назначить гуид и далее использовать его в обмене для идентификации этого набора.

16.04.2019    20394    m-rv    17    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    19802    SeiOkami    50    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Варианты отчетов, работа с настройками вариантов: структура группировок, поля отчета, отборы, сортировка, условное оформление, другие настройки, настройки отображения диаграмм.

02.07.2019    48324    ids79    17    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    53768    ids79    25    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    30914    m-rv    21    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    25450    dmurk    145    

Регистры накопления. Виртуальные таблицы. Часть №2: "Остатки" и "Остатки и обороты"

Практика программирования v8 1cv8.cf Бесплатно (free)

Описание работы платформы 1С:Предприятие 8.2 с виртуальными таблицами регистров накопления "Остатки" и "Остатки и обороты". Анализ SQL-запрос при работе с виртуальными таблицами

22.05.2019    25958    YPermitin    7    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    44077    YPermitin    30    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    28364    itriot11    34    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    35778    ellavs    126    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    27628    ellavs    90    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    31734    YPermitin    53    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    76737    Serginio    108    

Ошибки при работе с хранилищем конфигурации и способы их решения

Практика программирования v8 Бесплатно (free)

В статье собраны наиболее распространенные ошибки при работе с хранилищем конфигурации и способы их обхода и решения.

01.03.2019    40460    Смешной 1С    28    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.

26.02.2019    22433    Vladimir Litvinenko    27    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    35237    ids79    40    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    40620    ids79    9    

Тестер: частые вопросы Промо

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    29398    grumagargler    28    

EnterpriseData – часть 2. Процесс выгрузки данных

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    27198    ids79    31    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    42118    ids79    72    

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации

Практика программирования Обмен через XML v8 v8::УФ БП3.0 УТ11 Россия Бесплатно (free)

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    37688    ids79    42    

Ускоряем 1С: модули с повторным использованием возвращаемых значений Промо

Практика программирования v8 Бесплатно (free)

По роду своей деятельности, мне часто приходится обсуждать с программистами детали реализации той или иной функциональности. Очень часто, разговаривая даже с квалифицированными специалистами я сталкиваюсь с незнанием сути платформенной функциональности Повторного использования возвращаемых значений общих модулей. В данной статье я постараюсь дать краткий обзор и основные особенности этой функциональности.

04.09.2017    53108    m-rv    61    

Программное заполнение пользовательских параметров и отборов СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Публикация представляет из себя краткие примеры того, как можно заполнять параметры СКД программно так, чтобы все параметры и отборы были доступны в быстрых настройках и в обычных (типовых) настройках параметров и отборов СКД.

13.11.2018    48950    Unk92    25