Проверить заполнение ячеек таблицы значений без перебора #795532


#0 by Dmitriy_Kolesnikov
Подскажите, как красиво решить задачу. Есть ТЗ с большим количеством колонок (они формируются динамически, количество всегда разное) Мне надо узнать для каждой строки: заполнена ли хотя бы одна ячейка этой строки, начиная с пятой (например) колонки. Как это сделать красиво, не перебирая в цикле все колонкиячейки подряд? Все значения типа число.
#1 by Любопытная
А как формируются колонки? В процессе формирования считать сумму всех ячеек по строке и отсеивать те, где сумма = 0.
#2 by Dmitriy_Kolesnikov
сначала формируется таблица и выводится в табличное поле формы. Потом юзер её заполняет числами. И только потом я должен проанализировать, что он там навводил. Как посчитать сумму всех ячеек по строке, начиная с пятой, не перебирая циклом все ячейки?
#3 by Любопытная
забирай ее в запрос и в запросе выкидывай строки, в которых везде нули
#4 by Любопытная
Только колонки должны быть типизированы для запроса
#5 by youalex
Можно использовать Вычислить, но не уверен, что будет быстрее.
#6 by mistеr
Что за аллергия на циклы? Что-то весеннее?
#7 by Dmitriy_Kolesnikov
некрасиво и громоздко. Почему я могу посчитать итог колонки одной строкой без цикла, но не могу посчитать итог строки?
#8 by Dmitriy_Kolesnikov
как мне определить в запросе, что в таблице нули во всех колонках?
#9 by Dmitriy_Kolesnikov
Но тут тоже вложенный цикл, громоздко и некрасиво.
#10 by Buster007
А не громоздко это как?
#11 by mistеr
>посчитать итог колонки одной строкой без цикла "Наивный чукотский юноша" (с)
#12 by Buster007
+ 7 строк кода это громоздко?
#13 by mistеr
Ну напиши функцию, чтоб было красиво.
#14 by undertaker
сделать массив по количеству строк, по умолчанию там нули, в элемент массива по номеру строки при изменении в ячейке если не 0, то писать 1, потом анализировать массив
#15 by lodger
ха. ну подумай логически, тебе нужно от платформы узнать где что введено в таблице. угадай как она будет искать твои значения? правильно. циклом. только вот платформенные функции с ограниченными циклами во имя универсальности или заточенности под определенную задачу, типа как НайтиСтроки. так что громозди свой Для Каждого Цикл.
#16 by Ildarovich
Если числа в таблице - положительные, а строки - пронумерованы (ведь это табличное поле формы), то можно: 1) добавить в конец таблицы строку с нулями - образцовую незаполненную строку; 2) отсортировать ТЗ по колонкам, начиная с пятой, и далее -  по колонке с номером; 3) найти номер Х образцовой строки в отсортированной таблице; 4) признаком заполненности строки будет то, что ее номер в отсортированной таблице будет больше Х. Все это можно сделать, не используя ни одного цикла.
#17 by Ildarovich
+ Если числа могут быть и отрицательными, то придется добавлять ограничивающие строки и в начало и в конец таблицы. Незаполненные строки тогда окажутся между ограничивающими после соответствующей сортировки.
#18 by Неверный Параметр И
Не хочешь циклы - пиши флаги в момент ввода. Ввел пользователь что-то в 6ю колонку, значит после 5й что-то есть.
#19 by Злопчинский
+100
#20 by skafandr
+500
#21 by lodger
ни одного объявленного в коде цикла. зато неявных сразу 2 (это еще неизвестно каким образом платформа проводит сортировку по множеству колонок, может там циклы в цикле)
#22 by Ildarovich
++ Все, наверное, еще гораздо проще. Незаполненные строки легко найти отбором по структуре А то, что предлагается делать в в момент ввода значения, можно сделать по указанному отбору методом ЗаполнитьЗначения. ...это еще неизвестно... ...может там циклы в цикле... Практика показывает, что платформенная сортировка - быстрая операция. Обгоняет любой цикл.
#23 by Ildarovich
А вообще вопрос интересный. По поводу сортировки. Его можно переформулировать так: как быстрее найти минимум в колонке большой таблицы значений: через сортировку и выбор значения из первой строки отсортированной таблицы или путем обхода таблицы типа: Кто-нибудь знает ответ?
#24 by lodger
#25 by Ildarovich
+ В общем, эксперименты "на коллайдере" показали, что сортировка (из-за N Log N) начинает явно проигрывать циклу, начиная с таблиц размером 20 тысяч строк. Это к тому, что для небольших таблиц (а пользователь вряд-ли будет в диалоге работать с очень большой таблицей) прием из вполне рабочий. Другое дело, что еще лучше и проще. Ну и более общий вывод, который можно сделать после экспериментов, что вопрос эффективности в данном случае не является актуальным: любой метод поиска пустых строк в ТЗ и с циклом и без цикла работает достаточно быстро, чтобы оператор не замечал этого времени и оптимизации не требовалось.
#26 by Вафель
сортировка тз однако совсем не дешевая операция
#27 by Dmitriy_Kolesnikov
"Не хочешь циклы - пиши флаги в момент ввода. Ввел пользователь что-то в 6ю колонку, значит после 5й что-то есть" - уже плавали. Всё хорошо, пока вы просто изменяете значения ячеек. Но как только вы начинаете добавлять и удалять строки - Элемент.ТекущаяСтрока начинает приобретать самые разные значения. То строка до удалённой, то после. И когда вы флагу в этой самой текущей строке начинаете что-то присваивать, то это не имеет отношения к реальности. &НаСервере
#28 by Ildarovich
Из непонятно, подошел ответ из или нет? Там предлагалось сформировать структуру: и находить незаполненные строки методом Структуру можно заполнить один раз при формировании колонок формы и хранить как переменную формы. Кажется, что это как раз то, что нужно. Или нет?
#29 by Dmitriy_Kolesnikov
не подошел, потому что на самом деле: 1. Надо находить строки не только с нулевым значением, но и с -1. То есть либо 0, либо -1. 2. Количество колонок очень большое (около 60), и чтобы их засунуть в структуру отбора, всё равно нужен цикл. 3. Параллельно можнонужно ещё засовывать данные в некую структуру. В итоге сделал двойной цикл.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

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