Имя: Пароль:
1C
1C 7.7
v7: История изменения реквизита ТЧ документа
,
0 Amig0_0
 
18.12.18
09:19
Доброго времени суток товарищи!
Вопрос долго гуглил, есть пара решений но не к одному полностью душа не лежит. Хочется услышать мнение профессионалов)
v7.7 дбф.
Стоит задача хранить историю изменения Реквизита из табличной части документа. Т.е. в ТЧ документа есть реквизит статус. Его меняют разные менеджеры по ходу действия. Нужно хранить для каждой строки историю Статуса, а так же, Автора,Дату и Время последнего изменения.

Сразу подумал сделать строку в ТЧ и в ней через разделитель хранить данные, но это как по мне не очень правильно по многим причинам.
2-й вариант справочник который будет хранить данные в разрезе документа. А-ля регистр сведений. Документов этого типа не много в месяц от 10 до 40 шт. Но строк в тч может быть много и хранить историю по каждой строке, статус в которой может меняться до 5+- раз это тоже не очень красиво.
3-й вариант 2 справочника=)) 1-й хранит только документ, 2-й подчиненный хранит историю конкретного документа. Самое на мой взгляд толковое решение, но не менее спорное.
Может кто чего еще посоветует или на мысль натолкнет?)
Заранее большое спасибо!

p.s. уважительная просьба, не писать "ухмыльные" советы типа - просто переходи на 8-ку или учи мат часть школьник. Уважая время остальных я не писал сюда этот вопрос как следуя не изучив. Надеюсь на понимание!)
1 JeHer
 
18.12.18
09:33
Если Статус меняется в одну сторону один раз, можно и в самом документе.
Если Статус меняется как попало, то лучше в справочник, 3-й вариант, ИМХО.
2 Масянька
 
18.12.18
09:34
(0) На первый взгляд (без погружения): третий вариант. ИМХО.
3 abibas
 
18.12.18
09:42
А "строк в тч может быть много" - это сколько? Хотя, можно посчитать по максимуму: 9999 строк * 40 документов * 5 изменений статуса * 12 месяцев = 29397060 записей в год. Т.е., для варианта 2 имеем справочник с 30 млн записей в год, для варианта 3 - один справочник на те же самые 30 млн + другой справочник на 40*12=480 записей. При наличии sql и 1cpp я бы выбрал вариант 2. Без 1cpp - вариант 3. С файловой базой - повесился бы.
4 Amig0_0
 
18.12.18
09:43
(1) (2) Спасибо за мнение
5 Amig0_0
 
18.12.18
09:46
(3) не строк гораздо меньше)))
До 10-ти ну 15 максимум, а в основном 5+-. Да и изменения статуса максимум 5-6 раз. Можно конечно и в строке в документе хранить, но вдруг заказчик захочет еще параметр для хранения, ну или отчет по статусам, поэтому задумался о справочнике.
6 abibas
 
18.12.18
10:06
Однозначно, для себя я бы выбрал вар. 2. Тогда в справочнике хранятся нужные поля + ссылка на документ (char(9)). В вар. 3 в справочнике хранятся нужные поля + ссылка на владельца (char(9)) + в другом справочнике хранится ссылка на документ (опять же, char(9)).
7 Bigbro
 
18.12.18
10:10
пиши в журнал регистрации что было что стало.
все эти справочники для хранения историй от лукавого.
8 Amig0_0
 
18.12.18
10:18
(6) Ну да, Возможно вы правы... Я сразу и думал, что 2-й вариант самый НЕ не правильный))
(7) Ооох, никогда с журналом регистраций не работал. Читал недавно о таком подходе, но не знаю на сколько удобно будет считывать данные с него и группировать при надобности.
9 big
 
18.12.18
10:21
Сделали общий реквизит документа Строка неограниченной длинны, всё пишем в неё. Причем пишутся все измененные реквизиты - и шапка, и ТЧ. Работает вполне нормально. Историю изменений смотрим в этом же документе.
10 Базис
 
naïve
18.12.18
10:24
(8) Пожалуй, самый неправильный способ - в ЖР. Это текстовый файл, поиск только перебором, на больших размерах падает.

А для изучения - посмотри, как версионирование в 8 устроено.
11 Amig0_0
 
18.12.18
10:24
(9) хм. Звучит жутко. Но не без доли правды.
Просто тут получается нужно хранить ВСЮ ТЧ + историю по ней и не дай бог кто изменит порядок строк)) или что-то в этом духе...
12 Kigo_Kigo
 
18.12.18
10:25
(9) Ога и опухнет 1SConst
13 Amig0_0
 
18.12.18
10:28
(10) Смотрел. В 8+ такие же подходы. +-. Используют регистр сведений или чаще всего справочник с Табличной частью. Используют в общем привилегии непосредственно 8+.
Ну не считая того факта конечно, с начиная с какой-то версии историю (не знаю какой - останусь голословным) документы пишут историю изменения реквизитов сами при установке 1-го лишь параметра...
14 Amig0_0
 
18.12.18
10:31
Ну в общем полагаю 2-й вариант - оптимальное решение?))
15 MWWRuza
 
гуру
18.12.18
10:33
(12)+++ Ага...
И этот вариант, и журнал регистрации тем более - это доступ к одному файлу, и соответственно его "распухание" и возможные блокировки. Особенно с текстовиком ЖР.
Я бы всетаки склонился к варианту 3. Ну, или 2.

PS Автор, это Вы случаем не статус изменения состояния новых акцизных марок отслеживаете? У меня аналогичная задача, только в моем случае "Статус" это реквизит справочника. Делать его периодическим не хочу, по причине (12), хотя это было бы проще всего... Но, представляю как распухнет 1SConst через месяц работы, и желание пропадает... Тоже наверное заведу подчиненный справочник "Истории изменений статуса"...
16 MWWRuza
 
гуру
18.12.18
10:37
+(15)Вообще, периодические реквизиты в 7.7, это тяжелое наследие от 7.5. Там сделали историю для констант, все было прекрасно, а когда 7.7 сотворили, то не подумавши о последствиях начали историю в тот-же файл писать... И получили то, что есть. :-(
17 MWWRuza
 
гуру
18.12.18
10:41
(16)то не подумавши о последствиях начали историю в тот-же файл писать
Читать:
то не подумавши о последствиях начали историю ПЕРИОДИЧЕСКИХ РЕКВИЗИТОВ СПРАВОЧНИКОВ в тот-же файл писать
18 uno-group
 
18.12.18
10:44
Как ссылку на конкретную строку документа к справочнику привяжем. Что будет если кто то удалит 1 строку, отсортирует сроки по какому либо реквизиту?
19 Amig0_0
 
18.12.18
10:49
(15) Нет, это отслеживание изменения заказа. Торговля в общем.
Да периодический реквизит - выход с одной стороны, но у меня статус может меняться на дню несколько раз. Может вообще весь цикл изменений за день пройти) И на руках должны быть ВСЕ, а не только последний, да и работа с пер.рекв. тот еще гемор)
20 ikea
 
18.12.18
10:51
(0). Я делал 2-й вариант, причем у меня хранился не конкретный реквизит, а все реквизиты всех документов, причем была фиксация и  удаленных строк, добавленных.
Данные на момент ухода (работал полтора года) в справочнике было 3 695 995 записей. В базе DBF работал около 100 пользователей по RDP. Проблем не было.
21 Amig0_0
 
18.12.18
10:52
(18) Ну по строке уникальности, состоящей из нескольких реквизитов строки, никак иначе)) У меня благо, таким образом, каждая уникальна.
Вопрос ваш полезен и хорош. Я об этом думал.
22 Amig0_0
 
18.12.18
10:53
(20) =)) мощно. Спасибо, успокоили!
23 uno-group
 
18.12.18
10:54
ИМХО Ввести в документ 5-10 полей. Типа
Заказ внесен Федя. 15-12-2019.
Заказ передан в работу Вася 16-12-2019.
Заказ собран Коля 17-12-2019.
Заказ отгружен ...
и т.п. а не хранить это в 1 реквизите
24 ikea
 
18.12.18
10:54
(20) Забыл добавить на больших документах(более 3000 строк) могло долго записывать при большом количестве изменений.
Все отрабатывало в процедуре ПриЗаписи.
25 Базис
 
naïve
18.12.18
10:56
(19) Статус заказа - отдельная сущность, выноси в регистр сведений (ближайший семёрошный объект, наверное, документ + регистр).
26 Amig0_0
 
18.12.18
10:56
(24) У меня в планах отрабатывать ПослеЗакрытия() ибо в момент создания нового документа при записи на руках нету Ссылки на ТолькоЧтоСозданный документ...
27 25-11
 
18.12.18
10:57
Самое крутое - внешняя SQL-база. Когда-то были и такие решения.
28 Amig0_0
 
18.12.18
10:57
(25) Не понимаю связки документ+регистр для хранения истории. Типа подчиненный документ с регистром остатков?))
29 Amig0_0
 
18.12.18
10:58
(23) Не понимаю "5 - 10 полей". Типа создать еще 5-10 реквизитов в ТЧ для хранения истории?
30 uno-group
 
18.12.18
11:02
(21) не обязательно можно при вводе строки создавать сразу уникальны ид в доп. реквизите строки и элемент справочника. с таким идом.
(29) Да. Можно быстро строить черные запросы и поиск.
31 Amig0_0
 
18.12.18
11:05
(30) Блин, а может и в правду (23) это выход....
Ведь это всего лишь условных 10 реквизитов в ТЧ и вообще 0 проблем.
А я уже почти доделал 2-й вариант)) Нужно подумать.
32 ikea
 
18.12.18
11:07
(26) Зачем? Если стоит задача хранить историю ИЗМЕНЕНИЙ. Пишите данные если реквизит менялся
33 Amig0_0
 
18.12.18
11:15
(32) Ну да в принципе, но это уже не суть важно)
34 ikea
 
18.12.18
11:15
(0) Есть один подводный камень во 2-ом варианте: параллельность работы пользователей, т.е. чтобы не возникало ситуаций одновременной записи нескольких пользователей в один справочник.
35 Amig0_0
 
18.12.18
11:19
(34) Ну это я так понимаю может случится если БУКВАЛЬНО в одно время будут проводиться одновременно несколько подобных документов. Так?
36 ikea
 
18.12.18
11:30
(35) Нет), в ПриЗаписи() ничего не блокируется, это в момент проведения блокируется таблица 1SJOURN.
37 serpentt
 
18.12.18
11:33
(0) В свое время пользовали (где взял не помню)...

// глРегистрацияИзменений(Конт)
//
Процедура глРегистрацияИзменений(Конт, Проц="") Экспорт
    Перем ТЗ, ТЧ, ТзПред, Предст;
    
    Если (Константа.я_ИспользоватьТотальныйКонтроль = Да)  Тогда  //serpent 06-09-07 И (Конт.ДатаДок < ТекущаяДата())
        Попытка
            Конт = Конт.ТекущийДокумент();
        Исключение
            глЛегкоеСообщение("1. Изменения в истории не сохранены..."+РазделительСтрок+" Контекст не получен.",3355647);
            Возврат;
        КонецПопытки;
        
        Если ПустоеЗначение(Конт) = 1 Тогда
            глЛегкоеСообщение("2. Изменения в истории не сохранены..."+РазделительСтрок+" Контекст пустой.",3355647);
            Возврат;
        КонецЕсли;
        ВидДок = Конт.Вид();
        
        ИдДок = ЗначениеВСтрокуВнутр(Конт);
        ИдДок = Число(Сред(ИдДок, Найти(ИдДок, " ")));
        
        // Организация Файлового хранилища
        //{
        ИмяКаталога1 = Шаблон("[КаталогИБ()]Log\");
        ИмяКаталога2 = Шаблон("[КаталогИБ()]Log\[ВидДок]\");
        ИмяКаталога3 = Шаблон("[КаталогИБ()]Log\[ВидДок]\[ИдДок]\");
        
        Если ФС.СуществуетФайл(ИмяКаталога1) = 0 Тогда
            ФС.СоздатьКаталог(ИмяКаталога1);
        КонецЕсли;
        Если ФС.СуществуетФайл(ИмяКаталога2) = 0 Тогда
            ФС.СоздатьКаталог(ИмяКаталога2);
        КонецЕсли;
        Если ФС.СуществуетФайл(ИмяКаталога3) = 0 Тогда
            ФС.СоздатьКаталог(ИмяКаталога3);
            //Перепроверим
            Если ФС.СуществуетФайл(ИмяКаталога3) = 0 Тогда
                глЛегкоеСообщение("3. Изменения в истории не сохранены..."+РазделительСтрок+" Не создан "+ИмяКаталога3,3355647);
                Возврат;
            КонецЕсли;
        КонецЕсли;
        //}
        
        //Т = СоздатьОбъект("Текст");
        Мтд = Метаданные.Документ(ВидДок);
        СзШ = СоздатьОбъект("СписокЗначений");
        ТЗ  = СоздатьОбъект("ТаблицаЗначений");
        ТЗ.Выгрузить(ТзПред);
        ТЗ.НоваяКолонка("Автор");
        ТЗ.НоваяКолонка("Дата");
        ТЗ.НоваяКолонка("Время");
        ТЗ.НоваяКолонка("Шапка");
        ТЗ.НоваяКолонка("ТЧ");
        
        Нули = "00000";
        ИмяФайла = ФС.НайтиПервыйФайл(ИмяКаталога3+"*.TXT");
        ПослФайл = ИмяФайла;
        Пока ИмяФайла <> "" Цикл
            ПослФайл = ИмяФайла;
            ИмяФайла = ФС.НайтиСледующийФайл();
        КонецЦикла;
        
        Если (ПустоеЗначение(ПослФайл) = 0) и (Проц = "ПриОткрытии") Тогда
            Сообщить("Изменения не сохраняем","!");
            Возврат;
        КонецЕсли;
        
        Если ПослФайл = "" Тогда
            ИмяФайла = Нули;
        Иначе
            //Устанавливаем следующий порядковый номер файлу
            ИмяФайла = Прав(Нули + (Число(ПослФайл)+1), 5);
        КонецЕсли;
        
        СзШ.Установить("ДатаДок", Конт.ДатаДок);
        СзШ.Установить("НомерДок", Конт.НомерДок);
        
        // Заполняем Общие реквизиты документов
        //{
        Для Ном = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
            ИдРек = Метаданные.ОбщийРеквизитДокумента(Ном).Идентификатор;
            //[-]serpent, 16.02.2017
            //Если ИдРек = "Изменил" Тогда
            //    Продолжить;
            //КонецЕсли;
            //Если ИдРек = "НомерДляОтбора" Тогда
            //    Продолжить;
            //КонецЕсли;
            //[-]_
            ЗнРек = Конт.ПолучитьАтрибут(ИдРек);
            СзШ.Установить(ИдРек, ЗнРек);
        КонецЦикла;
        //}
        
        // Заполняем реквизиты шапки документа
        //{
        Для Ном = 1 По Мтд.РеквизитШапки() Цикл
            ИдРек = Мтд.РеквизитШапки(Ном).Идентификатор;
            ЗнРек = Конт.ПолучитьАтрибут(ИдРек);
            СзШ.Установить(ИдРек, ЗнРек);
        КонецЦикла;
        //}
        
        // Формируем строку с реквизитами табличной части
        //{
        СтрокаТЧ = "";
        Для Ном = 1 По Мтд.РеквизитТабличнойЧасти() Цикл
            ИдРек = Мтд.РеквизитТабличнойЧасти(Ном).Идентификатор;
            Если СтрокаТЧ = "" Тогда
                СтрокаТЧ = ИдРек;
            Иначе
                СтрокаТЧ = СтрокаТЧ + ","+ИдРек;
            КонецЕсли;
        КонецЦикла;
        //}
        
        Конт.ВыгрузитьТабличнуюЧасть(ТЧ);
        
        ЕстьИзменения = 0;
        Если ПустоеЗначение(ПослФайл) = 0 Тогда
            //Ранее документ уже редактировался...
            ЗначениеИзФайла(ИмяКаталога3+ПослФайл, ТзПред);
            ПредСзШ = ТзПред.ПолучитьЗначение(1, "Шапка");
            ПредТЧ  = ТзПред.ПолучитьЗначение(1, "ТЧ");
            Если ТипЗначенияСтр(ПредТЧ) <> "ТаблицаЗначений" Тогда
                ТЧ.Выгрузить(ПредТЧ);
                ПредТЧ.УдалитьСтроки();
            КонецЕсли;
            
            //Первоначально проверяем основные реквизиты(ДатаДок, НомерДок) на изменение
            //{
            Если ПредСзШ.Получить("ДатаДок") <> СзШ.Получить("ДатаДок") Тогда
                ЕстьИзменения = 1;
            КонецЕсли;
            Если ПредСзШ.Получить("НомерДок") <> СзШ.Получить("НомерДок") Тогда
                ЕстьИзменения = 1;
            КонецЕсли;
            //}
            
            Если ЕстьИзменения = 0 Тогда
                //Дата или номер документа не менялись, проверяем реквизиты шапки
                Для Ном = 1 По СзШ.РазмерСписка() Цикл
                    ТекЗн = СзШ.ПолучитьЗначение(Ном, Предст);
                    Если ПредСзШ.Получить(Предст) <> ТекЗн Тогда
                        ЕстьИзменения = 1;
                        
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
            
            //Проверяем табличную часть на измения реквизитов или состав
            Если (ТЧ.КоличествоСтрок() <= 1000) и (ПредТЧ.КоличествоСтрок() <= 1000) Тогда
                ПредТЧ.НоваяКолонка("_СравнениеТЗ");
                //{[-]serpent, 16.02.2017
                //ПредТЧ.ВыбратьСтроки();
                //Пока ПредТЧ.ПолучитьСтроку() = 1 Цикл
                //    Состояние(ПредТЧ.НомерСтроки);
                //    ПредТЧ._СравнениеТЗ = -1;
                //КонецЦикла;
                //}[-]_
                ПредТЧ.Заполнить(-1,,,"_СравнениеТЗ");
                
                ТЧ.НоваяКолонка("_СравнениеТЗ");
                //{[-]serpent, 16.02.2017
                //ТЧ.ВыбратьСтроки();
                //Пока ТЧ.ПолучитьСтроку() = 1 Цикл
                //    Состояние(ТЧ.НомерСтроки);
                //    ТЧ._СравнениеТЗ = 1;
                //КонецЦикла;
                //}[-]_
                ТЧ.Заполнить(1,,,"_СравнениеТЗ");
                
                КолСтр1 = ПредТЧ.КоличествоСтрок();
                КолСтр2 = ТЧ.КоличествоСтрок();
                
                Если КолСтр2 <> 0 Тогда
                    ПредТЧ.КоличествоСтрок(КолСтр1+КолСтр2);
                КонецЕсли;
                Если КолСтр2 <> 0 Тогда
                    Если КолСтр1 = 0 Тогда
                        ТЧ.Выгрузить(ПредТЧ);
                    Иначе
                        ПредТЧ.Заполнить(ТЧ, КолСтр1+1);
                    КонецЕсли;
                КонецЕсли;
                ПредТЧ.Свернуть(СтрокаТЧ, "_СравнениеТЗ");
                ПредТЧ.Сортировать("_СравнениеТЗ");
                Если ПредТЧ.КоличествоСтрок() > 0 Тогда
                    Если (ПредТЧ.ПолучитьЗначение(1,"_СравнениеТЗ") <> 0) или (ПредТЧ.ПолучитьЗначение(ПредТЧ.КоличествоСтрок(),"_СравнениеТЗ") <> 0)  Тогда
                        ЕстьИзменения = 1;
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        Иначе
            ЕстьИзменения = 1;
        КонецЕсли;
        
        Если ЕстьИзменения = 1 Тогда
            ТЗ.НоваяСтрока();
            Если ПустоеЗначение(ПослФайл) = 1 Тогда
                ТЗ.Автор = "1ый_Исходник";
            Иначе
                ТЗ.Автор = ?(ПустоеЗначение(ПолноеИмяПользователя())=0,ПолноеИмяПользователя(),ИмяПользователя());
            КонецЕсли;
            ТЗ.Дата     = ТекущаяДата();
            ТЗ.Время = ТекущееВремя();
            ТЗ.Шапка = СзШ;
            Если ТЧ.КоличествоСтрок() <= 1000 Тогда
                Попытка
                    ТЧ.УдалитьКолонку("_СравнениеТЗ");
                Исключение
                КонецПопытки;
                ТЗ.ТЧ      = ТЧ;
            КонецЕсли;
            
            Если ЗначениеВФайл(ИмяКаталога3+ИмяФайла+".TXT", ТЗ) = 0 Тогда
                глЛегкоеСообщение("4. Изменения в истории не сохранены..."+РазделительСтрок+" Файл Не создан "+ИмяКаталога3+ИмяФайла+".TXT",3355647);
            КонецЕсли;
        КонецЕсли;
        
        ТЗ = 0;
        ФС.НайтиПервыйФайл(КаталогИБ());
    Иначе
        Сообщить("История не записана 999 !","!");
    КонецЕсли;
    
КонецПроцедуры // глРегистрацияИзменений()
38 serpentt
 
18.12.18
11:35
Соответственно вызов из документа

глРегистрацияИзменений(Контекст, "ПриОткрытии");

и

глРегистрацияИзменений(Контекст, "ПриЗакрытии");


НЕ работает данный метод только при программном создании Документа.
39 Amig0_0
 
18.12.18
11:37
(37) прикольно блин)) Спасибо большое! Посмотрим.
константа "использовать тотатьный контроль" улыбнула))
40 serpentt
 
18.12.18
11:38
Плюс ОбработкаПросмотра, сечас Выложу
41 uno-group
 
18.12.18
11:40
(31) Тут вопрос как и что работает и какие статусы друг от друга как меняются. параллельность процессов.
типа изменился заказ. статусы должны сброситься или сохраниться.
42 serpentt
 
18.12.18
11:42
https://transfiles.ru/1mf37

Данный метод (37) делает полный Снимок документа и не надо отслеживать добавление новых реквизитов
43 Amig0_0
 
18.12.18
11:47
(42) Обработка как-то не понятно ругается. В неё при вводе нового нужно что-то передавать? Не знаете?
44 Amig0_0
 
18.12.18
11:49
(43) аааа)) По ходу туплю сорри. Этож посмотреть данные по доку => из дока и вызывать!
45 Bigbro
 
18.12.18
11:50
(8) такой подход разделяет сущности.
есть данные - база.
есть регистрация изменений - это ЖР.
естественно если информация об изменениях должна быть доступна многим пользователям и удобно оформлена то ЖР не лучший вариант. но чаще всего наоборот - ЖР скрывают от всех.
так что ЗаписьЖурналаРегистрации() решает все проблемы.
фильтрация по объектам, пользователям, тексту периодам - встроенная средствами ЖР.
чтобы он вырос до гигабайта, когда начинает существенно подтормаживать нужно очень серьезно работать с базой. и совсем не фильтровать события которые писать в журнал.
46 serpentt
 
18.12.18
11:54
(44)
ОткрытьФорму("Отчет",глВзятьКонтекст(ТекущийДокумент),КаталогИБ()+"ExtForms\Forms\SERVIS\ПросмотрИзменений.ert");
47 ADirks
 
18.12.18
14:35
(0) Я бы четвёртый вариант предложил: хранить всё в самодельных табличках, может быть даже в другой базе (чтобы бэкапы не раздувать почём зря)
например ка-то так:

Функция СоздатьТаблицы() Экспорт
    оБаза = СоздатьОбъект("Общие.БД");
    

    //=============================================================
    //  Шапка
    ТекстЗапроса_Таблица = "Set NoCount ON
    |CREATE TABLE РегистраторИзмененийДокумента (
    |    ID bigint Identity(1,1) Not Null Primary Key Clustered,
    |    IDDoc char(9) Not Null,
    |    Колонки varchar(8000) Not Null,
    |    Пользователь char(9) Not Null,
    |    Время DateTime Not Null,
    |    Причина varchar(1024)
    |)
    |";
    
    тзп_Индекс = "CREATE INDEX IDDoc ON РегистраторИзмененийДокумента(IDDoc)";
    Если оБаза.СоздатьТаблицу("РегистраторИзмененийДокумента", ТекстЗапроса_Таблица, тзп_Индекс) <> 1 Тогда
        Возврат 0;
    КонецЕсли;

    //=============================================================
    //  Строки
    ТекстЗапроса_Таблица = "Set NoCount ON
    |CREATE TABLE РегистраторИзмененийДокумента_Строки (
    |    ID bigint Not Null,
    |    НомерСтроки int Not Null,
    |    Комментарий varchar(1024)
    |)
    |";
    
    тзп_Индекс = "CREATE INDEX IDDoc ON РегистраторИзмененийДокумента_Строки(ID)";
    Если оБаза.СоздатьТаблицу("РегистраторИзмененийДокумента_Строки", ТекстЗапроса_Таблица, тзп_Индекс) <> 1 Тогда
        Возврат 0;
    КонецЕсли;

    
    //=============================================================
    //  Значения
    ТекстЗапроса_Таблица = "Set NoCount ON
    |CREATE TABLE РегистраторИзмененийДокумента_Значения (
    |    ID bigint Not Null,
    |    НомерСтроки int Not Null,
    |    Имя varchar(256) Not Null,
    |    Тип int Not Null,
    |
    |    Пр_до char(13),
    |    Пр_после char(13),
    |    Спр_до char(13),
    |    Спр_после char(13),
    |    Док_до char(13),
    |    Док_после char(13),
    |
    |    Дата_до DateTime,
    |    Дата_после DateTime,
    |    Строка_до varchar(512),
    |    Строка_после varchar(512),
    |    Число_до float,
    |    Число_после float
    |)
    |";
    
    тзп_Индекс = "CREATE INDEX IDDoc ON РегистраторИзмененийДокумента_Значения(ID, НомерСтроки)";
    Если оБаза.СоздатьТаблицу("РегистраторИзмененийДокумента_Значения", ТекстЗапроса_Таблица, тзп_Индекс) <> 1 Тогда
        Сообщить(ТекстЗапроса_Таблица);
        Возврат 0;
    КонецЕсли;
    
    Возврат 1;
КонецФункции
48 tgu82
 
18.12.18
14:48
(0) Я использую журнал регистрации правда толдько для проведенных документов. Но в-общем хватает чтобы нерадивых вычислять и по шее давать
49 Amig0_0
 
18.12.18
15:03
(47) Я немного туплю по ходу, это у вас пример работы с СКЮЛь?
50 Злопчинский
 
18.12.18
17:48
У меня по (37) сделано. Для всех реквизитов документов. Табличная часть отдельно - не отслеживается - если что-то поменялось - то это видно (изменились реквизиты в соотнесении по строкам).
В моем случае пользы от этой подсистемы - практически ноль, потому как исключены практически ситуации. когда это нужно.

У автора: - удалили строку - как вы отследите? поменяли порядок строк - как отследите?

и главный вопрос: который так и не был задан ДЛЯ ЧЕГО необходимо отслеживать ИСТОРИЮ ИЗМЕНЕНИЙ СТАТУСОВ?

если пользователю разрешено менять - то понятно, что изменено легитимно. Зачем отслеживать то, что разрешено? если изменено криво - это все равно легитимно, так как осознанное действие пользователя - то что он при этом не думал - не надо решать техническими методами, это заведет в тупик (хорошая статья на ИС "АД своими руками").

Возможно история изменений статусов нужна для статистики типа сколько находился в каком статусе - это еще можно понять. Но по предыдущему описанному выше варианту - поверьте, не надо это...
51 ikea
 
18.12.18
18:59
(0) Могу продать за "относительно недорого"(400 BYN) свою систему отслеживания изменений, основанную на 2-м варианте.
52 Amig0_0
 
18.12.18
19:07
(50) Да, вы правы. Нужна отчетность в дальнейшем, о том сколько тот или иной статус был в строке. Как быстро справляется менеджер. Сколько в разрезе определенного периода было именно определенных статусов. В том числе промежуточных и т.п.

"Но по предыдущему описанному выше варианту - поверьте, не надо это..."

По какому именно предыдущему?) Или по всем?

" (хорошая статья на ИС "АД своими руками"). "

