Имя: Пароль:
1C
1С v8
Сравнение набора записей в регистре, нового и существующего
0 NordMad
 
23.04.18
15:13
Такой вопрос. при записи справочник, документа и т.д. при записи можно сравнить объект и ссылку чтобы понять что было изменено перед записью. вопрос - как провести такое же сравниение для регистра сведений. нашел только то что и ПриЗаписи и ПередЗаписью есть доступ к набору через ЭтотОбъект - где хранится новая запись. как мне сравнить с записью которую она заместит? (замещение =истина, вариант с запросом не предлагать, он очевиден, интересует есть ли возможность сделать это без запроса?)
1 NordMad
 
23.04.18
15:14
(0) регистр сведений если что имеется ввиду
2 NordMad
 
23.04.18
15:23
(0) если короче, мне просто нужно понять что меняется в записи регистра ПередЗаписью
3 Mankubus
 
23.04.18
15:25
(0) запрос религия запрещает? Самый лучший вариант
4 NordMad
 
23.04.18
15:31
(3) просто интересует есть ли вариант аналогичный при записи справочника или документа. вот и всё. альтернативны запросу
5 Tateossian
 
23.04.18
15:31
Для подчиненного регистратору легко - выгружаешь в таблицу значений, добавляешь колонку и заполняешь -1, читаешь методом прочитать(), добавляешь к этой же таблице, заполняя единицой, сворачиваешь по итератору - там, где -1 - это удаленные записи, там, где 1 - добавленные. Восстанавливаешь первоначальный набор.
6 NordMad
 
23.04.18
15:32
(5) да сорри, забыл сказать что регистр независимый и непериодический
7 lEvGl
 
гуру
23.04.18
15:39
(4) альтернатива запросу - набор записей с нужным отбором, как в ЭтотОбъект
8 RomanYS
 
23.04.18
15:41
(4) У набора записей есть метод Прочитать()
9 Tateossian
 
23.04.18
15:41
(5) Для необъемного регистра сведений. Также, прочитать, только без установленного отбора. Записать. Еще раз прочитать. Выполнить функцию с итератором (проставленными статусами 1/-1). Сделать отбор, отбросив нули. Полученная таблица и будет результат изменений, в дополнительные свойства записать статус возврата, чтобы не дублировалась процедура записи.
10 NordMad
 
23.04.18
15:43
Т.е. создать наборЗаписей, пихнуть нужный объект и прочитать? правильно я вас понял?
11 lEvGl
 
гуру
23.04.18
15:46
до того как ЭтотОбъект будет записан (завершится транзакция) набор в регистре будет еще "старый", если его прочитать в переззаписью(отбор можно взять из ЭтотОбъект), то получится старый вариант в созданном наборе и новый в ЭтотОбъект
12 lEvGl
 
гуру
23.04.18
15:48
(10) наверно, хз что значит пихнуть нужный объект
13 RomanYS
 
23.04.18
15:50
(10) Если "пихнуть нужный объект" = установить отбор, то да правильно. Но это только "как альтернатива запросу", запрос лучше
14 NordMad
 
23.04.18
15:50
(12) ну создать набор, присвоить ему объект по которому будет сравнение и прочитать, потом сравнить с набором ЭтотОбъект
15 NordMad
 
23.04.18
15:51
(13) почему запрос лучше? быстрее работает чем прочитать?
16 lEvGl
 
гуру
23.04.18
15:51
(13) вот тоже подумал, что запрос ничем не хуже, но там придется с текстом и параметрами "динамически" мутить
17 lEvGl
 
гуру
23.04.18
15:53
отбор.загрузить(объект.отбор) что то в этом роде должно быть
или хотя бы циклом отбор точно можно установить
18 NordMad
 
23.04.18
15:53
(16) больше буков:) в запросе
19 lEvGl
 
гуру
23.04.18
15:54
ну просто набор тут универсальнее по коду получается
20 RomanYS
 
23.04.18
15:54
(15) "почему" - по определению )), если вам нужно только прочитать данные - не ищите альтернативу запросу.

(18) плохой критерий
21 hhhh
 
23.04.18
15:55
(10) в регистр сведений набор пишется в 2 этапа: удаление старой записи, потом запись новой. Поэтому ПередЗаписью надо Прочитать();  где-то запомнить, а потом когда второй раз вызовется ПередЗаписью сравнивать. Лучше поэтому не перед записью это делать, а отдельно, предварительно сравнить, перед Записать().
22 NordMad
 
23.04.18
15:56
(21) так что уже при начале ПередЗаписью старой записи уже нету?
23 NordMad
 
23.04.18
15:57
(20) да всё равно, регистр маленький по количеству записей
24 NordMad
 
23.04.18
15:58
текущийНабор = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
    текущийНабор.Отбор.Объект = ЭтотОбъект.Отбор.Объект.Значение;
    текущийНабор.Прочитать();
так не работает
25 lEvGl
 
гуру
23.04.18
16:00
отбор коллекция вроде
26 drei
 
23.04.18
16:00
Это все бесполезно. Не существует метода отличить удаление - запись пустого набора, от первого этапа записи с замещением измененных данных. Даже передача чего-то через дополнительные свойства, так как экземпляры объектов будут разные.
27 lEvGl
 
гуру
23.04.18
16:00
признак использование еще есть
28 lEvGl
 
гуру
23.04.18
16:02
Установить() там где то должно быть
29 lEvGl
 
гуру
23.04.18
16:03
ну а так да, лучше хтмл наверно
30 lEvGl
 
гуру
23.04.18
16:03
29 - опс, не туда
31 RomanYS
 
23.04.18
16:07
(22) на момент первой записи ЭтотОбъект - пустой, из базы читается. На момент второй - наоборот
32 NordMad
 
23.04.18
16:11
(26) а мне надо чтобы сравнение шло с существующим, если записи нет или она удалена то и черт с ней
33 drei
 
23.04.18
16:51
(32) Еще раз и медленно. При записи с замещением все события набора вызываются два раза с разными объектами наборов. Первый раз - с пустым набором (есть данные в базе, нет данных в наборе) второй раз - с заполненным (нет данных в базе, есть в наборе). Эти два набора не связаны. Никак. Твои желания мирозданию похъ. На сервере глобальных переменных нет. Совсем.
34 drei
 
23.04.18
17:12
Можешь попробовать извратиться через модули с повторным использованием, уповая на то, что между вызовами не произойдет очистки по требованию. Хотя там один серверный вызов, может быть кэш на уровне вызова и получится.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший