Имя: Пароль:
1C
1С v8
Как отследить изменение отдельного измерения в регистре сведений?
,
0 Беата Смит
 
27.04.19
19:43
Вечер добрый. Ситуация такая. Есть периодический независимый регистр сведений Регистр1 с кучей отслеживаемых измерений для ресурса Контрагент: Объем, Количество, Норматив, и так далее. Есть некая обработка ПересчетПоказателей, которая принимает в качестве параметров Период (в моем случае - это д.быть дата изменения именно норматива) и Норматив и на их основе пересчитывает один из реквизитов справочника контрагента. Она должна запускаться в момент, когда для контрагента поменялось значение Норматив. Ни в справочнике контрагентов, ни в каком-либо еще реквизиты, соответствующие измерениям Регистра1, не хранятся. Новые значения просто напрямую пишутся в Регистр1. Так вот вопрос в том, как мне отследить, что в регистре появилась новая запись, в которой, по сравнению с прошлой записью для того же контрагента, изменилось именно значение Норматива? Ну то есть там все измерения друг от друга не зависят, потому само по себе появление новой записи не гарантия того, что норматив изменился. То есть при нажатии на кнопку "записать" мне нужно получить предыдущую запись для того же контрагента, сравнить значение норматива, и если они отличаются, вызвать ПересчетПоказателей (Период, норматив). Короче, можно ли как-то получить набор измерений предшествующей записи без написания каких-то громоздких запросов? Записей в регистре может быть около 50к, потому боюсь, что нечто в духе

Выбрать последние 2
Регистр1.Норматив,
Регистр1.Период,
Регистр1.Контрагент из
РегистрыСведений.Регистр1 как Регистр1
где Регистр1.Контрагент = &Контрагент
бла-бла-бла

будет сильно тормозить. Ведь если я правильно понимаю, он пройдет через все 50к записей с отбором по контрагенту, прежде чем найти эти 2 последние записи.
1 Garykom
 
гуру
27.04.19
19:46
Слишком много букв в одном абзаце, не осилил.
2 Garykom
 
гуру
27.04.19
19:47
Но если с подобными вопросами писать системы для ЖКХ то все понятно почему там такая жопа.
3 vde69
 
27.04.19
19:57
измерения образуют ключ записи (очень условно это примерно как гуид у справочника), то есть до изменения это один элемент справочника а после совсем другой.

какой результат ты хочешь лицезреть кроме как "набор 1 уничтожен, набор 2 создан" и их связать друг с другом невозможно...
4 Лефмихалыч
 
27.04.19
20:11
(0) лобовое решение какое-то такое: при записи любого НЕ ПУСТОГО набора делать соединение со срезом последних на момент ГРаница, Исключая. Если что-то есть, то это то, что ты ищешь.

Но это всё шняга. Задача какая-то глупая. Зачем это всё делать?
5 Cyberhawk
 
27.04.19
20:18
Заводишь ссылочный реквизит регистра (СправочникСсылка), в ссылочный объект каждый раз при записи набора записей регистра пишешь ключ записи. Анализируешь событие ПередЗаписью этой справочника - у реквизитов объекта будут новые значения измерений, у реквизитов ссылки - старые. Профит.
Заодно и версионирование регистра получаешь, если для справочника его подключишь.
6 Беата Смит
 
27.04.19
20:26
Ну если совсем тупо на пальцах. Записи Регистра1:
1. 01.09.2018 Контрагент: Вася Иванов, Объем=1, Количество=1, Норматив=1
2. 01.01.2019 Контрагент: Вася Иванов, Объем=2, Количество=2, Норматив=1
3. 27.04.2019 Контрагент: Вася Иванов, Объем=3, Количество=3, Норматив=100 - и вот при сохранении этой записи мне нужно получить, что 27.04.2019 Норматив изменился с 1 до 100.
7 Garykom
 
гуру
27.04.19
20:42
(6) >и вот при сохранении этой записи мне нужно получить, что 27.04.2019 Норматив изменился с 1 до 100

Берешь значение норматива по ПЕРИОДИЧЕСКОМУ РС на 1 миллисекунду ранее до 27.04.2019 и сравниваешь со значением на 27.04.2019.
8 Лефмихалыч
 
27.04.19
21:41
(6) зачем это делать при записи?
9 mikecool
 
27.04.19
21:42
все не читал - сравнить набор перед записью и при записи не предлагать?
10 vde69
 
28.04.19
09:36
(6) в твоем случае
измерение
1. Контрагент
ресурсы
1.объем
2. количество
3. норматив


никакого изменения ИЗМЕРЕНИЙ нет.... есть применения ресурсов
11 mikeA
 
28.04.19
15:37
(9) +1
12 palsergeich
 
28.04.19
18:08
(9) В отличии от ссылочных типов - независимые регистры при изменении реквизита пишутся 2мя разными этапами:
1) набор со старым отбором пишется с 0 записью (фактическое удаление)
2) набор с новым отбором пишется (фактическая запись)
И событие при записи и перед записью случится 2 раза, и они будут разные, то, что Вы предлагаете - не сработает
13 palsergeich
 
28.04.19
18:08
(12) При изменении измерения, ошибочка
14 hhhh
 
28.04.19
18:23
(13) да уже вчера ведь выяснили, изменение ресурса
15 mikecool
 
28.04.19
20:31
(12) если особо постараться, то можно и два раза поймать
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший