Имя: Пароль:
1C
 
Как отследить изменение порядка строк в табличной части?
0 Косматый
 
14.03.08
00:25
Задача такая.
Во-первых, неплохо было бы при отслеживании изменения реквизитов табличной части понимать, что реально поменялся номер строки, а не все ее атрибуты.

Во-вторых, есть задача. Заголовок>детализация первого уровня>детализация второго уровня. При этом в детализации первого уровня предметного ключа по сути нет: только номер(ну скажем номер этапа мероприятия) и наименование. Номер уникален, а наименование пофигу. Предполагал сделать две табличные части: в одной хранить детализацию первого уровня, во второй - второго. Связку второй ТЧ сделать с первой по номеру строки в первой ТЧ. При перемещении строки в первой ТЧ у нее меняется номер и соответственно этот номер также должен поменяться во второй ТЧ. Отсюда собственно и  сабж.

Конечно понимаю, что можно реализовать подчиненными документами, но не хотелось бы городить.
1 Валерыч
 
14.03.08
06:31
в стандартных это делается через спец. поле ИДСтроки, которое заполняется в момент добавления новой строки
2 BAGER
 
14.03.08
09:02
Тебя интересует изменения данных в ТЧ (без учета порядка строк) или вообще все изменения ТЧ (в т.ч. и порядок следования строк). Для чего это надо? Озвуч всю задачу.
3 Косматый
 
14.03.08
10:14
(1) Пожалуйста, дай ссылочку в каком документе так делается. Поискал в БП по "ИДСтроки" - ничего не нашел.

(2)Интересует именно как отследить, что строку переместили.
Желание такое вытекает из двух задач:
а) хранить историю изменений,в том числе и табличной части. при этом хочется различать ситуации кода меняли реквизиты у строки, и когда перемещали строку.
б)необходимо связать две ТЧ в одном документе по принципу 1:N. Хочу сделать это по  номеру строки, но для этого надо отслеживать момент когда у строки меняется номер - пока не нашел для этого подходящего события.
4 selenat
 
14.03.08
10:17
интересный вопрос...
5 selenat
 
14.03.08
13:10
подниму веточку...
6 selenat
 
14.03.08
14:06
никому сабж не интересен?
7 ЗлобнийМальчик
 
14.03.08
14:09
(7) на ИТСе было что то про это... Надо посмотреть, я такую штуку реалзизовывал  уже два раза. Но можно поинтересоваться, зачем хранить историю перемещения строк???
8 selenat
 
14.03.08
14:13
(7) история меня лично не волнует. Но факт изменения порядка строк в момент записи документа хотелось бы отслеживать. Само по себе это просто. Интересует - как это сделать максимально быстро, чтоб не было тормозов даже при большой табличной части документа...
9 selenat
 
14.03.08
14:24
+8 просто думаю в будущем сделать регситрацию всех изменений, вводимых задним числом. Как делать - в принципе ясно. Но есть сомнения в скорости работы этой фигни с ТЧ...
10 Hitcher
 
14.03.08
14:37
Сижу тоже думаю над подобной проблемой. Никак не могу отловить перед записью объекта, какая строка была добавлена или удалена.
11 Господин ПЖ
 
14.03.08
14:39
(10) сравнение ссылки с объектом не помогает?
12 iSeRG
 
14.03.08
15:26
(11) не поможет
13 Hitcher
 
14.03.08
15:31
Не помогает. Нет однозначной идентификации строки.
14 BAGER
 
14.03.08
15:56
Уточни ЗАЧЕМ отслеживать изменение порядка строк???
15 selenat
 
14.03.08
16:03
(14) ну например чтобы регистрировать существенные изменения в документе. Т.е. простое изменение порядка строк можно вовсе изменением не считать.
16 Косматый
 
14.03.08
17:45
(15) в самую точку центра

(7)(14) Да сама история перемещения записи нам допустим инее нужна..
Тут очень важная деталь в том, что в ТЧ нет КЛЮЧА, кроме номера строки. Понятно, что ПередЗаписью можно сравнить данные в объекте и в БД, но как сравнивать строки ТЧ, какую с какой? Допустим было 10 строк и перенесли первую в конец. Что тогда вы запишите в историю? - что поменялось множество реквизитов во всех строках ТЧ, а хотелось бы чтобы в истории в таком случае осталось бы только, что в строке 1 номер поменялся на 10, в строке 2 на 1, в строке 3 на 2, в строке 10 на 9 и все. Или вообще не отражать эти изменения, но никак не первый вариант, который покажет что перепахали всю табличную часть.

Опять же понятно что можно сэмулировать Ключ в ТЧ, добавив туда реквизит и заполняя его на создание строки GUIDом. Как я понимаю именно это предлагает Валерыч в (1), но типовых я этого не нашел (кстати, если кто занает где такой подход применяется в типовой, укажите документик пожалуйста). А самому идея не очень понравилась, потому и хотелось бы убедиться, что в типовых так поступают.
Нашел подобный подход в FAQ на итланде http://itland.ru/forum//index.php?showtopic=4368

Может с GUIDом и  буду делать, так и не нашел как оперативно отловить изменение порядка строк. Да и вообще, наверное, это была плохая идея связывать две ТЧ по номеру строки в одной из них – даже если отловить перемещение то изменять строки пачками во второй ТЧ – при большом количестве строк перемещение подтормаживать начнет, а сортировка и тем паче.

