v7: Как отсортировать таблицу значений с группами? #682434


#0 by OTMOPO3OK
Группы могут быть в любой колонке. Сначала должна идти группа, потом её потомки и т. д. Я написал сортировку по двум колонкам с использованием рекурсии, а дальше затык. Не могу удержать в памяти весь алгоритм универсальной сортировки по любому количеству колонок. Помогите.
#0 by OTMOPO3OK
Группы могут быть в любой колонке. Сначала должна идти группа, потом её потомки и т. д. Я написал сортировку по двум колонкам с использованием рекурсии, а дальше затык. Не могу удержать в памяти весь алгоритм универсальной сортировки по любому количеству колонок. Помогите.
#1 by Barmalei
а сколько всего колонок ?
#2 by OTMOPO3OK
Сколько угодно может быть колонок, по которым нужно сортировать.
#3 by OTMOPO3OK
#4 by Barmalei
это значит содержимое одной колонки никак не связано с содержимым другой.  тогда можно использовать 1 алгоритм для 1 колонки в цикле на все колонки ?
#5 by OTMOPO3OK
Из этой портянки видно, что сортировка работает только по двум колонкам. Естественно, что это не универсально и вообще не красиво. Но я наверное уже выдохся и не вижу.
#6 by Рэйв
реально мешает банер рекламы. Асмоди....Это все реально отвлекает.
#7 by OTMOPO3OK
Ну в целом да, но вот как?
#8 by OTMOPO3OK
Понятно, что должен быть цикл по колонкам, но я не вижу его, глаз замылился, наверное.
#9 by OTMOPO3OK
#10 by Barmalei
по идее так будет в самом начале Для А=1 По ТЗ.КоличествоКолонок Цикл   тут делаем сортировку по 1 колонке КонецЦикла;
#11 by OTMOPO3OK
Вот сортировка по первой колонке:
#12 by OTMOPO3OK
А вот по второй:
#13 by OTMOPO3OK
По третьей колонке сортировка будет выглядеть ещё ужаснее. Нужно увидеть во всём этом универсальный алгоритм. Я его не вижу.
#14 by Barmalei
так выходит есть связь 1 и 2 колонки ? иначе все просто было бы Для А=1 По ТЗ.КоличествоКолонок Цикл   сортировка по колонке КонецЦикла;
#15 by КонецЦикла
Где потом используешь эту сортировку? Вот перед использованием и сортируй по нужным колонкам ТЗ, потом потомки Вот пример рекурсивного вызова для ИТЗ, добавит просто сортировку в вывод группировок
#16 by OTMOPO3OK
Связь только в том, что сортировать, конечно же, нужно с учётом предыдущих колонок. Использую непосредственно перед подсчётом итогов по группировкам (и группам), который ещё предстоит написать. То, что по ссылке, мне пока совсем не подходит. Данные уже есть в таблице значений. Их просто нужно отсортировать.
#17 by OTMOPO3OK
А, ладно, сейчас блок-схему буду рисовать. Всем спасибо.
#18 by NS
новаяколонка,, заполняешь полным наименованием - .полноенаименование, и сортируешь по ней.
#19 by OTMOPO3OK
Полное наименование выдает строку вида "родитель/потомок". А в наименовании элемента справочника может использоваться символ слэша. И поэтому такая сортировка может быть неправильной. Ну, это если конечно я ничего не путаю.
#20 by NS
это все легко обходится.
#21 by OTMOPO3OK
Как?
#22 by NS
написанием своей простенькой функции получения полного наименования, где в качестве разделителя например используется симв
#23 by КонецЦикла
Ну дык... ИТЗ сама подсчитает итоги по группировкам Зачем мучать анальное отверстие?
#24 by GStiv
А если привязать дополнительно Уровень дполнительно в колонке
#25 by Попытка1С
+1
#26 by OTMOPO3OK
Меня немного смущает лицензия, по которой распространяется  icpp. Но конечно я рассмотрю и этот вариант. Всем спасибо.
#27 by OTMOPO3OK
Вот, написал. Примерно так это выглядит:
#28 by ADirks
ага, придут авторы, и потребуют все исходники! кошмаррр! :))
#29 by OTMOPO3OK
О, привет. Ты ж создатель индексированной таблицы. Как в ней искать неопределённое значение? Создал индекс из трёх колонок. Но в ключе последнее значение должно быть неопределённым. А в список значений неопределённое значение невозможно засунуть. И вот я сижу и думаю, если создать индекс из двух первых колонок, то будет ли "НайтиСтроку" позиционироваться точно на строку ИТЗ с неопределённым значением третьей колонки, не участвующей в индексе? Но что-то мне сдаётся, что не обязательно будет так.
#30 by ADirks
а не пробовал сзКлюч = СоздатьОбъект("СписокЗначений"); вроде должно пройти
#31 by aka AMIGO
можно и я вылезу со своим вариантом? :) как-то давно тому делал такую сортировку для этого создал еще одну колонку, записал в неё ПолныеКоды товаров из соотв.колонки, да по ним и отсортировал.
#32 by OTMOPO3OK
Не работает. РазмерСписка только возвращает размер списка. Но я всё равно попробовал и вот: "Слишком много параметров передано при вызове функции/процедуры объекта".
#33 by Mikeware
Используй ИНдексированнуюТаблицу, и не взрывай мозг...
#34 by OTMOPO3OK
Если сможешь ответить на вопрос из , то прямо сейчас перепишу на ИТЗ.
#35 by Mikeware
А зачем искать неопределенное? Может, добавить пустое значение?
#36 by ADirks
точно, гоню ... единственный вариант - воспользоваться тем фактом, что неопределенные значения всегда первые в сортировке. примерно так, хотя конечно изврат
#37 by OTMOPO3OK
Пустое значение занято для пустого элемента. Они у меня есть. А неопределённые в строках с группировками. Да, только вот так получается. А сейчас с обычными ТЗ я сначала делаю индексную строку из внутренних представлений и уже её ищу. В любом случае этот вариант с ИТЗ будет быстрее, чем мой?
#38 by ADirks
Насчет быстрее - необязательно. Такая сортировка с иерархией - это куча обращений к базе, что сводит на нет все другие оптимизации. Но он может оказаться понятнее - и это немаловажно. А может и не оказаться :)
#39 by OTMOPO3OK
Я почему спрашиваю. Потому что процедуру сбора итогов про группам справочника я ещё не сделал, и мне кажется, что это будет сложно. Вот думаю теперь, что будет проще: либо её своими силами написать или на ИТЗ сделать (ведь в этом случае, многое придётся переписывать). Учитывая, что мне только это и осталось. Планировалось, что оптимизацией и ускорением я займусь потом, когда всё будет работать.
#40 by Mikeware
похожен, что надо начинать с постановки задачи...
#41 by OTMOPO3OK
Этот вариант мне не нравится, теоретически коды могут быть не уникальны. Такое конечно редко бывает, но тем не менее. Вариант с полным наименованием мне тоже не нравится. Теоретически в наименовании может быть любой символ, который можно было бы использовать как разделитель. Вы все конечно можете подумать, что выдумываю лишнее, но я люблю, чтобы было всё максимально однозначно.
#42 by Mikeware
Ты хочешь сделать что-то типа сводной экзеля/олап-куба?
#43 by ADirks
Если ты возьмёшь ИТ.Группировать - то оптимизацией и ускорением ты не сможешь заняться :) Всё, что ты можешь сделать это: "При группировке возможно также подсчитывать суммы по группам справочников - для этого в списке модификаторов индекса нужно указать '&'. Если в таблице есть колонка с именем '<ИмяКолонкиСправочника>_Родитель', то родитель для элемента будет браться из этой колонки - это уменьшает количество обращений к базе, и заметно увеличивает производительность."
#44 by Mikeware
собирай в щепочку иды(внуртенние коды)
#45 by OTMOPO3OK
Да не, всего лишь маленькая библиотека для создания простеньких кросс-отчётов. Спасибо, с этим я ещё не разобрался. Мне нужно в перспективе, чтобы группы и элементы можно было отсортировать в алфавитном порядке или в обратном. Сделать это с использованием внутренних идентификаторов будет проблематично, мне кажется. Да это и не важно сейчас. Но тем не менее спасибо за участие.
#46 by Chum
Весь текст не читал, но: 1. Что мешает ТС использовать дерево, т.е. таблицы в таблицах? 2. Что мешает ТС, если не применять п.1, то добавить сортирующие колонки, например: уровень, родитель? имхо дерево решает все задачи, а там хоть засортируйся.
#47 by OTMOPO3OK
Наверное, ничто не мешает. Просто я не задумывался об этом. Спасибо, ваш комментарий ценен для меня. Я подумаю.
#48 by Mikeware
1. Используй нормальные инструменты, и будет тебе счастье. например, такое: 3. думаю, что не так уж проблематично - вторым ключевым полем первые буквы наименований. если я правильно понял задачу, ему неизвестен первоначально порядок столбцов сортировок.
#49 by OTMOPO3OK
Ух ты, выглядит прикольно. Спасибо.
#50 by Mikeware
Это то, что хотел? тогда юзай QryConsole.
#51 by Simod
Заготовка:
#52 by OTMOPO3OK
Спасибо. Я тут подумал, что qryConsole конечно полезная вещь, я её обязательно изучу. Но сейчас уже многое сделано. Библиотечку эту я ж не просто так пишу, а для отчёта, который не спешно ваяю. Пожалуй, его я по старинке докончу. Ваш комментарий тоже ценен для меня. Изучу всесторенне.
#53 by Mikeware
С квериконсолью "неспешнописуемый" отчет не будет иметь никакого смысла (кроме разве что учебной цели). Быстрее сделать на консоли. хотя - каждый ССЗБ.
#54 by OTMOPO3OK
С одной стороны хочется, конечно, изучить что-то новое, удобное, красивое. Но для этого опять придётся стопятьсот часов с красными глазами просидеть. Спрашивается, нужно ли это сейчас, когда семёрка уже устарела?
#55 by Mikeware
да там, собственно, и изучать нефиг... всяко меньше времени надо, чтоб написать  "универсальную библиотечку"
#56 by Evrepid
Н да.... Один краше другого советы дают.
#57 by КонецЦикла
Добавился пример переделанного отчета 1c911.by/sites/default/files/user//files/primer_itz.rar
#58 by ADirks
Всё-таки наиболее дельный совет - от Майка. Надо кубики, значит берём кубики, зачем мудрить.
#59 by КонецЦикла
А я нечетал честно говоря Как правило нужен готовый отчет с минимумом настроек, как в макдаке (так любят некоторые руководители говорить)
#60 by Serginio1
Посмотри там есть группировка и вывод по группам
#61 by Злопчинский
у, елы-палы, а это у тебя что за интересный такой объект используется..?
#62 by Mikeware
квериконсоль, и вывод в ПивотТэйбл
#63 by OTMOPO3OK
Я с ИТЗ ещё не до конца разобрался, чего уж говорить про квериконсоль. Это надолго. Что ещё к этому всему добавить, если я только вчера догадался прикрутить gcomp чтобы он автоматически распаковывал обработку при сохранении, а до этого пару лет вручную текст модуля в файлик копировал, чтобы исходник нормально в git засовывать?
#64 by ADirks
Да забей ты на ИТ, тебе же другое нужно, ну вот правда же
#65 by ADirks
Разберись с тем, про что Майк говорил, ну нафига велосипед заново конструировать? Лучше то не будет. И быстрее не будет.
#66 by OTMOPO3OK
Да я пытаюсь… Там просто много чего для меня нового.
#67 by ADirks
Нормальное положение программиста, ничего страшного. Это же оч.шорошо, что много нового.
#68 by Злопчинский
я вот вообще к мысли пришел. что не в 1с счастье... когда утрясутся все бури житейские - буду сидеть на голой пенсии, пить кисель да на солнце смотреть...
#69 by OTMOPO3OK
Выяснилось, что первоначальный вариант был ошибочный. Этот вроде рабочий. Единственное, что меня смущает — производительность. Вы наверное заметили в цикле по строкам таблицы выгрузку всей таблицы и фильтрацию всей таблицы:
#70 by OTMOPO3OK
Делал замеры. Этот метод выполняется 70% всего времени в отчёте за один день. Конечно это никуда не годится. Если же запустить отчёт за весь год, то думаю, он займёт 95% времени.
#71 by Mikeware
"вы, наверное, заметили" - наивный, ну кому нафик твой код сдался? :-)
#72 by OTMOPO3OK
Мне сдался. Я люблю свой код. Он для меня как четвёртый ребёнок.
#74 by ZaOS
vc
#75 by monsterZE
Я ваще не понял чего хотел тс.. =) Ты хоть бы на примере что-ли объяснил.
#76 by Mikeware
сводную таблицу с итогом по группам. задачка, вообще-то , давно решена нормальными способами, но ТС хочет изобрести скоростной трехколесный велосипед со взаимно ортогональными колесами разного диаметра, и цепной передачей от педалей к рулю... Почти изобрел, но жалуется на скорость...
#77 by Salimbek
Используй Индексированную таблицу. Использование типа:
#78 by OTMOPO3OK
Ты мне скажи, что плохого в том, что я изобретаю велосипед? Сейчас я понимаю, что всё уже давно изобретено. Но это всё ещё нужно запустить, а оно у меня пока не взлетает. Имею в виду твой метод с квериконсолью и пивоттэйблом. А ты ведь наверняка знаешь, какого это — долгое время не видеть результатов своего труда, когда ты готов почти на любые костыли и подпорки, чтобы только хоть как-нибудь заработало. Велосипед уже готов. Он медленно едет, но его, я уверен, можно ускорить. И я понимаю, что возможно мне не следовало его писать, что нужно было чуть подольше погуглить, найти твой метод и начать сразу с него. Но что уж теперь, выкидывать? Это был бы ещё более глупый поступок. Спасибо за ценную информацию о квериконсоли и т. д., но твои причитания мне уже наскучили.
#79 by monsterZE
я делал прайс с подсчетом колва элементов в группах и с разбегом цен от мин до макс.. без ИТЗ =) завтра свой трехколесный пригоню ;-)
#80 by monsterZE
нужно что-то типа [URL=]
#81 by monsterZE
пардон,
#82 by Salimbek
У тебя развернут только один вид справочника. ТС же нужно несколько разновидностей разворачивать. Т.е. первый вид, допустим справочник магазинов с группами в виде регионов, второй вид: номенклатура, третий - еще какой-то вид справочников.
#83 by Mikeware
плохо то, что он, этот велосипед, бесполезный - ни тебе опыта, ни людям решения.
#84 by iamnub
А откуда ты взял свою ТЗ? Может быть решить твою проблему раньше?
#85 by OTMOPO3OK
Прошу прощения. В код неправильный. Неправильно сортирует по второй и последующим колонкам. Ну и конечно очень медленный. Ну а вдруг я потом на bitbucket.com открою репозиторий. Хоть кому-нибудь может пригодиться для тривиальных вещей. Вероятность ненулевая. Я ещё не думал над оптимизацией запроса и последующей обработкой его результата. Возможно, удастся избавиться от лишних этапов. Так-то запрос вроде по некоторым колонкам возвращает то, что мне нужно, но потом я в таблицу добавляю ещё несколько группировок. А новые строки с итогами по по этим группировкам добавляю в конец таблицы, а потом её сортирую. По идее было бы неплохо подумать над тем, чтобы не сортировать таблицу из запроса, а вставлять новые строки прямо в правильные места. Но это уже потом. В любом случае сейчас я хочу это доделать всё-таки. Пригодится это или нет мне или кому-нибудь неважно. Просто хочу доделать.
#86 by Salimbek
А можешь хоть словами описать, что у тебя в развороте первой иерархии, что во второй, что в третьей?
#87 by Mikeware
секс ради секса.
#88 by OTMOPO3OK
В первой справочник «Номенклатура», во второй «Контрагенты», в третьей тупо строка. Да это и неважно в сущности, что у меня там. Какая вообще разница? Там что угодно может быть. Секс ради удовольствия. Мне нравится, когда что-то получается, пусть даже это на твой взгляд чепуха. Я вот когда это сделаю (а осталось немного), тогда уже буду думать, потратил я время зря или нет, и в будущем возможно освою твой мегасуперметод с квериконсолью.
#89 by Mikeware
твой метод требует очень много лишних сил и движений. по сути, ты пытаешьс сделать предпросчитанный куб. Т.е. то, что делает, скажем, ms analysis services. Средствами 1с - это долго и нерационально, и до конца (с разумной мерностью, и за вменяемое время) сделано не будет.
#90 by OTMOPO3OK
Так я же пишу простенькую библиотеку. Для простых случаев с относительно небольшим количеством измерений вполне подойдёт. Конечно, если удастся что-то сделать со скоростью. Вот я честно пытался твой метод использовать. Запустил пример, и он у меня не заработал. Прописал внутри загрузку 1CPP.dll, он заработал, но выдал ошибку, связанную vfoxsqlprovider. Скачал, установил, запустил, получил ошибку, связанную с metainfoчто-то. Поэтому я погрустнел и отложил до лучших времён.
#91 by uno-group
Все не читал но на вскидку создаем дубли всех колонок которые подлежат сортировке и в них пишем полный код и сортируем по этим колонкам.
#92 by OTMOPO3OK
Опять же прошу прощения. Код в правильный. Разве что процедура _кк_ОтфильтроватьТаблицу некорректно работала, но её код я не приводил. А всё дело в том, что после очередного рефакторинга этой процедуры, она регрессировала. Без юнит-тестирования очень плохо, оказывается. Видишь, какой прогресс. Благодаря этой задаче я освоил несколько вещей, полезных для разработки, даже если сама эта задача бессмысленна. А вот сейчас об юнит-тестировании в 1С задумался.
#93 by ADirks
Как пример практического применения можно скачать исходники 1С++ - там база юнит-тестов немаленькая.
#94 by OTMOPO3OK
Спасибо за полезную информацию.
#95 by OTMOPO3OK
Как смог, улучшил быстродействие. Что-то мне подсказывает, что можно ещё лучше, но на первых порах и так сойдёт:
#96 by OTMOPO3OK
Товарищи, я тут решил улучшить эту сортировку. Сделал её (с одним примечанием: она пока не работает с неопределёнными значениями в случае, если группировка с группами) гораздо более красивой и логичной. Но у меня возникла небольшая проблема. 1С говорит: «Недостаточно свободной оперативной памяти на этом компьютере». Это было бы логично, учитывая, что здесь использована рекурсия, но в сортируемой таблице всего 2к с лишним строк и всего четыре группировки, из которых всего лишь две первые с группами, остальные плоские. Как освобождать память в 1С 7.7, кто знает? Вот сижу уже час думаю, а в голову ничего не приходит. ////////////////////////////////////////////////////////////////////////////////
#97 by OTMOPO3OK
Предполагается, что этот вариант должен работать гораздо быстрее предыдущего. Если бы не нехватка памяти. Чего её не хватает? Табличка ведь маленькая. Ну, в общем вот так.
#98 by OTMOPO3OK
А, пардон, товарищи, этот код работает, оказывается. Просто я для второй группировки с группами не включил настройку "СГруппами". Единственное, что теперь нужно, чтобы он с неопределёнными значениями работал. Ну, это дело техники.
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С