Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) ПриИзмененииПорядкаСтрок (число прочтений - 9448 )
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 записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #15 - 24. Апреля 2007 :: 21:03
Печать  
стормозил. мыслю глобально, и забываю про мелочи. конечно ТекущийДокумент спасет.
вот и решение, сравнивать в при записи ТЧ документа с ТЧ контекста.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #16 - 25. Апреля 2007 :: 04:50
Печать  
Без ключевых строк при изменении порядка строк подобное простое сравнение не поможет Печаль
  

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: ПриИзмененииПорядкаСтрок
Ответ #17 - 25. Апреля 2007 :: 06:56
Печать  
artbear писал(а) 25. Апреля 2007 :: 04:50:
Без ключевых строк при изменении порядка строк подобное простое сравнение не поможет Печаль

Я ни как не пойму, о каком "простом сравнении" идет речь?

Простое построчное "реквизит-в-реквизит" уже обсудили и поняли, что изменение порядка всё убьёт.
Введение скрытого поля, заполняемого уникальными значениями, обсудили, оставили как вариант.
Разделение столбцов ТЧ на "ключевые" и "проверяемые" тоже обсудили. Пришли к выводу, что дело верное, осталось завернуть его в класс. Порядок строк тогда будет не страшен.

Да?
  
Наверх
ICQ  
IP записан
 
desty
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Апреля 2007
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #18 - 25. Апреля 2007 :: 07:06
Печать  
А если в накладной будут две одиновые строчки
//
№1, Товар1, 15.00, 1500
№2, Товар1, 15.00, 1500

потом я меняю реквизит цена скажем на 30.00 и меняю сортировку скажем по реквизиту цена

порядок строк поменяется а по какому еще реквизиту мне однозначно произвести сравнение, значит нужен ключевой реквизит "КлючСтроки"


  
Наверх
 
IP записан
 
desty
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Апреля 2007
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #19 - 25. Апреля 2007 :: 07:09
Печать  
Ты же будешь писать ечто такое

"ЕСли ТЧ_ДО.Товар = ТЧ_После.Товар ТАДЫ ..."

а если товары разные Если товары одинаковые да еще и вразных строках? я вот пересмотрел свой механизм определения... и пока остановился на том что пересохранять документ необходимо если разность таблиц по всем полям ТЧ, кроме НомераСтроки НЕ пустая
  
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #20 - 25. Апреля 2007 :: 07:26
Печать  
Дубли по ключевым полям у меня не допустимы, так что двух строк с "Товар1" у меня быть не может.

Сравнения типа
Код
Выбрать все
Если ( ТЧ_ДО.Товар = ТЧ_После.Товар ) Тогда 


я тоже стараюсь избегать. Не гибко и гиморно. Хотя, вероятно, быстрее работает.

Тебе нужно просто определить факт или найти расхождения?
  
Наверх
ICQ  
IP записан
 
desty
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Апреля 2007
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #21 - 25. Апреля 2007 :: 07:32
Печать  
dnp писал(а) 25. Апреля 2007 :: 07:26:
Дубли по ключевым полям у меня не допустимы, так что двух строк с "Товар1" у меня быть не может.

Сравнения типа
Код
Выбрать все
Если ( ТЧ_ДО.Товар = ТЧ_После.Товар ) Тогда 


я тоже стараюсь избегать. Не гибко и гиморно. Хотя, вероятно, быстрее работает.

Тебе нужно просто определить факт или найти расхождения?


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

К примеру в ОтчетеККМ, может присутствовать 2 строки с одинаковым товаром но с разной скидкой, если я изменю сортировку ТЧ и поменяю скидку... бог его знает как сравнить без ключа... чувствую придется вводить ИДСтроки Улыбка
  
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #22 - 25. Апреля 2007 :: 07:52
Печать  
Не, ну так-то понятно, про ОтчетККМ - молчу, там всё это может быть. Так что ИДстроки =  ...
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #23 - 25. Апреля 2007 :: 11:09
Печать  
artbear писал(а) 25. Апреля 2007 :: 04:50:
Без ключевых строк при изменении порядка строк подобное простое сравнение не поможет Печаль


Товар, количество, цена. Вот вам и ключ. У меня это работает уже год и никаких проблем.
Только я не пользуюсь ИТЗ, а просто сравниваю в классе две ТЗ по содержанию.
Какое кол-во строк может быть в документе... это мгновенно все происходит.
  
Наверх
 
IP записан
 
desty
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Апреля 2007
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #24 - 25. Апреля 2007 :: 11:32
Печать  
Не согласен. это не ключ... в случае если реквизиты не уникальны

