Найти строку с максимальной суммой 1с
Поиск в коллекциях значений
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. При двух и более операциях поиска в объекте ТаблицаЗначений с большим количеством строк (*) рекомендуется:
- Индексировать колонки, по которым выполняется поиск;
- Но только те из них, которые обладают хорошей селективностью (т.е. каждому значению этой колонки должно соответствовать небольшое количество строк). В противном случае, индексирование не даст эффекта, либо он будет отрицательным (потрачено лишнее время на индексирование).
* Примечание: следует ориентироваться на 1000 строк и более, а также учитывать не только размер таблицы, в которой выполняется поиск, но и сколько раз он выполняется. Например, даже если таблица относительно небольшая в 100 строк, но поиск по ней выполняется 100 раз, ее тоже имеет смысл индексировать. В то же время, нет смысла индексировать таблицу из-за только одной единственной операции поиска.
2. Для поиска значений предусмотрены два метода объекта ТаблицаЗначений :
При поиске значения в одной колонке таблицы значений оба метода одинаково эффективно используют индекс, если он был задан (см. п.1).
Однако при поиске значения сразу по нескольким (или по всем) колонкам необходимо учитывать следующие ограничения.
2.1. Не следует использовать метод Найти для поиска по нескольким колонкам в таблицах значений с большим количеством строк, даже если проиндексированы все колонки, обладающие хорошей селективностью. Это ограничение вызвано тем, что метод Найти выполняет поиск с применением индекса только по одному полю.
Например:
ТЗ.Индексы.Добавить("Колонка1");
ТЗ.Индексы.Добавить("Колонка2");
. = ТЗ.Найти("найдется все", "Колонка1, Колонка2"); // Индекс НЕ используется!
В этом примере, несмотря на наличие индекса для колонок Колонка1 и Колонка2 , поиск все равно будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).
2.2. При использовании метода НайтиСтроки в таблицах значений с большим количеством строк следует обеспечить, чтобы список полей индекса был точно таким же, как он задан в структуре поиска (порядок полей не важен). В противном случае, индекс не будет задействован, и поиск будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).
Например:
ТЗ.Индексы.Добавить("Колонка1"); // Индекс1
ТЗ.Индексы.Добавить("Колонка2"); // Индекс2
. = ТЗ.НайтиСтроки(Новый Структура("Колонка1, Колонка2 ", "Ищу1","Ищу2")); // Индекс НЕ используется!
. = ТЗ.НайтиСтроки(Новый Структура("Колонка1", "Ищу1") ); // OK - используется Индекс1
. = ТЗ.НайтиСтроки(Новый Структура("Колонка2", "Ищу2") ); // OK - используется Индекс2
. = ТЗ.НайтиСтроки(Новый Структура("Колонка1, Колонка2", "Ищу1","Ищу2")); // OK - индекс используется
. = ТЗ.НайтиСтроки(Новый Структура("Колонка2, Колонка1", "Ищу2","Ищу1")); // OK - индекс используется
. = ТЗ.НайтиСтроки(Новый Структура("Колонка1", "Ищу1") ); // Индекс НЕ используется!
. = ТЗ.НайтиСтроки(Новый Структура("Колонка2", "Ищу2") ); // Индекс НЕ используется!
2.3. Аналогичное ограничение действует и для метода Скопировать таблицы значений при вызове с параметром ПараметрыОтбора ( Структура ).
3. В тех случаях, когда для таблицы значений применяется сортировка по колонкам, содержащим ссылочные значения, необходимо учитывать, что при этом для каждой из этих колонок для всех строк таблицы значений системой будет выполнено обращение к информационной базе за представлением этой ссылки.
- В тех случаях, когда требуется сортировка по наименованию – сразу, на этапе заполнения, добавлять в таблицу дополнительные колонки с представлениями, и сортировку выполнять уже по ним. Если, конечно, это не вызовет аналогичных многократных обращений к информационной базе;
- В остальных случаях – сортировать «по ссылке», а не по представлению. Для этого в методе Сортировать следует использовать объект СравнениеЗначений :
ОбъектСравнения = Новый СравнениеЗначений;
ТаблицаДокументов.Сортировать("Дата,Ссылка", ОбъектСравнения);
Особенно это важно для таблиц с большим количеством (несколько сотен и тысяч) строк, в алгоритмах критических ко времени исполнения.
3.1. При поиске в объекте Массив с большим количеством элементов(*) следует отказаться от массива в пользу:
- объекта Соответствие , если не важен порядок элементов;
- индексированной ТаблицаЗначений , если порядок элементов значим.
Это обусловлено тем, что в указанных случаях поиск занимает в большинстве случаев константное время, а в массиве поиск выполняется перебором и поэтому пропорционален количеству элементов.
* Примечание: следует ориентироваться на 1000 элементов и более, а также учитывать не только размер массива, но и сколько раз выполняется поиск. Например, если поиск выполняется многократно, в частности, в цикле, то эта рекомендация также действительна для массивов меньшего размера (до 1000 элементов). Особого внимания требуют универсальные механизмы, которые могут применяться на сколь угодно больших объемах данных.
3.2. При необходимости обеспечить уникальность элементов в большом массиве следует однократно в конце алгоритма вызвать функцию СвернутьМассив или процедуру ДополнитьМассив с параметром ТолькоУникальныеЗначения = Истина (модуль ОбщегоНазначения Библиотеки стандартных подсистем).
4. Аналогичный недостаток существует и у объекта ДеревоЗначений , в котором не предусмотрено индексов и поиск выполняется перебором (как в массиве). В указанных выше случаях объект ДеревоЗначений следует заменять индексированным объектом ТаблицаЗначений .
(24) Ну документооборот они так ведут. Что бы по номеру документа было видно какого вида это документ.
Зачем? Их так учат.
Зачем их так учат? Их учат, те кто так учился ране. А их тоже так учили т.д.
Когда не было электронного документооборота был поиск по каталогам и т.д как в библиотеке.
Хотя не удивлюсь, если и до сих пор учат.
(24) Второе объяснение - это независимая нумерация разных видов документов одновременно. Пропуски в нумерации не допускаются, но разные виды документов вводят и отвечают за них разные люди. При этом все кадровые документы не должны повторять номер и быть пропуски. Поэтому и ввели префиксы, суфиксы и т.д.
(24) Скоросшиватель сшивает быстро, а расшивает еще быстрее. Вот отсюда ноги и растут
Тут не нужно думать. Нужно знать, как будет сравнивать программа.
(28) Есть ещё одна причина.
Процедура нумерации подразумевает разделение бумаг с различными сроками хранения:
- Длительный: 50 или 75 лет.
- Краткосрочный: 1 или 5 лет.
Хранить весь этот хлам в архивах и дорогое и муторное занятие. Поэтому краткосрочные хранят отдельно и первой возможности утилизируют.
Но опять же это всё из библиотечного дела и хранения по каталогам.
+ к (30) В остальных документах остается нумерация без пропусков, так как изначально и не было в них документо другого вида с другим сроком хранения.
т.е. основная проблема в том что требуют некую единую уникальную нумерацию по всем кадровым документам. А по факту её нет.
(31) НЕТ и в текущей версии напишешь.
(33) Главное что бы был известен формат строки на выходе.
(31) Пусть необходимо привести номер к виду: 99999999999999/ХХ, т.е. 14 цифр номера + разделитель "/" и один символ суффикса. А по факту дополнить нулями номер, так как разделитель и один символ суффикса уже есть. Если разделитель бывает разный, то дополнить разные разделители. Если суффикс бывает длинной более одного символа, то учесть и это.
Например есть следующие номера как в (0): 100/А, 99/А, 00251200/А, 3/А. , где суффикс это всегда один символ.
Если кратко, то один алгоритм следующий.
1. Так как 14 + 1 + 1 = 16, то подготовить таблицу с цифрами от 1 до 16. Порождающий запрос на 16 - назовем это так.
2. Разбиваем строки с номерами на строки вида ниже. т.е. декартово перемножение на таблицу из 16-ти строк и беря только строку с 1 одну, с 2 одну и т.д.
Изначальный номер | НПП | символ
100/А | 1 | А
100/А | 2 | /
100/А | 3 | 0
100/А | 4 | 0
100/А | 5 | 1
100/А | 6 | 0
100/А | 7 | 0
100/А | 8 | 0
100/А | 9 | 0
100/А |10 | 0
100/А |11 | 0
100/А |12 | 0
100/А |13 | 0
100/А |14 | 0
100/А |15 | 0
100/А |16 | 0
99/А | 1 | А
99/А | 2 | /
99/А | 3 | 9
99/А | 4 | 9
99/А | 6 | 0
99/А | 5 | 0
99/А | 7 | 0
99/А | 8 | 0
99/А | 9 | 0
99/А |10 | 0
99/А |11 | 0
99/А |12 | 0
99/А |13 | 0
99/А |14 | 0
99/А |15 | 0
99/А |16 | 0
.
3. Собственно собираем обратно. Получаем на выходе для каждого номера его новый номер. Как собрать обратно у меня сразу два алгоритма в голове возникло. Так как всего 16-ть символов, то использовал бы первый:
Выбрать
.
Если много было бы, то использовал бы сложение соседних: 1+2; 3+4; 5+6; . далее перенумерация и опять сложение соседних. Десять итераций позволяет сложить 2 в десятой = строка длиной 1024 символа.
Читайте также: