Имя: Пароль:
1C
1С v8
Была где-то Функция...
0 Два вопроса
 
09.10.13
09:48
Есть такая функция долгая и нудная, по метаданным написанная, типовая, вроде. Она вызывается "приЗаписи и возвращает список реквизитов, которые были поредактированы. По метаданным обходит все реквизиты и табличные части построчно.
Вызывается примерно так:

Если СписокИзменившихсяРеквизитов(Источник) = "Дата,Номер" ИЛИ СписокИзменившихсяРеквизитов(Источник) = "Дата" ИЛИ СписокИзменившихсяРеквизитов(Источник) = "Номер" Тогда

Только не могу найти её.
1 Нуф-Нуф
 
09.10.13
09:49
поиск не предлагать?
2 Два вопроса
 
09.10.13
09:56
Предлагать... Желательно с указанием в какой конфигурации....
3 Рэйв
 
09.10.13
09:59
(0)Может тебе текст кода дать?:-)
У меня самописная есть.
4 Рэйв
 
09.10.13
09:59
похожая
5 Два вопроса
 
09.10.13
10:03
Она не глючная? Можно.
6 Рэйв
 
09.10.13
10:08
(5)Чему там гдючить? Простая как табуретка.
у меня 2 функции для проверки измененных реквизитов и записи истории на подписках лежат. На справочники и на документы. Все давно работает.
Тебе я так понял на доки надо.
Подправишь под свои нужды если что.

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

КонецПроцедуры
7 Два вопроса
 
09.10.13
10:21
Точно, как табуретка. Спасибо.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший