Имя: Пароль:
1C
1С v8
1С 8 3 УТП сохранение истории изменения в табличной части
,
0 Nysha1210
 
07.12.18
16:29
Добрый день.
Есть задача - сохранять историю изменений табличной части документа Заказ покупателя.
Как было реализовано - создан регистр накопления, в который записывается содержимое табличной части документа при проведении.

    //выгрузка табличной части
    Запрос1 = Новый Запрос;
    Запрос1.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);
    Запрос1.Текст = "ВЫБРАТЬ
                   |    ЗаказПокупателяТовары.НомерСтроки,
                   |    ЗаказПокупателяТовары.Количество,
                   |    ЗаказПокупателяТовары.Номенклатура КАК Товар,
                   |    ЗаказПокупателяТовары.Цена,
                   |    ЗаказПокупателяТовары.Сумма,
                   |    ЗаказПокупателяТовары.СерНомер
                   |ИЗ
                   |    Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
                   |ГДЕ
                   |    ЗаказПокупателяТовары.Ссылка = &ТекущийДокумент";

    ЗапросТовары = Запрос1.Выполнить().Выгрузить();
    
    //запись данных в регистр
    ДатаТек=ТекущаяДата();
    Записи = РегистрыНакопления.ЗаказПокТЧ.СоздатьНаборЗаписей();
    Записи.Отбор.Регистратор.Установить(Ссылка);
    //Записи.Прочитать();
    Для каждого ВыборкаСтрокТовары из ЗапросТовары Цикл
         Запись = Записи.Добавить();
           Запись.ВидДвижения=ВидДвиженияНакопления.Приход;
         Запись.Период = ДатаТек;
         Запись.Наименование=ВыборкаСтрокТовары.Товар;
         Запись.Количество=ВыборкаСтрокТовары.Количество;
         Запись.Цена=ВыборкаСтрокТовары.Цена;
         Запись.Сумма=ВыборкаСтрокТовары.Сумма;
         Запись.СерНомер=ВыборкаСтрокТовары.СерНомер;
         Запись.Автор = Ответственный;            
    КонецЦикла;
    //Записи.Записать(Ложь);
    
    //услуги
    Запрос2 = Новый Запрос;
    Запрос2.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);
    Запрос2.Текст = "
    |ВЫБРАТЬ
    |    ЗаказПокупателяУслуги.НомерСтроки,
    |    ЗаказПокупателяУслуги.Количество,
    |    ЗаказПокупателяУслуги.Цена,
    |    ЗаказПокупателяУслуги.Сумма,
    |    ЗаказПокупателяУслуги.Номенклатура как Товар
    |ИЗ
    |    Документ.ЗаказПокупателя.Услуги КАК ЗаказПокупателяУслуги
    |ГДЕ
    |    ЗаказПокупателяУслуги.Ссылка = &ТекущийДокумент
    |";

    ЗапросУслуги = Запрос2.Выполнить().Выгрузить();
    //Записи = РегистрыНакопления.ЗаказПокТЧ.СоздатьНаборЗаписей();
    //Записи.Отбор.Регистратор.Установить(Ссылка);
    //Записи.Прочитать();
    Для каждого ВыборкаСтрокУслуги из ЗапросУслуги Цикл
         Запись = Записи.Добавить();
           Запись.ВидДвижения=ВидДвиженияНакопления.Приход;
         Запись.Период = ДатаТек;
         Запись.Наименование=ВыборкаСтрокУслуги.Товар;
         Запись.Количество=ВыборкаСтрокУслуги.Количество;
         Запись.Цена=ВыборкаСтрокУслуги.Цена;
         Запись.Сумма=ВыборкаСтрокУслуги.Сумма;
         Запись.Автор = Ответственный;            
    КонецЦикла;    
    Записи.Записать(ложь);

ПРОБЛЕМА: Как добавить новые запси в регистр накопления, если, например, у товара изменили цену? Сейчас при таком коде при записи в регистр накопелния старые записи стираются и записываются новые строки с таблицы значений?
1 shuhard
 
07.12.18
16:46
(0)  при наличии в УПП версионирования большего бреда не придумать
2 runoff_runoff
 
07.12.18
16:47
надо было регистр расчета создавать ;-)
3 Nysha1210
 
07.12.18
16:55
Версинирование гл. буху не подходит - там есть возможность сравнить только 2 даты. А ей хочется видеть сразу все изменения в виде таблицы - кто что менял по дням и т.д. причём сразу просто и по любому документу.
4 Nysha1210
 
07.12.18
16:57
По описанию регистр накопления служит для добавления движений, а не для их замещения?
5 la luna llena
 
07.12.18
17:00
(4) почему регистр накопления?
6 la luna llena
 
07.12.18
17:01
(3) по регистру Версии Объектов нельзя свой отчет написать, который 3 даты сравнивает?
7 Nysha1210
 
