Имя: Пароль:
1C
 
История документа
0 shola
 
13.06.07
14:14
помогите, дело в том, что необходимо придумать оптимальное программное решение для просмотра истории изменения  документа
1 Мулька
 
13.06.07
14:15
ДБФ / СКЛ ?
2 Лефмихалыч
 
13.06.07
14:18
(0) много вариантов. Например, создать служебный документ, вводимый автоматом на основании текущего при записи. В этом документе хранить значения полей доумента.
3 Kondarat
 
13.06.07
14:21
4 Лефмихалыч
 
13.06.07
14:27
(0) кстати, фпоиск! Со словами: "история изменения документ"
5 КапЛей
 
13.06.07
14:29
Процедура глРегистрацияИзменений(Конт, Проц="") Экспорт
Перем ТЗ, ТЧ, ТзПред, Предст;

   Попытка
       Конт = Конт.ТекущийДокумент();
   Исключение
       Возврат;
   КонецПопытки;
   
   Если ПустоеЗначение(Конт) = 1 Тогда
       Возврат;
   КонецЕсли;
   ВидДок = Конт.Вид();
   
   ИдДок = ЗначениеВСтрокуВнутр(Конт);
   ИдДок = Число(Сред(ИдДок, Найти(ИдДок, " ")));

   // Организация ФС
   ИмяКаталога1 = Шаблон("[КаталогИБ()]Log\");
   ИмяКаталога2 = Шаблон("[КаталогИБ()]Log\[ВидДок]\");
   ИмяКаталога3 = Шаблон("[КаталогИБ()]Log\[ВидДок]\[ИдДок]\");
   
   Если ФС.СуществуетФайл(ИмяКаталога1) = 0 Тогда
       ФС.СоздатьКаталог(ИмяКаталога1);
   КонецЕсли;
   Если ФС.СуществуетФайл(ИмяКаталога2) = 0 Тогда
       ФС.СоздатьКаталог(ИмяКаталога2);
   КонецЕсли;
   Если ФС.СуществуетФайл(ИмяКаталога3) = 0 Тогда
       ФС.СоздатьКаталог(ИмяКаталога3);
   КонецЕсли;

   Т = СоздатьОбъект("Текст");
   ТЗ = СоздатьОбъект("ТаблицаЗначений");
   ТЗ.Выгрузить(ТзПред);
   ТЗ.НоваяКолонка("Автор");
   ТЗ.НоваяКолонка("Дата");
   ТЗ.НоваяКолонка("Время");
   ТЗ.НоваяКолонка("Шапка");
   ТЗ.НоваяКолонка("ТЧ");
   
   СзШ = СоздатьОбъект("СписокЗначений");
   
   
   Нули = "00000";
   ИмяФайла = ФС.НайтиПервыйФайл(ИмяКаталога3+"*.txt");
   ПослФайл = ИмяФайла;
   Пока ИмяФайла <> "" Цикл
       ПослФайл = ИмяФайла;
       ИмяФайла = ФС.НайтиСледующийФайл();
   КонецЦикла;
   
   Если (ПустоеЗначение(ПослФайл) = 0) и (Проц = "ПриОткрытии") Тогда
       Возврат;
   КонецЕсли;
   
   Если ПослФайл = "" Тогда
       ИмяФайла = Нули;
   Иначе
       ИмяФайла = Прав(Нули + (Число(ПослФайл)+1), 5);
   КонецЕсли;
   
   СзШ.Установить("ДатаДок", Конт.ДатаДок);
   СзШ.Установить("НомерДок", Конт.НомерДок);

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

   ЕстьИзменения = 0;
   Если ПустоеЗначение(ПослФайл) = 0 Тогда
       ЗначениеИзФайла(ИмяКаталога3+ПослФайл, ТзПред);
       ПредСзШ = ТзПред.ПолучитьЗначение(1, "Шапка");
       ПредТЧ  = ТзПред.ПолучитьЗначение(1, "ТЧ");
       Если ТипЗначенияСтр(ПредТЧ) <> "ТаблицаЗначений" Тогда
           ТЧ.Выгрузить(ПредТЧ);
           ПредТЧ.УдалитьСтроки();
       КонецЕсли;
       Если ПредСзШ.Получить("ДатаДок") <> СзШ.Получить("ДатаДок") Тогда
           ЕстьИзменения = 1;
       КонецЕсли;
       Если ПредСзШ.Получить("НомерДок") <> СзШ.Получить("НомерДок") Тогда
           ЕстьИзменения = 1;
       КонецЕсли;
       
       Если ЕстьИзменения = 0 Тогда
           Для Ном = 1 По СзШ.РазмерСписка() Цикл
               ТекЗн = СзШ.ПолучитьЗначение(Ном, Предст);
               Если ПредСзШ.Получить(Предст) <> ТекЗн Тогда
                   ЕстьИзменения = 1;
                   Прервать;
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;
       
       Если (ТЧ.КоличествоСтрок() <= 1000) и (ПредТЧ.КоличествоСтрок() <= 1000) Тогда
           ПредТЧ.НоваяКолонка("_СравнениеТЗ");
           ПредТЧ.ВыбратьСтроки();
           Пока ПредТЧ.ПолучитьСтроку() = 1 Цикл
               Состояние(ПредТЧ.НомерСтроки);
               ПредТЧ._СравнениеТЗ = -1;
           КонецЦикла;
           ТЧ.НоваяКолонка("_СравнениеТЗ");
           ТЧ.ВыбратьСтроки();
           Пока ТЧ.ПолучитьСтроку() = 1 Цикл
               Состояние(ТЧ.НомерСтроки);
               ТЧ._СравнениеТЗ = 1;
           КонецЦикла;
           КолСтр1 = ПредТЧ.КоличествоСтрок();
           КолСтр2 = ТЧ.КоличествоСтрок();
           Если КолСтр2 <> 0 Тогда
               ПредТЧ.КоличествоСтрок(КолСтр1+КолСтр2);
           КонецЕсли;
           Если КолСтр2 <> 0 Тогда
               Если КолСтр1 = 0 Тогда
                   ТЧ.Выгрузить(ПредТЧ);
               Иначе
                   ПредТЧ.Заполнить(ТЧ, КолСтр1+1);
               КонецЕсли;
           КонецЕсли;
           ПредТЧ.Свернуть(СтрокаТЧ, "_СравнениеТЗ");
           ПредТЧ.Сортировать("_СравнениеТЗ");
           Если ПредТЧ.КоличествоСтрок() > 0 Тогда
               Если (ПредТЧ.ПолучитьЗначение(1,"_СравнениеТЗ") <> 0) или (ПредТЧ.ПолучитьЗначение(ПредТЧ.КоличествоСтрок(),"_СравнениеТЗ") <> 0)  Тогда
                   ЕстьИзменения = 1;
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
   Иначе
       ЕстьИзменения = 1;
   КонецЕсли;
   
   Если ЕстьИзменения = 1 Тогда
       ТЗ.НоваяСтрока();
       Если ПустоеЗначение(ПослФайл) = 1 Тогда
           //ТЗ.Автор = "";
       Иначе
           ТЗ.Автор = ?(ПустоеЗначение(ПолноеИмяПользователя())=0,ПолноеИмяПользователя(),ИмяПользователя());
       КонецЕсли;
       ТЗ.Дата     = ТекущаяДата();
       ТЗ.Время = ТекущееВремя();
       ТЗ.Шапка = СзШ;
       Если ТЧ.КоличествоСтрок() <= 1000 Тогда
           Попытка
               ТЧ.УдалитьКолонку("_СравнениеТЗ");
           Исключение
           КонецПопытки;
           ТЗ.ТЧ     = ТЧ;
       КонецЕсли;
   
       ЗначениеВФайл(ИмяКаталога3+ИмяФайла+".TXT", ТЗ);
   КонецЕсли;

   ТЗ = 0;
   ФС.НайтиПервыйФайл(КаталогИБ());
   
КонецПроцедуры // глРегистрацияИзменений()

откуда взял уже не помню. вроде с инфостарта. и отчетик по изменениям там же валялся. клиенты довольны.
6 BSV
 
13.06.07
15:31
(5) Тогда уж и отчет куда-нибудь выложи.