к примеру у меня если сделать следующий код в модуле формы (примерный принцип)
многих документов, дело в том что у меня много сводных документов по товародвижению в консолидированной базе

Код
Выбрать все
ИТЗ = создатьОбъект("ИндексированнаяТаблица");
ИТЗ.Загрузить(ТекущийДокумент());
ИТЗ.ДобавитьИндекс("ТестьУникальности1","Товар, Количество, Цена");
ИТЗ.ДобавитьИндекс("ТестьУникальности2","НомерСтроки,Товар, Количество, Цена");

Сообщить(" ну и вот и первый индекс"+ИТЗ.ИндексУникален("ТестьУникальности1"));
Сообщить(" ну и вот и  второй индекс"+ИТЗ.ИндексУникален("ТестьУникальности2"));

 

  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #25 - 26. Августа 2009 :: 10:15
Печать  
Вобщем давно уже задавался тем-же вопросом что и автор данной "ветки" - как-бы отследить изменение ТЧ документа
Как и всем, мне сильно мешает изменение порядка строк Улыбка Если СтрокаВверх, СтрокаВниз еще можно проанализировать, то сортировку строк никак не получается. Хотел ее заблокировать.
Почитал доку на предопределенную процедуру
Процедура ПриИзмененииПорядкаСтрок(<?>)
КонецПроцедуры
Синтаксис:
ПриИзмененииПорядкаСтрок(<Действие>)
Назначение:
Предопределенная процедура при изменении порядка строк многострочной части документа.
Параметры:
<Действие> - число: -1 - перемещение строки вверх; 1 - перемещение строки вниз; 0 - перенумерация строк.

Вполне логично предположить что
Код
Выбрать все
Если Действие = 0 Тогда
    СтатусВозврата(0)
КонецЕсли 


и наступит счастье! Фиг там!!! Действие = 0 не бывает никогда
СтрокаВверх = -1, СтрокаВниз = 1, ПеренумерацияСтрок = ...... ТОЖЕ 1.
И какого спрашивается!!!!???  Злой
Или нажатие кнопки "сортировать " не есть "перенумерация"? А что-же тогда "перенумерация"? Мне ее не удалось добиться.... Или у меня "гранаты не той системы"? Пробовал на версии 7.70.026, "голой" т.е. без единой ВК
У кого какие мысли по поводу?
  
Наверх
ICQ  
IP записан
 
Альтаир
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 13
Местоположение: Харьков, Украина
Зарегистрирован: 26. Сентября 2008
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #26 - 26. Августа 2009 :: 13:01
Печать  
А если сначала эти две ТЗ отсортировать по ключам, а потом уже сравнивать? Тогда изменение порядка строк никак не будет влиять.

Или "вычесть" одну из другой? Так даже лучше будет, если нужно пользователю показать разницу.
Во одной из таблиц инвертировать знак колонки, например "Количество", слить их а потом Свернуть().
  

Все животные равны, но некоторые равнее других.&&© Джордж Оруэлл "Скотный двор"
Наверх
www  
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #27 - 27. Августа 2009 :: 11:51
Печать  
Альтаир писал(а) 26. Августа 2009 :: 13:01:
А если сначала эти две ТЗ отсортировать по ключам, а потом уже сравнивать? Тогда изменение порядка строк никак не будет влиять.

Или "вычесть" одну из другой? Так даже лучше будет, если нужно пользователю показать разницу.
Во одной из таблиц инвертировать знак колонки, например "Количество", слить их а потом Свернуть().

Ну ключ-то все равно нужен. И еще как обычно хочется универсальности. Т.е. чтобы не прописывать для каждого документа свой ключ и не добавлять в каждый документ реквизит _НомерСтроки например. И таким универсальным ключём является НомерСтроки .... если-бы его не портила сортировка с перенумерацией  строк Печаль
  
Наверх
ICQ  
IP записан
 
Альтаир
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 13
Местоположение: Харьков, Украина
Зарегистрирован: 26. Сентября 2008
Пол: Мужской
Re: ПриИзмененииПорядкаСтрок
Ответ #28 - 27. Августа 2009 :: 12:03
Печать  
В том-то и дело, что НомерСтроки не может быть универсальным из-за его легкой изменяемости.
Да и какой, он в сущности ключ? Ключ - это "Номенклатура", или "Контрагент" или т.д. в зависимости от вида документа.
  

Все животные равны, но некоторые равнее других.&&© Джордж Оруэлл "Скотный двор"
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ПриИзмененииПорядкаСтрок
Ответ #29 - 27. Августа 2009 :: 13:22
Печать  
Всё не читал, но посмотри это
http://www.1cpp.ru/forum/YaBB.pl?num=1242654490
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать