Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) ПриИзмененииПорядкаСтрок (число прочтений - 9362 )
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
ПриИзмененииПорядкаСтрок
23. Апреля 2007 :: 04:57
Печать  
Не знал куда запостить и.... запостил сюда ))))
Задача: отслеживать изменения в ТЧ документа, т.е. открыли - запомнили чё было, при закрытии документа нужно сверить что изменилось. проблема:
если с добавлением новой строки/удалением строки ещё можно как-то разобраться, то как быть с изменением порядка строк? как потом однозначно индефецировать какой номер строки был ДО изменения порядка если пользователь, например, отсортировал их по какому-либо реквизиту? Нерешительный
  
Наверх
ICQ  
IP записан
 
desty
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Апреля 2007
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #1 - 23. Апреля 2007 :: 05:17
Печать  
а в сторону разность 2-ух ИТЗ не смотрел, и индекс построить по всем реквизитам ТЧ, кроме номера строки.... если поменялся только порядок строк, в разности будет пусто...

... я делал так...

  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #2 - 23. Апреля 2007 :: 05:26
Печать  
Почему бы не добавить скрытый реквизит, в который записывать внутренний ключ строки?
  

FormEx developer
Наверх
www  
IP записан
 
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #3 - 23. Апреля 2007 :: 07:02
Печать  
desty писал(а) 23. Апреля 2007 :: 05:17:
а в сторону разность 2-ух ИТЗ не смотрел, и индекс построить по всем реквизитам ТЧ, кроме номера строки.... если поменялся только порядок строк, в разности будет пусто...

... я делал так...


спасибо, попробуем
  
Наверх
ICQ  
IP записан
 
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #4 - 23. Апреля 2007 :: 07:03
Печать  
Цитата:
Почему бы не добавить скрытый реквизит, в который записывать внутренний ключ строки?

сам об этом думал, но:
Должно работать с любым документов, а во все док-ты пихать этот реквизит не хочется... Так что, к ожалению, отпадает....
  
Наверх
ICQ  
IP записан
 
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #5 - 23. Апреля 2007 :: 07:04
Печать  
desty писал(а) 23. Апреля 2007 :: 05:17:
а в сторону разность 2-ух ИТЗ не смотрел, и индекс построить по всем реквизитам ТЧ, кроме номера строки.... если поменялся только порядок строк, в разности будет пусто...

... я делал так...


хотя... тут тоже не так все просто... например:
отсортровал пльзоатель строки, а потом изменил в них некоторые данные и... пепец.
  
Наверх
ICQ  
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #6 - 23. Апреля 2007 :: 08:32
Печать  
Определи ключевые столбцы для каждого вида документов и сравнивай по ним. Подозреваю, что в 90% случаев будет достаточно одного столбца "Номенклатура", а остальные считать контролируемыми данными. Проблемы будут только в случае разрешения внесения дублей по значениям ключевого столбца, а где они разрешены?

По ключевым можно и автомат сделать, типа примерно так
Код
Выбрать все
Если ( Найти( "Документ,Справочник,Счет, и т.п.", Метаданные.Документ(док.вид()).РеквизитТабличнойЧасти(сч).Тип ) <> 0 ) Тогда
//-- в список ключевых
иначе
//-- в список проверяемых
КонецЕсли; 


только в сложных ТЧ это быстро разонравится.
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #7 - 23. Апреля 2007 :: 16:38
Печать  
Цитата:
Почему бы не добавить скрытый реквизит, в который записывать внутренний ключ строки?



А не проще так?
1. ПриОткрытии выгружаем в ТЗ
2. в ПриЗаписи опять выгружаем в другую ТЗ и делаем сравнение двух объектов?
Даже построчно проверять не надо будет...
  
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #8 - 24. Апреля 2007 :: 01:47
Печать  
Arta, п.1 - а зачем ПриОткрытии() мучить? Достаточно в ПриЗаписи() сделать
ТекущийДокумент().ВыгрузитьТабличнуюЧасть( ... )  или ошибаюсь?

п.2 - есть готовый метод сравнения у ТаблицыЗначений? Или у ИТЗ? И по каким критериям?

Речь то вот о чем, для меня тве таблицы равны:

Шуруповёрт 1 шт 789.00 руб
Набор бит 2 шт 123.00 руб

Набор бит 2 шт 123.00 руб
Шуруповёрт 1 шт 789.00 руб
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #9 - 24. Апреля 2007 :: 04:22
Печать  
Потому что ты неявно используешь ключ по первому столбцу, а проге его нужно указать явно.
Иначе никак эту ситуацию не разрулишь.
Смотри выше.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #10 - 24. Апреля 2007 :: 06:59
Печать  
Про использование ключа по первому (или прочим потребным в конкретной ТЧ) столбцу - я согласен, вполне это осознаю, и более того, сам за то ратую.

Я вот чего не понял:
Arta писал(а) 23. Апреля 2007 :: 16:38:
...
2. в ПриЗаписи опять выгружаем в другую ТЗ и делаем сравнение двух объектов?
Даже построчно проверять не надо будет...

Это есть готовое?

Я обычно обрабатываю специальным образом две ТЗ, сращиваю их и сворачиваю по ключевым столбцам. Тогда и вижу - есть расхождения или нет... И если есть - то какие.
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #11 - 24. Апреля 2007 :: 09:13
Печать  
dnp писал(а) 24. Апреля 2007 :: 01:47:
Arta, п.1 - а зачем ПриОткрытии() мучить? Достаточно в ПриЗаписи() сделать
ТекущийДокумент().ВыгрузитьТабличнуюЧасть( ... )  или ошибаюсь?

в ПриЗаписи ты получишь уже измененную таблицу. Тебе надо сделать выгрузку два раза, в первый раз неизмененную в ПриОткрытии, и второй раз потенциально измененную и их сравнивать.

dnp писал(а) 24. Апреля 2007 :: 01:47:
п.2 - есть готовый метод сравнения у ТаблицыЗначений? Или у ИТЗ? И по каким критериям?

Есть, например написанный тобой класс.
Критерии - строки и их содержимое Улыбка
  
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #12 - 24. Апреля 2007 :: 09:27
Печать  
Arta писал(а) 24. Апреля 2007 :: 09:13:
в ПриЗаписи ты получишь уже измененную таблицу. Тебе надо сделать выгрузку два раза, в первый раз неизмененную в ПриОткрытии, и второй раз потенциально измененную и их сравнивать.

Не согласен и готов поспорить   Очень довольный
На всякий случай перепроверил себя, так что да, готов, ибо работает как я сказал. Ты верно забыл про СтатусВозврата(0), который можно вызвать в ПриЗаписи()? Так что ТекущийДокумент() просто не может быть УжеИзмененым в этот момент.

А про ключевые - так я не против. Просто смотрим в одну сторону, вот понять друг друга и не смогли  Улыбка

Мысль про класс была, но когда делал спешил - функцию прямо в модуле формы дока бросил. Потом не вернулся переделать по-красивому.
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #13 - 24. Апреля 2007 :: 16:28
Печать  
Если в ПриЗаписи создавать объект документ, искать текущий и оттуда выгружать ТЧ, то действительно будет изначальная таблица.
А вот при использовании Контекста естественно изменится.
Только сколько времени займет на позиционировании документа?

Проще наверное переменную завести.
  
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #14 - 24. Апреля 2007 :: 16:52
Печать  
В режиме занудства: "А переменная память откушает, потом ещё в своп упадёт, пока юзер телится)))"


А зачем документ создавать? У меня работает так (уже написал выше) :
Код
Выбрать все
тч = "";
ТекущийДокумент().ВыгрузитьТабличнуюЧасть( тч ); 


Ни какого создания и поиска, по крайней мере в открытом виде.

По производительности - думаю это не то место, которое интересно оптимизировать.
По красоте - кому что по душе. Мне - так  Подмигивание
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать