Имя: Пароль:
1C
1С v8
Временное хранение данных. Как реализовать?
0 a2a4
 
22.02.17
08:42
Решаю вопрос журналирования изменений регистра сведений. При удалении или создании нового проблем нет. Но при изменении встают вопросы. Есть желание писать типа {СтрокаОтбора}{ИзменяемыеЗначения}, то есть {"Период = "21.02.2017", МодельТС = "904702 ", ГСМ = "Бензин Аи 76""}{ЛинейнаяНорма=10(было)/11(новое)}.

Проблема в том, что изменение регистра сведений происходит за два этапа удаление + запись. При этом невозможно в один момент поймать и старое и новое значение.

Как вариант пробовал ПоместитьВоВременноеХранилище пытаясь в адрес вставить строку отбора. Но выясняется что абы какую строку под адрес использовать нельзя.

Есть ли варианты без создания специальных реквизитов в конфигурации временно хранить некоторые данные?
1 DrZombi
 
гуру
22.02.17
08:46
(0) Так и пиши. свои длинные строки, вида {ИзменяемыеЗначения}, МодельТС, "Период. и т.д. сожми на коды: 1, 2, 3, 4, 5, 6 и т.д. нечего хранить лог в понятной форме для человека. Для этого отчеты есть :)
2 Морозов Александр
 
22.02.17
08:46
Регистр же документами изменяется? Перед проведением можно получить что было и что будет...


А вообще... владельцы больны.
3 osa1C
 
22.02.17
08:48
(0) СоздатьНаборЗаписей() не пробовал?
4 Fedor-1971
 
22.02.17
08:49
(0) подписка на событие ПередУдалением? Новое у тебя есть, а старое ты удаляешь. Вопрос будет только в записи начального значения, но зачастую, хотят видеть кто, что и когда изменил, т.е. что было видим, а что стало есть на форме записи.
5 a2a4
 
22.02.17
08:53
(2) Регистр может меняться разными способами. И даже приходить по обмену. Поэтому универсально код вставить либо в подписку на событие (ПередЗаписью()) либо в модуль набора записей (ПередЗаписью()).
6 a2a4
 
22.02.17
08:58
Повторю. Изменение регистра сведений происходит в два этапа. На первом данные удаляются (то есть записывается регистр с пустыми значениями), на втором - записываются новые данные. На первом этапе можно получить ТОЛЬКО исходные данные. На втором этапе можно получить ТОЛЬКО новые, измененные данные.
7 Fedor-1971
 
22.02.17
09:09
(6) т.е. одна процедура делает запись пустого набора (что мешает перед записью пустого набора сохранить в лог то, что было целиком?). Другая, независимая, процедура в другой транзакции записи, пишет новые данные?
8 a2a4
 
22.02.17
09:21
(7) через какой лог предлагается работать? Это стандартное от 1С или самостоятельно огород городить?

В принципе в исходном сообщении задается вопрос - как временно хранить некоторые данные.
9 dmpl
 
22.02.17
09:47
(8) В переменной. Ваш КЭП. Сделай глобальную структуру и клади туда наборы записей или ТЗ. Потом сравнивай сколько душе угодно.
10 Serg_1960
 
22.02.17
09:50
(0) "При этом невозможно в один момент поймать и старое и новое значение... Есть ли варианты... временно хранить некоторые данные?" :)

РегистрСведенийНаборЗаписей.ДополнительныеСвойства()

Может использоваться в тех случаях, когда необходимо хранить некоторые значения, связанные с объектом, на время выполнения некоторых операций, без изменения объекта. Например, при обработке событий в подписке на события.

Ваш к.э.п.
11 FIXXXL
 
22.02.17
09:50
(9) или в ПовторногоИспользования
12 RomanYS
 
22.02.17
09:57
(0) Пиши в свой "журнал" удаление и запись, а потом постобработкой или при выводе в отчет объединяй их в "(было)/(новое)"
13 a2a4
 
22.02.17
10:02
(9)(12) крайний случай, забивать конфигурацию новыми объектами на каждый чих не есть хорошо (имхо)
(10) не работает - удаление (один объект), запись нового (уже другой объект). При удалении первого объекта удаляются и ДополнительныеСвойства.
14 DrWatson
 
22.02.17
10:04
(13) а ты куда хочешь записывать лог, в журнал регистрации?
15 a2a4
 
22.02.17
10:08
(14) журналирование в журнал регистрации.

(11) можно подробнее
16 dmpl
 
22.02.17
10:09
(13) 1 структура, которая даже не видна в метаданных что забивает?
17 FIXXXL
 
22.02.17
10:13
Функция ТекстОшибокНакопленныйПроцедуройСообщитьОбОшибке(ОчиститьМассивОшибок=Истина) Экспорт
    
    ТекстО = "";
    //считываем накопленные ошибки
    МассивО = ОбщегоНазначенияПовтИсп.МассивОшибокИзПроцедурыСообщитьОбОшибке();
    //формируем текст ошибки
    Для Каждого ТекЭлемент из МассивО Цикл
        ТекстО = ТекстО + ТекЭлемент+Символы.ПС;
    КонецЦикла;
    //если надо, зачищаем считанное
    Если ОчиститьМассивОшибок Тогда
        МассивО = ОбщегоНазначенияПовтИсп.МассивОшибокИзПроцедурыСообщитьОбОшибке();
        МассивО.Очистить();
    КонецЕсли;
    
    Возврат ТекстО;
    

