Имя: Пароль:
1C
 
Контроль информации в регистре сведений
0 Мисти
 
31.07.16
15:37
Отследить изменения в регистре
Я такую тему уже заводила.
Задача немного поменялась. Просто делать копию неудобно, нужно каждый раз сравнивать состояние до записи и после записи. и фиксировать - "Иванов", "поле количество" "было 1 стало 2". Примерно так.
"При записи" (модуль набора записей) - я туда попадаю 2 раза, причем первый раз     
"Для каждого запись из ЭтотОбъект Цикл"
- я в этот цикл не попадаю, а второй раз я вижу уже измененную строку.
Как отследить, что там было? (и почему я попадаю 2 раза??)
1 Отладчик
 
31.07.16
15:40
Сторонним, самописанным софтом на бинарном уровне сравнивай "контейнеры" 1cv8.
Это в файловом варианте конечно.
2 RomanYS
 
31.07.16
15:43
(0) перед запись читать запросом по отбору. Но изменение измерений не получится отследить.
3 Мисти
 
31.07.16
15:47
Почему не получится?
4 RomanYS
 
31.07.16
15:51
(3) потому что у РС нет ссылок и запись с другими измерениями - это другая запись. Если ты конечно не собираешься отслеживать изменения из форм.
5 Diman000
 
31.07.16
16:09
Не пойму что за проблема. ПередЗаписью делаешь запрос к БД, там еще старая версия. В текущем объекте новая.
Я 100 раз так делал (c).
6 Мисти
 
31.07.16
16:12
(5) Ну да, я тоже так думаю.
7 RomanYS
 
31.07.16
16:24
(5) в текущем наборе может много записей, процесс записи может быть с замещением и без. Нет проблем, если идентифицировать запись по набору измерений, но так нельзя отследить изменение измерений.
8 Diman000
 
31.07.16
16:31
(7) Универсализм такой задачи вряд ли кому-то нужен, надо свести к частностям и решить эти вопросы.
9 Мисти
 
31.07.16
16:47
НаборЗаписей = РегистрыСведений.ПХВ1.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.ЗаказПокупателя.Установить(ЭтотОбъект.Отбор.ЗаказПокупателя);
    НаборЗаписей.Отбор.ВнутреннийНомерКонтейнера.Установить(ЭтотОбъект.Отбор.ВнутреннийНомерКонтейнера);
    НаборЗаписей.Отбор.СерийныйНомерКонтейнера.Установить(ЭтотОбъект.Отбор.СерийныйНомерКонтейнера);
    НаборЗаписей.Прочитать();
    Для каждого стр из НаборЗаписей Цикл
        пп=1;    
    КонецЦикла;

Что я сделала не так? Почему я в этот цикл не попадаю?
Еще - я так и не поняла - я 2 раза попадаю в "При записи", первый раз в отборе я вижу свой контейнер, заказ и т.д., зато во второй работает цикл
    Для каждого запись из ЭтотОбъект Цикл
10 RomanYS
 
31.07.16
16:48
(8) в (5) указан тот же способ что и в (2). Но в (2) указано серьезное ограничение такого подхода для РС, а в (5) бравада и попытка закидать шапками: "Не пойму что за проблема...
Я 100 раз так делал".
Может ты конечно не заметил (2), но в (3) как раз был вопрос про непреодолимое (на мой взгляд в общем случае) ограничение.
А в (8) ты говоришь про частности, которые являются сутью данной задачи.
11 RomanYS
 
31.07.16
16:51
(9) в первый раз идет запись пустого набора чтобы удалить записи, которые попали в отбор, но отсутствуют в самом наборе.
12 Мисти
 
31.07.16
16:56
(10) Думаю, что измерения меняться не должны.
Тогда запрос делать именно запросом? Почему я свои отбором ничего не получила?
13 RomanYS
 
31.07.16
17:03
(12) я бы засунул текущий набор в ТЗ и в запросе соединил (полным соединением) по всем измерениям с таблицей регистра с наложенными отборами.

Только боюсь такой ответ вызовет у тебя ооочень много вопросов.
14 Мисти
 
31.07.16
17:10
(13) Ага. Суть понятна (я получу сразу список изменений), а как написать - нет.
А мне бы примерчик с 1 полем? А я уж развернусь!
15 Лефмихалыч
 
31.07.16
18:57
(0) необъектные данные для такой задачи не подходят. Любое твое решение на базе регистра сведений будет костлями, которые будет трясти и глючить и ты всё больше своих ресурсов будешь тратить на устранение последствий своих заплаток на заплатки.
16 Лефмихалыч
 
31.07.16
18:59
Лучше расскажи бизнес-задачу, для которой это все говнище понадобилось. Почти наверняка есть решение без вот этого вот всего адского шапито с клоунами-дегенератами в регистре сведений
17 Мисти
 
31.07.16
20:23
Да просто - все в регистр лезут, что-то правят и все говорят - "это не я". Просто для контроля за добросовестными, но рассеянными менеджерами.
18 NcSteel
 
31.07.16
20:30
(17) Закрой права.
19 kosts
 
31.07.16
20:45
(17) Такие регистры должны меняться документами.
20 Смотрящий
 
31.07.16
20:52
(17) Закрывай нах все. "добросовестный" менеджер - это как "идеальный" плательщик
21 Лефмихалыч
 
31.07.16
21:30
к уже сказанному про забрать права и подчинить регистр документу могу добавить только то, что это проблема скорее организационная. Пока процесс, в результате которого появляются и изменяются данные в этом регистре, не будет выкристализован, формализован и регламентирован, пока не будет ответственности, все технические решения - это пар в свисток и искра в землю.

Надо запомнить где-то в ПЗУ у себя простую формулу: "нет ответственности - нет доступа".
22 Мисти
 
02.08.16
10:49
Мне бы примерчик из 13!
Доступ через документы невозможен. Это всё придумано больше 10 лет назад, не мною, там именно идея, что регистр доступен через рабочий стол менеджера, там стоит куча ограничений и проверок в форме, но в итоге всё равно можно много чего менять.
23 RomanYS
 
02.08.16
10:58
(22) это работать не будет. Там две записи(события): одна пустого набора, вторая - набора с данными. И эти наборы технически не связаны. На момент перед записью второго набора в БД уже нет записей.

Обратись к (5) у него 100 раз получалось.
24 Лефмихалыч
 
02.08.16
11:19
(22) >Это всё придумано больше 10 лет назад
это самая веская причина к тому, чтобы всё изменить. Жизнь ушла далеко вперед, а средства автоматизации остались на месте и теперь мешают жить.
25 Лефмихалыч
 
02.08.16
11:20
на базе регистра сведений то, что ты хочешь, технологически не возможно. Прими это уже наконец и живи в том настоящем, какое у тебя есть, а не в прошлом, которое у кого-то 10 лет назад было.
26 Мисти
 
02.08.16
12:00
RomanYS, значит, в регистре невозможно сравнить "было-стало"? (а если я в промежуточный запишу при первой записи, а при второй - сравню?).
Пытаться в форме (обработка рабочий стол) отлавливать изменения?
27 Лефмихалыч
 
02.08.16
12:08
(26) ты не сможешь отличить предыдущую от любой другой. Особенно при удалении записей
28 Лефмихалыч
 
02.08.16
12:11
ЗАпрос = Новый ЗАпрос(ВЫБРАТЬ * ИЗ РегистрСведений.ТвойРегистр");

ДанныеРегистра = Запрос.Выполнить().Выбрать();

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

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

Набор.Записать();

//твоему копрокоду это древнее заклинание разнесет кукушечку в клочья, хотя реально ни чего в регистре не поменялось
29 Мисти
 
02.08.16
12:23
(28) А зачем мне тогда такое??
Там нет таких заклинаний и никто их писать не будет.
За эти рабочие места когда-то были отданы миллионы (еще тогда!), у меня сейчас заказ часа на 4, всё переделывать никто не будет.
Я предложила вариант - просто параллельный регистр, где данные по измерениям не замещаются, а добавляются - будут видны все изменения, но они не хотят. Нужно или сделать, как просят (фиксировать изменения было-стало), или убедительно доказать, что это невозможно.
30 Лефмихалыч
 
02.08.16
12:24
(29) да делай, что хочешь
31 Мисти
 
02.08.16
12:27
Так как исхитриться-то?
32 Лефмихалыч
 
02.08.16
12:29
(31) на каком языке написать: "ни как", чтобы ты прочитала это именно, как "ни как нельзя исхитриться"?
Русский явно недостаточно выразителен в данном случае - 31 пост коту в сраку.
33 hhhh
 
02.08.16
12:36
(31) самое главное усвой, в 1с нет изменения регистра. Любое изменени - это на самом деле полностью удаляется старая запись и добавляется новая, точно такая же. То есть запись идет 2 раза. Поэтому два раза ПриЗаписи. Первый раз запись стирается, второй раз добавляется.
34 RomanYS
 
02.08.16
12:48
(31) Никак.

Можно сделать регистр периодическим и добавить реквизит "редактор". Период и редактора заполнять автоматически текущей датой и пользователем. Все запросы переписать на срезы с риском получить офигенные тормоза.

(29) За "4 часа" можно "убедительно доказать, что это невозможно".
35 Мисти
 
02.08.16
12:59
(33)Как раз это сейчас пытаюсь внушить заказчику!
(34) Я примерно так и сделала, только в зеркальном регистре, его иногда будем чистить.
36 Мисти
 
02.08.16
15:38
Есть отличное решение - я храню информацию в своем регистре, как я это себе представляю, а заказчику ее показываю в виде отчета "что на что поменялось"!
38 Лефмихалыч
 
03.08.16
08:18
(36) у тебя проблема не в том, где хранить и как показывать, а в том, как понять, что именно поменялось. Так что твое решение решает задачу, которой нет.
39 Tateossian
 
03.08.16
09:21
(28) Меня всегда удивляет вот эта конструкция- Набор.Записать();

Набор.Записать();

и ведь после первого "Записать" запись не идет. Почему так?
40 Tateossian
 
03.08.16
09:22
(39) Или я не так понял, что хотелось сказать?
41 Tateossian
 
03.08.16
09:30
Однажды делался универсальный механизм версионирования регистра сведений (любого), тогда и были постигнуты все тонкости и хитрости регистра. Штука делалась на исходниках взятых то ли у ТормозаИТ то ли на мистаскладе, только там не было как раз версионирования регистров сведений, а очень нужно было.

Кстати, тормозов вообще нет, вот только справочник этот самый "тяжелый" в базе, раз в месяц выгружается в архив.
42 Tateossian
 
03.08.16
09:37
(35) Могу тебе скинуть это поделье, оно относительно автономное. Состоит из общего серверного модуля, обработки, отчет и подписок.

Могу скинуть сам модуль и обработку (выполняет функцию журнала).
43 Tateossian
 
03.08.16
09:37
(35) это поделье -> (41)
44 Borteg
 
03.08.16
09:44
(0) мне кажется здесь хватит просто истории изменения, делай второй такой же регистр периодический, добавляй туда поле пользователь. ПриЗаписи первого регистра делай
Для Каждого Запись Из ЭтотОбъект Цикл
        
        МенеджерЗаписи = МойРегистр.СоздатьМенеджерЗаписи();
        ЗаполнитьЗначенияСвойств(МенеджерЗаписи,Запись);
        МенеджерЗаписи.Пользователь  = ТекщийПользователь мой;
                
            МенеджерЗаписи.Записать();

        
    КонецЦикла;