Имя: Пароль:
1C
1C 7.7
v7: Журнал регистрации (готовые решения)
0 pofigos
 
12.07.12
12:52
Всех приветствую.
Прошу прощения, если данный вопрос уже поднимался..
Может кто подсказать, есть ли какое-то готовое решение расширенного журнала регистрации. Необходимо знать что именно было сделано пользователем... Вплоть до добавлении строки в документе, изменения даты или любого реквизита, с указанием его. Желательно еще конечно, как тот или иной документ повлиял на регистры... Почему спросил готовый, времени мало писать самому с нуля, но если не будет, придется. а что творят пользователи, что так скачут остатки понять не могу... Никто не признается, хоть в тиски зажимай и пытай.
Заранее спасибо.
1 Kavar
 
12.07.12
12:53
Версирование. переходите на УПП там это реализовано.
2 andrewalexk
 
12.07.12
12:54
(0) :)) "Желательно еще конечно, как тот или иной документ повлиял на регистры.."...глубоко копаешь
3 viktor_vv
 
12.07.12
12:54
4 1Сергей
 
12.07.12
12:55
Journal.dll
5 1Сергей
 
12.07.12
12:55
а, не... не то
6 pofigos
 
12.07.12
12:57
(2) Уж как есть. Просто не понятно, как могут провести отгрузку, если на складе нет товара. Стоят четкие ограничения на выписку товара... Вот и интересно кто и что делает. Даже интересно как??
(3) Спасибо, буду смотреть
7 Ёпрст
 
12.07.12
12:58
(3) медленно это всё..
8 Скользящий
 
12.07.12
13:01
это в Семерке?
9 Vladal
 
12.07.12
13:01
(0) Я создавал дополнительный служебный документ, в реквизитах которого хранил
- ссылку на редактируемый документ
- значение реквизита
- итоги полей ТЧ до и после правки
- дату, время и автора правки.

Всё это делалось программно и только для проведенных документов, т.к. манагеры могли несколько раз менять (дописывать) свои заявки и корректировать их.
10 pofigos
 
12.07.12
13:03
(8) Да, семерка
(9) В свое время в одной из компаний было реализовано на справочниках. Мысль ясна, примерно так и думал делать, правда когда будет свободное время.
11 Mikeware
 
12.07.12
13:04
(10) "думал делать"....
там делать - пара часов, с отладкой - день.
12 dk
 
12.07.12
13:04
делал такое, тут вроде кусками выкладывал
суть
в ПриЗаписи сравниваешь все реквизиты Контекст и ТекущийДокумент() / ТекущийЭлемент()
13 pofigos
 
12.07.12
13:05
(11) с учетом текущей работы, времени не так много... вечером займусь
14 pofigos
 
12.07.12
13:08
Спасибо за наводки и ссылки всем.
15 Vladal
 
12.07.12
13:15
(14) Вот нашел старый код:

Процедура глРедактирование(Конт,Режим,Элемент,ОписаниеИзменения="",ПредЗначение="") Экспорт
   Перем Цель;
   Если Режим=5 Тогда
       Если Элемент.Вид()="Редактирование" Тогда
           Возврат;
       Иначе
           Конт=Элемент;
       КонецЕсли;
   ИначеЕсли (ПустоеЗначение(Элемент)=0) и (Режим<>7) Тогда
       Конт=Элемент;
   ИначеЕсли (ПустоеЗначение(Конт)=1) Тогда
       Возврат;
   КонецЕсли;
   Если Режим=1 Тогда
       Цель="Просмотр";
   ИначеЕсли Режим=2 Тогда
       Цель="Печать";
   ИначеЕсли Режим=3 Тогда
       Предупреждение("Вы редактируете проведенный документ!", глТаймаут);
       Если ВвестиСтроку(Цель,"Цель редактирования",40)<>1 Тогда
           СтатусВозврата(0);
       КонецЕсли;
       Если ПустоеЗначение(Цель)=1 Тогда
           Цель="Редактирование без описания причины";
       КонецЕсли;
   ИначеЕсли Режим=4 Тогда
       Цель="Удаление проведения";
   ИначеЕсли Режим=5 тогда
       Цель="Удаление документа";
   ИначеЕсли Режим=6 тогда
       Цель="Редактирование"
   ИначеЕсли Режим=7 тогда
       Цель="Удаление строки";
   КонецЕсли;
   сПольз = СоздатьОбъект("Справочник.Пользователи");
   сПольз.НайтиПоКоду(ИмяПользователя());
   ДокРедактирования = СоздатьОбъект("Документ.Редактирование");
   Если ДокРедактирования.НайтиПоНомеру(Конт.НомерДок)=0 Тогда
       ДокРедактирования.Новый();
       //ДокРедактирования.Автор    = сПольз.ТекущийЭлемент();
       ДокРедактирования.НомерДок = Конт.НомерДок;
       ДокРедактирования.ДатаДок  = ТекущаяДата();
       ДокРедактирования.Док      = Конт.ТекущийДокумент();
   КонецЕсли;
   ДокРедактирования.НоваяСтрока();
   ДокРедактирования.ДатаПравки = ТекущаяДата();
   ДокРедактирования.ВремяПравки = ТекущееВремя();
   ДокРедактирования.АвторРед = сПольз.Наименование;
   ДокРедактирования.Описание = Цель;
   ДокРедактирования.ПредЗначение = ПредЗначение;
   Попытка
       Если ПустоеЗначение(Элемент)=1 Тогда
           Рекв=Конт.Форма.АктивныйЭлемент();
           Если ПустоеЗначение(Конт.Форма.АктивныйЭлемент())=1 Тогда
               Возврат;
           Иначе
               Если Режим=2 Тогда
                   Значен= "Печать";
               ИначеЕсли (Режим<>4)или(Режим<>5)или(Режим<>7) Тогда
                   Попытка
                       Значен = Конт.ПолучитьАтрибут(Конт.Форма.АктивныйЭлемент());
                   Исключение
                       Значен = Элемент;
                   КонецПопытки;
               Иначе
                   Значен = Элемент;
               КонецЕсли;
           КонецЕсли;
       Иначе
           Рекв="";
           Значен=Строка(Элемент);
       КонецЕсли;
   Исключение
   Конецпопытки;
   ДокРедактирования.Реквизит = Рекв;
   ДокРедактирования.Значение =Строка(Значен);
   ДокРедактирования.Записать();