07.12.18
17:03
У меня нет такого регистра ((
8 Nysha1210
 
07.12.18
17:06
Нашла, но она хочет видеть такие изменения по каждому документу Заказ покупателя .... делать каждый раз запрос?
9 runoff_runoff
 
07.12.18
17:07
(7) а как вы значение табличной части храните в регистре?..
10 Nysha1210
 
07.12.18
17:12
Наименование,СерНомер,Автор ... ну и Ресурсы - Цена, Количество, Сумма
11 Nysha1210
 
07.12.18
17:23
Первоначально данные записываются нормально, все реквизиты видны. Как добиться добавления новой информации в регистр накопления?
12 runoff_runoff
 
07.12.18
17:26
(11) попробуйте ВерсииОбъектов.. там уже всё есть..
вам только версию табличной части надо вытащить из хранилища значений..
13 unregistered
 
07.12.18
17:36
(3) > там есть возможность сравнить только 2 даты

Бред несусветный. Сравниваются любые версии объекта, хоть все (сколько бы их там не было).
14 Nysha1210
 
07.12.18
17:40
В стандартной обработке "История изменений объектов" можно сравнить только 2 версии (((
15 Nysha1210
 
07.12.18
17:41
История изменений объектов
Отчет по истории изменений позволяет:

сравнивать две версии объекта друг с другом
просматривать версию объекта

Отчет доступен пользователю с ролью "Полные права".

Описание в 1С.
16 unregistered
 
07.12.18
17:43
(0) Идея - *авно. Реализация - ещё хуже.
При каждом перепроведении документа будут дописываться новые записи в этот ваш чудо-регистр. А как часто при проведении документа меняется содержимое? - как правило довольно редко (а в большинстве случаев - никогда).
17 unregistered
 
07.12.18
17:46
(15) (14) Ну так возьмите этот отчет из более свежего релиза БСП, где сравниваются любые указанные версии.
18 Nysha1210
 
07.12.18
17:51
1) это рабочая версия, в перспективе будут добавленны условия и записываться будет только информация, которая изменится.

2) гл. бух не хочет никуда заходить, что то менять и что то выбирать - она хочет нажать 1 кнопку и видеть все изменения сразу, причём быстро и в виде таблицы.

За критику отдельное спасибо.
19 Byasha
 
07.12.18
20:01
Посмотрите типовую процедуру обработки проведения документа. В УПП регистры накопления, во время проведения, сначала очищаются, потом записываются новым набором записей. Процедура очистки - универсальная. Т.е. выбираются все регистры, у которых регистратором может быть проводимый документ, и у них удаляются все записи. Ваш регистр тоже попадает в эту выборку.
Вообще изначально неверная модель хранения данных. Вам не нужен регистр накопления. Вам нужен периодический регистр сведений с периодичностью до секунды. Без подчинения регистратору.
20 Nysha1210
 
07.12.18
20:12
Спасибо за разьяснения. Буду пробовать )))
21 Nysha1210
 
07.12.18
20:14
Регистр сведений пробовала, не получилось. Перезаписывал товар в одну строчку, как ни старалась переписать программу, но обойти не удалось. Попробовала через регистры накопления. За советы спасибо. Получится - отпишусь )))
22 Byasha
 
07.12.18
20:54
(21) Потому что неправильно спроектировали измерения и ресурсы регистра.
У Вас измерениями должны быть "ЗаказПокупателя, ИмяТЧДокумента, НомерСтрокиДокумента, Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры, ЕдиницаИзмерения, СтавкаНДС" и те реквизиты табличной части, для которых Вам важно отслеживать изменения.
23 Byasha
 
07.12.18
20:55
ресурсы - "Количество,Сумма,СуммаНДС"
24 Byasha
 
07.12.18
20:59
При записи регистра ставите отбор по заказу покупателя и периоду - ТекущаяДата(). Тогда у Вас будут добавлены записи. Потом отчетом можете выловить все изменения. А вообще тут ранее Вам уже правильный совет дали. Раскрутите отчет по сравнению версий и добавьте туда возможность сравнения нескольких. тогда не нужно будет извращаться с регистром. Потому что в такой реализации он будет постоянно записываться при любом проведении заказа. Не Важно перепроведен он после изменения или регламентом.
25 Nysha1210
 
07.12.18
21:12
Спасибо. Попробую все варианты - отпишусь что получилось)))
26 d4rkmesa
 
07.12.18
21:58
(19) Здесь дельный совет.
(0) Если хотите - могу скинуть решение для УПП, через регистр сведений. Правда, там все реквизиты сохраняются, если захотите только значимые обрабатывать - нужно будет немного переделать. Ну и некоторые изменения потребуется в конфу внести (служебный реквизит в нужную табличную часть, для идентификации строк).
27 Nysha1210
 
07.12.18
22:21
Буду рада, если скинете. Спасибо.