КонецФункции



Функция МассивОшибокИзПроцедурыСообщитьОбОшибке() Экспорт
    
    
    //при каждом вызове возвращается уже накопленный массив ошибок, если не было вызова ОбновитьПовторноИспользуемыеЗначения()
    //или с последнего обращения к этой процедуре не прошло более 20 минут
    //или массив не был считан с очисткой
    
    Возврат Новый Массив();
    
КонецФункции
18 FIXXXL
 
22.02.17
10:13
(15) см (17)
19 FIXXXL
 
22.02.17
10:14
соответственно в любом месте пишем

            МассивОшибок = ОбщегоНазначенияПовтИсп.МассивОшибокИзПроцедурыСообщитьОбОшибке();
            МассивОшибок.Добавить(ТекстСообщения);
20 a2a4
 
22.02.17
10:31
(16) сегодня нужно журналирование, завтра еще что-нибудь, послезавтра нужно третье - если каждый раз создавать новые объекты, то вскоре получите конфигурацию с кучей редкоиспользуемой хрени. Поэтому, первоначально рассматриваю варианты с минимальными изменениями в конфу. (В текущей конфигурации до сих пор разгребаю дерьмо от одних деятелей, хотя прошло более 5 лет).
21 dmpl
 
22.02.17
10:43
(20) Ну тогда доказывайте, что им это не нужно, раз не хотите писать


Перем ИсторияИзмененияРС Экспорт;

...

ИсторияИзмененияРС = Новый Структура;


P.S. Вместо структуры можно и соответствие использовать, тогда в качестве ключа можно ключ записи указывать.
22 Fedor-1971
 
22.02.17
10:46
(20) Во на как.
Храни в XML вне конфигурации, логи в оперативном доступе ни кому не надо, сможешь их периодически удалять без ущерба для хранимых данных и логике конфигурации
23 h-sp
 
22.02.17
10:49
(20) почему вы не можете взять значения регистра в 2 этапа? расшифруйте.
24 a2a4
 
22.02.17
10:57
(21) это мне нужно. Но также мне нужна конфигурация с которой МНЕ приятнее, удобнее и оптимальнее работать.


Ладно. Всем спасибо. Красиво сделать не получается. Буду тупо писать в журнал и при удалении и при записи. А при необходимости (которая будет весьма редкой) буду смотреть обе записи.
25 Serg_1960
 
22.02.17
12:14
(13) "не работает - удаление (один объект), запись нового (уже другой объект). При удалении первого объекта удаляются и ДополнительныеСвойства." - "Да вы просто не умеет их готовить"(цы)
Это один и тот-же набор записей регистра и, следовательно, ДополнительныеСвойства - не удаляются.
26 a2a4
 
27.02.17
15:38
(25) Я просто проверил на практике.
27 a2a4
 
27.02.17
15:45
Наткнулся на следующее v8: Странность при записи регистра сведений

там указывают что "при записи пустого набора в ПередЗаписью Модифицированность() ИСТИНА в случае чистого удаления, и ЛОЖЬ в случае замещения (второй вызов будет)".

Но при программной работе с наборами записей все оказывается не все однозначно. Опять же погонял на практике.

1. Если удалять через

Набор=РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
Набор.Отбор.ИмяОтбора.Установить(ЗначениеОтбора);
Набор.Записать()

то при этом Источник.Модифицированность()=ЛОЖЬ

2. Если изменять/удалять посредством

Набор=РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
Набор.Отбор.ИмяОтбора.Установить(ЗначениеОтбора);
Набор.Прочитать();
Набор.Удалить(ИндексЗаписи);
Набор.Записать();

то по факту будет перезапись за один проход и при этом Источник.Модифицированность()=Истина
28 Serg_1960
 
27.02.17
17:20
"то по факту будет перезапись за один проход" - нет.

Sorry, но эта тема (про двойной вызов обработчиков) - тот ещё старый рваный баян.
v8: Регистр сведений: события ПередЗаписью и ПриЗаписи
29 Мимохожий Однако
 
27.02.17
17:31
(0)В чём конечная цель и выигрыш?
30 Лефмихалыч
 
27.02.17
17:40
(0) избитая граблями тема. Необъектные данные не журналируются, т.к. нет технической возможности отличить изменение от добавления и от удаления.
Живи с этим
31 Вафель
 
27.02.17
17:42
Вот эта штука умеет отслеживать изменения регистров
http://catalog.mista.ru/public/18588/
32 Serg_1960
 
27.02.17
20:37
Эээ... насчет избитых граблями :( красиво, кстати, сказано :) У меня версионировались (в прошедшем времени) некоторые регистры сведений. Те, к которым слишком много юзверей имели доступ и вокруг которых устраивали много склок и разборок. "У семи нянек дитя без глазу"(цы) - пришлось версионировать, чтобы всегда быть готовым ответить на вопросы "Что, где, когда".