Интересно почитать не подскажете где?
53 Amig0_0
 
18.12.18
19:07
(51) Спасибо я уже практически реализовал все что нужно!
54 Amig0_0
 
18.12.18
19:07
И да, всем Огромное спасибо за участие!
55 trdm
 
18.12.18
19:48
(19) > Нет, это отслеживание изменения заказа. Торговля в общем.

Статус интернет заказа у меня 2-мя справочниками сделан.
СтатусыЗаказовЛог и СтатусыЗаказовФинал.
история соотв в СтатусыЗаказовЛог.
56 trdm
 
18.12.18
19:59
(50) у меня документы после записи в xml-файлы выгружаются.
А некоторые виды и с интервалом в  50 секунд.
Даже если рухнет БД (тук-тук-тук) то, вчерашний/позавчерашний бекап+ xml-архивы и БД будет восстановлена с максимальным приближением.
А уж если 1С-ка вылетит у кого, то счета и расходные накладные из xml вытаскиваются запросто.
57 Злопчинский
 
18.12.18
21:44
(52) ну и регистрируй в регистре сведений записями о смене состояний, потом собирать любыми отчетами
58 Злопчинский
 
18.12.18
21:44
59 Злопчинский
 
18.12.18
21:52
(52) " Нужна отчетность в дальнейшем, о том сколько тот или иной статус был в строке. Как быстро справляется менеджер. Сколько в разрезе определенного периода было именно определенных статусов. В том числе промежуточных "

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

- как быстро справляется менеджер? - и че? у менеджера от этого зарплата зависит? хорошо работающий менеджер - не сможет сделать быстрее чем оно уже есть.

- сколько в период было опредеделенных статусов? - для чего? понять что с утра все стоят, а после обеда вся жпс в мыле?

так и неясно какую задачу пробуется решить. "регистрировать изменения статусов" - это задача для прогера. тупого прогера. но никак не для автоматизации процессов в конторе.

могу, конечно, быть не прав
60 Amig0_0
 
19.12.18
09:24
(57) 7.7 вы ничего не путаете?))
61 Amig0_0
 
19.12.18
09:46
(59) =))) да, увы вы не правы. Заказчик хочет видеть историю. Доводов для чего у него много. Некоторые могут быть весьма спорные, тем не менее я трачу время, на реализацию, а не на оспаривание надобности функционала.

Автоматизация процессов, как я полагаю, зачастую связана с расширением функционала. Статистика - это функционал. Система мотивации у менеджеров - тоже функционал.

В некоторых случаях, ваш подход "оспорить и переубедить" безусловно полезен,а за частую необходим, но тут есть надобность - нужна реализация. Вопрос 1 - как именно?)
62 Amig0_0
 
19.12.18
09:54
(58) Спасибо! Интересно)
63 Злопчинский
 
19.12.18
12:17
было бы мнтересно через полгодика узнать - во что это в итоге вылилось и как используется. но обычно - авторы исчезают...
64 Bigbro
 
19.12.18
12:55
(52) так это пардон не "история изменений" как написано в (0), а полноценный процесс учета изменения реквизитов, который уже действительно должен вестись не в ЖР, а в ИБ, со своими объектами учета, отчетами и т.д.
сделать документ "РегистрацияИзменений" и регистр/регистры под него, в зависимости какие отчеты нужны выбрать структуру регистров.
65 Bigbro
 
19.12.18
12:56
возможно вестись в отдельной ИБ. даже скорее всего так и стоит сделать. чтобы можно было подключить затем регистрацию объектов других баз.
66 Mikeware
 
19.12.18
13:17
(59) Ну, польза великая. Помнишь, я тебе показывал отчет "статусы заявок в течение суток"?
(0) проблему с зранением изменеий решил? а то могу скинуть свой велосипед.
Могу скинуть и отслеживание статуса заявки - только он заточен на статус документа, а не его строки.
67 Mikeware
 
19.12.18
13:35
Исполнение по заявкам (динамика исполнения для анализа работы склада и операторов)
http://s017.radikal.ru/i427/1510/2c/d61229d137d8.jpg
История обработки заявки.
http://s017.radikal.ru/i442/1510/41/b0f5a23cf68d.jpg
68 Злопчинский
 
19.12.18
13:50
(67) ну и фигли? чего-там анализировать по работе склада и операторов? - они должны делать то, что им валится. И главная задача - обеспечить баланс заданий и имеющихся ресурсов. А в этом от таких "динамик" - порльза только на начальном этапе - чтобы придти и матом всех покрыть в продажах - вы че, охренели? нихрена складс утра не делает, после обеда - толпа заявок, которые к вечеру надо собрать, чтобы с утра развести. Нагрузка получается 300 строк в час. Норма - ну максимум 150 в час. кто оставшуюся половину делать будет?!
;-)
69 Mikeware
 
19.12.18
13:53
(68) в какое время затык, например. почему до какого-то времени заявки не собираются вообще. Нафига так много заявок в сборке сразу. я уж не помню конкретных вопросов - уж лет 5 прошло.
70 Злопчинский
 
19.12.18
13:57
(69) "почему до какого-то времени заявки не собираются вообще."
- тут как раз надо не постфактум мониторить, а в оперативном режиме. если заявка стоит в статусе "готова к сборке" и есть сотрудники без заданий - то тнадо светить красный фонарь.

но это дело достаточно трудное - слишком много чего надо учитывать...
71 Mikeware
 
19.12.18
14:13
(70) это был следующий шаг
монитор типа такого
Состояние заявок (рабочее место старшего сменного кладовщика)
в разрезе отделов
http://s019.radikal.ru/i628/1510/b3/5f3034a89c73.jpg
в разрезе регионов
http://s018.radikal.ru/i507/1510/34/bc501998c181.jpg
только в разрезе комплектовщиков смены.
ну а по основанию "динамики" там реально было принято несколько управленческих решений, которые и позволили в том числе разрабатывать  оперативные инструменты.
72 Злопчинский
 
19.12.18
14:48
(71) очень много букав.
у меня когда основной поток был - основная управленческая диаграмма для АУПа указывала количество строк по доставке и самовывозу с разбивкой по дням по складским операциям. Но у меня и процессы попроще.
73 Mikeware
 
19.12.18
14:59
(72) многа.но  вот хотели. Пользовались в основном второй - по регионам, и третьей (которой нет на картинке)- по комплектовщикам.
74 Amig0_0
 
20.12.18
08:46
(66) Ну решил, да, через справочник. Думаю решение +- правильное, но по итогу тут столько смуты навели)
(69) Да и это тоже. На самом деле польза есть, как и задача)) Повторюсь.
(63) А что именно может случится через "пол годика" со справочником в котором к тому моменту будет 500+- элементов?0_0
(65) Вы имеете ввиду ОЛЕ? Никогда не пользовался, кстати. Может стоит попробовать, но не особо понимаю как это в данном контексте будет выглядеть/работать.
75 Amig0_0
 
20.12.18
08:48
(66) Если можете, скиньте! А, все же, по какому принципу реализовали хранение данных для истории? И как долго работает система/накапливается та самая история?
76 Mikeware
 
20.12.18
10:00
(75) Данные об измениях - в справочниках.
http://prntscr.com/lxb7c1
Идейка (может, и начальная реализация) утянута у кого-то году в 2003-м.
да, в общем, справочники пухнут, и изрядно. для SQL это пофигу.
"как долго работает" - не понял вопрос. если время записи - то оно не в транзакции, поэтому не особо влияет. если по времени эксплуатации - то "внедрено"в 2005, по 2017 работало...  

по регистрации статусов - посмотрел, ничего военного. вообще.
Процедура ИзменитьСтатусДокумента(Докум,НовыйСтатус) Экспорт
СтатусДокумента=Докум.СтатусДокумента;
Рекордсет=СоздатьОбъект("ODBCRecordset");
ТекстЗапроса="
|Update _1sjourn set $ОбщийРеквизит.СтатусДокумента=:НовыйСтатус
|  where
| _1sjourn.iddoc=:ИдДок ";    
Рекордсет.УстановитьТекстовыйПараметр("НовыйСтатус",НовыйСтатус);
Рекордсет.УстановитьТекстовыйПараметр("ИдДок",Докум);
Рекордсет.ВыполнитьСкалярный(ТекстЗапроса);
СпрДвиженияДокументов.Новый();
СпрДвиженияДокументов.Регистратор = Докум.ТекущийДокумент();
СпрДвиженияДокументов.СтарыйСтатус = СтатусДокумента;
СпрДвиженияДокументов.НовыйСтатус = НовыйСтатус;
ЧЧ=0;
ММ=0;
СС=0;
ТекущееВремя(ЧЧ,ММ,СС);
СпрДвиженияДокументов.ПозицияСменыСостояния = (ТекущаяДата()-Дата(2008,1,1))*86400+ЧЧ*3600+ММ*60+СС;
СпрДвиженияДокументов.Пользователь = глПользователь.ТекущийЭлемент();
СпрДвиженияДокументов.Записать();
КонецПроцедуры            

Причина того, что статус регистрится не со строкой "дата-время", а с моментом (число секунд) - проще вычислять время между событиями. отработало в связке с "бизнес-процессами" (т.е. правилами доступности/изменения статусов в отличие от документа, текущего статуса, динамических ролей пользователя и т.п.) с 2008 по 2017 год.
77 Mikeware
 
20.12.18
10:03
(74).3 "случается" не со справочником. "случается" обычно с автором. авторы исчезают...  
.4 кроме тети Оли есть много более других способов...
Независимо от того, куда вы едете — это в гору и против ветра!