А вот для вычисления истории вполне рабочий вариант:
1)при открытии записываем ссылки на все строки ТЧ в массив
2)перед записью идем по порядку по строкам ТЧ из ссылки (из БД), находим соответствующую строки через массив (индекс в массиве и номе строки в ТЧ в БД – одно и тоже) и сравниваем реквизиты.

(9) Думаю, быстрее варианта не придумаешь, если только еще запоминать куда нибудь все отредактированные строки по ходу их обработки пользователем, чтобы перед записью не сравнивать все строки а только выборочно.
17 selenat
 
14.03.08
21:40
(16) Можно конечно заюзать всякие события ПередНачаломРедактирования, ПриОкончанииРедактирования. Таким образом ничего анализировать при записи не нужно. Вся инфа об изменениях уже есть на момент записи. Единственное, неприятно то, что это работа с модулем формы (отлавливает только интерактивную работу с формой), а вот программные изменения (то, что обычно в модуле объекта отслеживают) уже не прокатят...
18 BAGER
 
17.03.08
07:28
(15) Возможно для тебя применим следующий выриант: есть первоначальное состояние ТЧ документа и есть измененное состояние ТЧ в одной из них измени знаки значений количественных и суммовых реквизитов на противоположные и "сложи" обе ТЧ. Результатом будут только измененные строки. Для выяснения спорных вопрос и "кто виноват" этого вполне достаточно.
19 Stepa86
 
17.03.08
07:39
Может я чего то не уловил,но почему нельзя просто добавить колонку "старое значение номера строки". Перед записью сравнивать с номером строки и не совпадающие есть измененные.
20 selenat
 
17.03.08
09:20
(18) Интересный вариант. "сложи" в смысле сгруппировать? Т.е. результатом будет полный набор строк ТЧ, но нас интересуют те строки, где числовые значения ненулевые. Ты это имел в виду?
21 BAGER
 
17.03.08
09:28
(20) Да. Если ТЗ то "Свернуть", а если запросом то "Сгруппировать" и отсеч нулевые строки.
22 selenat
 
17.03.08
09:30
(21) ну да, логично. На 8.1 с временными таблицами должно нормально взлететь по идее...
23 selenat
 
17.03.08
09:36
На 8.0 с группировкой в ТЗ и поиском ненулевых значений не уверен, что тормозить не будет...
24 BAGER
 
17.03.08
09:50
(23) Самый простой вариант:
1.ПередЗаписью документа запросом вытаскиваешь ТЧ и выгружаешь в ТЗ;
2.Построчно добавляешь в выгруженную ТЗ измененную ТЧ (с измененными знаками);
3.Сворачиваешь полученную ТЗ;
4.Построчно пробегаешь полученную ТЗ без учета нулевых строк;

Если тебя интересуют только интерактивные действия пользователей, то и делай подобную проверку только при интерактивной записи документа, т.е. перед записью из формы документа.
25 selenat
 
17.03.08
09:54
(24) если только интерактивные действия отслеживать, то как раз лучше делать это в обработчиках событий ТЧ. Там анализировать только данные одной строки нужно и вообще не нагружаем запись документа.
26 BAGER
 
17.03.08
10:04
(25) Все зависит от цели. В моем случае мне надо было фиксировать изменения в документе для создания корректирующего документа (причем пользователь видит и обращается только к текущему состоянию документа, а корректировки создаются автоматом).
+ Пользователь может не принять сделанные изменения + в моем случае присутствует понятие версии документа (количество принятых корретировок) и откат к выбранной версии.
27 Джинн
 
17.03.08
10:10
Категорически утверждаю, что такая задача возникает исключительно при бестолковом проектировании системы. Не должен алгоритм зависеть от порядка строк.
28 Господин ПЖ
 
17.03.08
10:12
(27) +1
29 Господин ПЖ
 
17.03.08
10:13
тут где то ветка была про цифровую подпись... может проще отслеживать - если сломалась - пусть сами ищут...
30 BAGER
 
17.03.08
10:14
(27) Сейчас речь уже не идет о порядке строк, а о способах отлова сделанных изменений в ТЧ.
31 selenat
 
17.03.08
10:24
(27) какой алгоритм не должен зависеть от порядка строк?
32 asady
 
17.03.08
10:32
(27)+1 согласен

был у меня такой опыт - разруливал только ключевыми колонками в обоих ТЧ.
Иначе все плохо было.
33 selenat
 
17.03.08
10:35
(32) что было плохо?
34 selenat
 
17.03.08
10:36
(32) и какими методами потом работаешь с этими ключевыми колонками? И насколько это быстро отрабатывает?
35 asady
 
17.03.08
10:37
(33) невозможно однозначно ассоциировать строки из первой ТЧ со строками второй ТЧ.
36 selenat
 
17.03.08
10:58
(35) способ с ключевыми колонками конечно надежен. Но ИМХО тормоза будут...
37 asady
 
17.03.08
11:07
(36) тормозов нет левый join по ключу и бери что хочешь.
38 selenat
 
17.03.08
11:10
(37) это на 8.1 для начала перейти нужно...