КонецПроцедуры
16 Vladal
 
12.07.12
13:18
А в элементах формы, для которых надо отслеживать изменения, писал в формулу эту процедурку:
глРедактирование(Контекст,3,)

Идея по-моему на hare или проклабе была.
17 Mikeware
 
12.07.12
13:18
(15) документ - не айс. (нагрузка на 1сджорнал)
вот скопипиздженное лет 8 назад откуда-то, работает без проблем...
Процедура АудитДокумента(Конт,КомментарийДействия="перезаписан") Экспорт

   //Если ТипЗначенияСтр(Конт) <> "ГрупповойКонтекст" Тогда
   //    СтатусВозврата(0);
   //    Возврат;
   //КонецЕсли;

   // документ еще не был записан - он новый
   Если Конт.ТекущийДокумент().Выбран() = 0 Тогда
       //АудитЗапись(Конт,"записан новый");
       Возврат;
   КонецЕсли;

   ВидДок = Конт.Вид();
   МетДок=Метаданные.Документ(ВидДок);

   // Ищем прежднюю запись документа с тем, что БЫЛО
   // Если не удается, то увы...
   СтДок = СоздатьОбъект("Документ."+ВидДок);
   Если СтДок.НайтиДокумент(Конт.ТекущийДокумент()) = 0 Тогда
       Возврат;
   КонецЕсли;

   //[*]MS@ТКП, 05.02.2010
   //АудитЗапись(Конт,"перезаписан");
   // -------------
   АудитЗапись(Конт, КомментарийДействия);
   //[*]_

   //ЧТО изменяют
   Реквием = ""+СтДок.ДатаДок+";"+СтДок.ПолучитьВремя()+";"+Конт.ПредставлениеВида()+";"+Конт.НомерДок+";"+Строка(РабочаяДата())+";"+ТекущееВремя()+";"+ИмяКомпьютера()+";"+ИмяПользователя()+";";

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

   // ------ В ОБЩИХ РЕКВИЗИТАХ ДОКУМЕНТА --------
   Для инд=1 по Метаданные.ОбщийРеквизитДокумента() Цикл
       Идентиф=Метаданные.ОбщийРеквизитДокумента(инд).Идентификатор;

       СтДанные = СтДок.ПолучитьАтрибут(Идентиф);
       НовДанные = Конт.ПолучитьАтрибут(Идентиф);
       Если СтДанные <> НовДанные then
           ДокИзмененияЗапись(Идентиф,"<"+Строка(СтДанные)+">на<"+Строка(НовДанные)+">");
       КонецЕсли;
   КонецЦикла;

   // ------ В РЕКВИЗИТАХ ШАПКИ ДОКУМЕНТА --------
   Для Инд=1 по МетДок.РеквизитШапки() Цикл
       Идентиф=МетДок.РеквизитШапки(Инд).Идентификатор;

       СтДанные = СтДок.ПолучитьАтрибут(Идентиф);
       НовДанные = Конт.ПолучитьАтрибут(Идентиф);
       Если СтДанные <> НовДанные Тогда
           ДокИзмененияЗапись(Идентиф,"<"+Строка(СтДанные)+">на<"+Строка(НовДанные)+">");
       КонецЕсли;
   КонецЦикла;

   // ------ В РЕКВИЗИТАХ ТАБЛИЧНОЙ ЧАСТИ --------

   СтСписок=СоздатьОбъект("СписокЗначений");
   НовСписок=СоздатьОбъект("СписокЗначений");

   СтСписок1=СоздатьОбъект("СписокЗначений");
   НовСписок1=СоздатьОбъект("СписокЗначений");

   СтДок.ВыбратьСтроки();
   Пока СтДок.ПолучитьСтроку() = 1 Цикл
       РезСтрока="^";
       Для Инд=1 по МетДок.РеквизитТабличнойЧасти() Цикл
           Идентиф=МетДок.РеквизитТабличнойЧасти(Инд).Идентификатор;
           СтДанные = СтДок.ПолучитьАтрибут(Идентиф);
           РезСтрока=РезСтрока+СокрЛП(Строка(СтДанные))+"^";
       КонецЦикла;
       СтСписок.ДобавитьЗначение(РезСтрока);
   КонецЦикла;

   Конт.ВыбратьСтроки();
   Пока Конт.ПолучитьСтроку() = 1 Цикл
       РезСтрока="^";
       Для Инд=1 по МетДок.РеквизитТабличнойЧасти() Цикл
           Идентиф=МетДок.РеквизитТабличнойЧасти(Инд).Идентификатор;
           НовДанные = Конт.ПолучитьАтрибут(Идентиф);
           РезСтрока=РезСтрока+СокрЛП(Строка(НовДанные))+"^";
       КонецЦикла;
       НовСписок.ДобавитьЗначение(РезСтрока);
   КонецЦикла;

   КолСт=СтСписок.РазмерСписка();
   КолНов=НовСписок.РазмерСписка();

   Для Инд=1 по КолСт Цикл
       НайдСтрока=СтСписок.ПолучитьЗначение(Инд);
       ТочкаНовая=НовСписок.НайтиЗначение(НайдСтрока);
       Если ТочкаНовая=0 Тогда
           СтСписок1.ДобавитьЗначение(НайдСтрока);
       КонецЕсли;
   КонецЦикла;

   Для Инд=1 по КолНов Цикл
       НайдСтрока=НовСписок.ПолучитьЗначение(Инд);
       ТочкаСтарая=СтСписок.НайтиЗначение(НайдСтрока);
       Если ТочкаСтарая=0 Тогда
           НовСписок1.ДобавитьЗначение(НайдСтрока);
       КонецЕсли;
   КонецЦикла;

   СтСписок="";
   НовСписок="";

   КолСт=СтСписок1.РазмерСписка();
   КолНов=НовСписок1.РазмерСписка();

   СтСписок1.Сортировать();
   НовСписок1.Сортировать();

   НН=Макс(КолСт,КолНов);
   Для Инд=1 по НН Цикл
       Если КолСт>=Инд Тогда
           СтДанные=СтСписок1.ПолучитьЗначение(Инд);
           ДокИзмененияЗапись("Старая строка",Строка(СтДанные));
       КонецЕсли;
       Если КолНов>=Инд Тогда
           НовДанные=НовСписок1.ПолучитьЗначение(Инд);
           ДокИзмененияЗапись("Новая строка",Строка(НовДанные));
       КонецЕсли;
   КонецЦикла;
   //Конт.ДатаВремя=ЧислоДатаВремя();
КонецПроцедуры
18 Vladal
 
12.07.12
13:20
(6) 1) задним числом это всё делается. Был приход, продали, потом партию удалили или перепровели приход и быдлокод сформировал новую партию.
19 Vladal
 
12.07.12
13:20
(17) Взял на заметку
20 pofigos
 
12.07.12
13:24
(17) Спасибо.
(18) Теоретически это понятно. Вопрос в том, что правится код от прошлых людей.. и в хорошем кол-ве. Ставлю временные заплатки и ограничения. Все равно умудряются как-то. С правами разобраться еще надо на перепроведение, снятие с проведения, пометки на удаление и тем более изменения даты документов.
21 Mikeware
 
12.07.12
13:47
(20) объект Перехватчик.
Этим прсечешь программные...
если сиквел - триггер на журнал, будешь знать, на какую глубину в задницу залазили...
22 Скользящий
 
12.07.12
14:24
в рабочей базе на прошлой работе стояло такое решение. Если мне напомнишь вечером в аську, кину мдшник.
23 pofigos
 
12.07.12
14:27
(22) Спасибо, но на основании (17) и с подсказкой (21) к вечеру будет работать. Этого будет более, чем достаточно