Особенности сортировки в таблице значений
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
В тех случаях, когда для таблицы значений применяется сортировка по колонкам, содержащим ссылочные значения, необходимо учитывать, что при этом для каждой из этих колонок для всех строк таблицы значений системой будет выполнено обращение к информационной базе за представлением этой ссылки.
- В тех случаях, когда требуется сортировка по наименованию – сразу, на этапе заполнения, добавлять в таблицу дополнительные колонки с представлениями, и сортировку выполнять уже по ним. Если, конечно, это не вызовет аналогичных многократных обращений к информационной базе;
- В остальных случаях – сортировать «по ссылке», а не по представлению. Для этого в методе Сортировать следует использовать объект СравнениеЗначений :
ОбъектСравнения = Новый СравнениеЗначений;
ТаблицаДокументов.Сортировать(«Дата,Ссылка», ОбъектСравнения);
Особенно это важно для таблиц с большим количеством (несколько сотен и тысяч) строк, в алгоритмах критических ко времени исполнения.
См. также
ТаблицаЗначений
Метод Сортировать()
Метод Сортировать() cортирует строки таблицы значений в соответствии с указанными правилами сортировки. Порядок указания имен колонок таблицы определяет порядок сортировки. Это означает, что сначала таблица сортируется по колонке, указанной первой. Затем группы строк с одинаковым значением в первой колонке сортируются по колонке, которая указана второй, и так далее.
Если параметр ОбъектСравнения не задан, значения простых типов сравниваются по значению, а значения остальных типов — по строковому представлению.
Если параметр ОбъектСравнения задан, значения простых типов также сравниваются по значению, а значения остальных типов — по правилам:
- объекты сравниваются по идентификатору
- моменты времени сравниваются по дате и идентификатору объекта
- остальные значения сравниваются по строковому представлению
Доступность
| Версия | Поддержка |
|---|---|
| 8.1 | Сервер, Клиент, Внешнее соединение |
| 8.2 | Сервер, Толстый клиент, Внешнее соединение |
| 8.3 | Сервер, Толстый клиент, Внешнее соединение, Мобильный автономный сервер, Мобильное приложение |
Пример использования
Пример кода с использованием метода Сортировать() :
//создание таблицы тз = Новый ТаблицаЗначений; тз.Колонки.Добавить("Значение"); тз.Колонки.Добавить("Тип"); //заполнение НоваяСтрока = тз.Добавить(); НоваяСтрока.Значение = 1; НоваяСтрока.Тип = ТипЗнч(НоваяСтрока.Значение); НоваяСтрока = тз.Добавить(); НоваяСтрока.Значение = "1"; НоваяСтрока.Тип = ТипЗнч(НоваяСтрока.Значение); НоваяСтрока = тз.Добавить(); НоваяСтрока.Значение = 1.1; НоваяСтрока.Тип = ТипЗнч(НоваяСтрока.Значение); //сортировка тз.Сортировать("Значение", Новый СравнениеЗначений); //проверка результата тз.ВыбратьСтроку("Результат сортировки");
Читайте также:
Как упорядочить таблицу значений 1с
Добрый вечер! Вобщем вот в чём задача: есть отобранные в таблицу значений ссылки на документы, моменты времени и кое-какие другие данные, есть необходимость сортировать ТЗ по моменту времени. КАК это сделать, может подскажет кто. слышал что сортировкой таблицы значений (.Сортировать(«МоментВремени»)) не катит.
Сортируй в запросе
Мне важно менять в Таблице Значений кое какие данные, в том числе для строк задавать новый момент времени и сортировать после изменений. Хотел передавать ТЗ через параметр в запрос и там сортировать и выгружать обратно, но ругается на момент времени : Тип не возможно использовать в запросе. Поискал в интернете такая ошибка выдается когда ТЗ не типизирована, но у меня таблица значений типизирована так как выгружается из запроса.
(2) ссылку на документ передавай, у документов есть реквизит МоментВремени
(3) Однако голова!
Сортировать по дате и ссылке
(4) а, ну да, точно, его ж нельзя в запросе-то использовать. Как-то я об этом не подумал.
из таблицы значений через ссылку реквизиты объекта не вытаскиваются пишет, ругается на этот элемент «Поле не найдено СсылкаНаРегистратор.МоментВремени».
(6) по моменту можно сортировать в запросе
+(6) хотя нет, нормально всё сортируется
(7) а это потому, что таблица должна быть типизированной
Момент времени это дата и индетификатор по сути
поэтому (5)
но из таблицы значений он отказывается МоментВремени использовать. Полностью типизирована,тк ТЗ которую передаю в прараметр сортирующего запроса, выгружаю из запроса и пока ещё без всяких изменений как она есть экспериментирую, тоесть ТЗ типизирована.
всмысле в запросе отказывается МоментВремени использовать в запросе, когда передаем туда таблицу значений через параметр.
Можно сортировать ТЗ по колонке момент времени, использовать СравнениеЗначений
ТаблицаЗначений (ValueTable)
Сортировать (Sort)
Синтаксис:
Сортировать(, )
Параметры:
(обязательный)
Тип: Строка. Список имен колонок, разделенных запятыми, по которым производится сортировка таблицы. После каждого имени колонки через пробел может быть указано направление сортировки. Направление определяется: «Убыв» («Desc») — упорядочивать по убыванию; «Возр» («Asc») — упорядочивать по возрастанию. По умолчанию сортировка производится по возрастанию. Порядок указания имен колонок таблицы определяет порядок сортировки. Это означает, что сначала таблица сортируется по колонке, указанной первой. Затем группы строк с одинаковым значением в этой колонке сортируются по колонке, которая указана второй, и так далее.
(необязательный)
Тип: СравнениеЗначений. Объект для сравнения значений. Независимо от того, задан объект сравнения или нет, элементы, чьи типы не совпадают, сравниваются по коду типа, а элементы простых типов сравниваются по значению. Дополнительно к этому:
если объект сравнения не задан, то элементы остальных типов сравниваются по строковому представлению;
если объект сравнения задан, то:
объекты сравниваются по идентификатору;
моменты времени сравниваются по дате и идентификатору объекта;
элементы остальных типов сравниваются по строковому представлению.
Если сортировать так ТЗ.Сортировать(«МоментВремени») то получается совсем ни то.
ТЗ.Сортировать(«МоментВремени», Новый СравнениеЗначений)
МоментВремени (PointInTime)
Описание:
Предназначен для получения и хранения момента времени для объекта в базе данных. Содержит дату и время(!), а также ссылку(!) на объект базы данных.
тость в объект сравнения передаем пустой обьект типа СравнениеЗначений?
Да, тут допустим я обойду, но в дальнейшем мне всё же необходимо передача этой ТЗ с моментов времени в запрос, но я так понимаю это нереально.
(18) [если объект сравнения задан, то: . моменты времени сравниваются по дате и идентификатору объекта; ]
Как упорядочить таблицу значений 1с
Описание:
Таблица значений — это несохраняемый в базе данных объект, который позволяет строить динамические наборы значений и манипулировать ими (добавлять, редактировать, удалять элементы, сортировать). Он может быть наполнен значениями любого типа, т.е. в одной таблице типы хранимых значений могут быть разными. Одним из примеров использования данного объекта может служить организация представления в форме списка элементов справочника, отобранных по сложному алгоритму.
Необходимо отметить, что таблица значений, связанная с элементом управления ТабличноеПоле, будет иметь все колонки, имеющиеся в табличном поле, с соответствующими именами. Кроме того, таблица значений может иметь также и собственные колонки, не отображаемые в табличном поле, при этом их имена должны отличаться от имен колонок табличного поля.
Элементы коллекции: СтрокаТаблицыЗначений
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора [. ]. В качестве аргумента передается индекс строки (нумерация с 0).
Свойства:
| Индексы | Содержит коллекцию индексов таблицы значений. |
| Колонки | Содержит коллекцию колонок таблицы значений. |
Методы:
| Вставить (Индекс) | Вставляет строку на позицию в таблице значений, соответствующую указанному индексу. Возвращает вставленную строку. |
| ВыбратьСтроку (Заголовок, НачальнаяСтрока) | Вызывает модальное диалоговое окно для интерактивного выбора строки из таблицы значений. Возвращает выбранную строку или Неопределено, если пользователь отказался от выбора. |
| ВыгрузитьКолонку (Колонка) | Создает массив и копирует в него значения, содержащиеся в колонке таблицы значений. Возвращает этот массив. |
| Добавить () | Добавляет строку в конец таблицы значений. Возвращает добавленную строку. |
| ЗагрузитьКолонку (Массив, Колонка) | Загружает колонку таблицы значений из массива значений. |
| ЗаполнитьЗначения (Значение, Колонки) | Заполняет все строки таблицы значений указанным значением. |
| Индекс (Строка) | Получает индекс строки в коллекции строк таблицы значений. Если не найдено, то возвращается -1. |
| Итог (Колонка) | Суммирует значения всех строк в указанной колонке. Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число. Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться. Если в колонке несколько типов и среди них есть тип Число, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться. Если в колонке несколько типов и среди них нет типа Число, то результатом будет значение Неопределено. |
| Количество () | Получает количество строк таблицы значений. |
| Найти (Значение, Колонки) | Осуществляет поиск значения в указанных колонках таблицы значений. Возвращает строку, в которой содержится искомое значение. Если значение не найдено, то возвращается значение Неопределено. |
| НайтиСтроки (ПараметрыОтбора) | Осуществляет поиск строк таблицы значений, отвечающих заданным условиям поиска. Возвращает массив строк таблицы значений, соответствующих условиям поиска. Замечание! Массив хранит ссылки на строки таблицы значений, то есть при изменении строки в таблице, значение в массиве тоже будет измененным. |
| Очистить () | Удаляет все строки таблицы значений. Структура колонок остается неизменной. |
| Получить (Индекс) | Получает значение по индексу. Работает аналогично оператору []. |
| Свернуть (КолонкиГруппировок, КолонкиСуммирования) | Осуществляет свертку таблицы значений по указанным колонкам группировки. Строки, у которых совпадают значения в колонках, указанных в первом параметре, сворачиваются в одну строку. Значения этих строк, хранящиеся в колонках, указанных во втором параметре, накапливаются. Важно! Списки колонок не должны пересекаться. Колонки, не вошедшие ни в один из списков колонок, после выполнения метода удаляются из таблицы значений. |
| Сдвинуть (Строка, Смещение) | Сдвигает строку на указанное количество позиций. |
| Скопировать (Строки, Колонки) | Если указаны строки и колонки, то только они будут скопированы. Если не указаны, то будет создана полная копия таблицы значений. |
| СкопироватьКолонки (Колонки) | Создает таблицу значений с заданным списком колонок. |
| Сортировать (Колонки, ОбъектСравнения) | Сортирует таблицу значений в соответствии с указанными правилами сортировки. |
| Удалить (Строка) | Удаляет строку таблицы значений, где Строка — индекс или сама строка. |
Конструктор:
| Новый ТаблицаЗначений |
Оглавление (нажмите, чтобы раскрыть)
- Как создать таблицу значений
- Как добавить колонки в таблицу значений
- Как добавить строки в таблицу значений
- Как добавить в таблицу значений колонку с описанием типа и заголовка
- Как перечислить все строки в таблице значений
- Как перечислить все колонки в таблице значений
- Как выгрузить колонку таблицы значений в массив
- Как заполнить значения в колонке для всех строк таблицы значений
- Как в таблице значений посчитать итог по колонке
- Как найти строку в таблице значений по значению
- Как найти строку в таблице значений поиском значения в определенных колонках
- Как искать в таблице значений неуникальные значения
- Как сдвинуть строку таблицы значений
- Как создать копию таблицы значений
- Как создать копию таблицы значений по нужным колонкам
- Как создать копию таблицы значений по отбору
- Как свернуть таблицу значений по колонке
- Как отсортировать таблицу значений по колонке
- Как отсортировать таблицу значений по нескольким колонкам
- Как удалить строку из таблицы значений
- Как программно вывести таблицу значений на форму
- Как программно вывести на форму результат запроса в виде таблицы значений
- Скачать и выполнить эти примеры на компьютере
&НаСервере Процедура ВыполнитьКодНаСервере() /// Как создать таблицу значений в 1с 8.3, 8.2 // с таблицей значений можно работать только на сервере Таб = Новый ТаблицаЗначений; /// Как добавить колонки в таблицу значений в 1с 8.3, 8.2 Таб.Колонки.Добавить("Фрукт"); Таб.Колонки.Добавить("Цвет"); Таб.Колонки.Добавить("Вкус"); /// Как добавить строки в таблицу значений в 1с 8.3, 8.2 Стр = Таб.Добавить(); Стр.Фрукт = "Яблоко"; Стр.Цвет = "Зелёный"; Стр.Вкус = "Кислый"; Стр = Таб.Добавить(); Стр.Фрукт = "Банан"; Стр.Цвет = "Желтый"; Стр.Вкус = "Сладкий"; Стр = Таб.Добавить(); Стр.Фрукт = "Слива"; Стр.Цвет = "Синий"; Стр.Вкус = "Терпкий"; /// Как добавить в таблицу значений колонку с /// описанием типа и заголовка в 1с 8.3, 8.2 ОписаниеВеса = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(12, 3)); Таб.Колонки.Добавить("ВесФрукта", ОписаниеВеса, "Вес фрукта"); Таб[0].ВесФрукта = 100.005; Таб[1].ВесФрукта = 60.010; Таб[2].ВесФрукта = 25.000; /// Как перечислить все строки в таблице значений в 1с 8.3, 8.2 Для Каждого Стр Из Таб Цикл Сообщить(Стр.Фрукт + " " + Стр.Цвет + " " + Стр.Вкус + " " + Стр.ВесФрукта); КонецЦикла; /// Как перечислить все колонки в таблице значений /// в 1с 8.3, 8.2 Для Каждого Колонка Из Таб.Колонки Цикл Сообщить(Колонка.Имя); КонецЦикла; /// Как выгрузить колонку таблицы значений в массив в 1с 8.3, 8.2 // выгрузка названий фруктов в массив МассивФруктов = Таб.ВыгрузитьКолонку("Фрукт"); // ничего не измениться, так как массив не менялся Таб.ЗагрузитьКолонку(МассивФруктов, "Фрукт"); /// Как заполнить значения в колонке для всех строк таблицы /// значений в 1с 8.3, 8.2 // обнулим вес во всех строках Таб.ЗаполнитьЗначения(0, "ВесФрукта"); // выставим новые веса Таб[0].ВесФрукта = 100; Таб[1].ВесФрукта = 60; Таб[2].ВесФрукта = 25; /// Как в таблице значений посчитать итог по колонке в 1с 8.3, 8.2 Сообщить(Таб.Итог("ВесФрукта")); // 185 /// Как найти строку в таблице значений по значению в 1с 8.3, 8.2 // найдём строчку с яблоком и покажем его цвет НайденнаяСтрока = Таб.Найти( "Яблоко" ); Если НайденнаяСтрока <> Неопределено Тогда Сообщить(НайденнаяСтрока.Цвет); // Зелёный КонецЕсли; /// Как найти строку в таблице значений поиском значения /// в определенных колонках в 1с 8.3, 8.2 // будем искать по слову "Кислый" в колонках вкус и цвет НайденнаяСтрока = Таб.Найти("Кислый", "Вкус, Цвет"); Если НайденнаяСтрока <> Неопределено Тогда Сообщить(НайденнаяСтрока.Фрукт); // Яблоко КонецЕсли; // добавим ещё один зелёный фрукт Стр = Таб.Добавить(); Стр.Фрукт = "Киви"; Стр.Цвет = "Зелёный"; Стр.Вкус = "Сладкий"; Стр.ВесФрукта = 30; /// Как искать в таблице значений неуникальные значения /// в 1с 8.3, 8.2 Отбор = Новый Структура; Отбор.Вставить("Цвет", "Зелёный"); Строки = Таб.НайтиСтроки(Отбор); Для Каждого Стр Из Строки Цикл Сообщить(Стр.Фрукт); // Яблоко Киви КонецЦикла; /// Как сдвинуть строку таблицы значений в 1с 8.3, 8.2 // сдвигаем первую строку на одну позицию вперёд Таб.Сдвинуть(0, 1); // и возвращаем обратно Таб.Сдвинуть(1, -1); /// Как создать копию таблицы значений в 1с 8.3, 8.2 // полная копия КопияТаб = Таб.Скопировать(); /// Как создать копию таблицы значений по нужным колонкам /// в 1с 8.3, 8.2 // только две колонки будет Фрукт и Цвет КопияТаб = Таб.СкопироватьКолонки("Фрукт, Цвет"); /// Как создать копию таблицы значений по отбору в 1с 8.3, 8.2 Отбор = Новый Структура; Отбор.Вставить("Фрукт", "Яблоко"); // таблица будет содержать только строчку с яблоком КопияТаб = Таб.Скопировать(Отбор); // таблица будет содержать цвет и вес яблока КопияТаб = Таб.Скопировать(Отбор, "Цвет, ВесФрукта"); /// Как свернуть таблицу значений по колонке в 1с 8.3, 8.2 // свернём по вкусу, просуммируем по весу Таб.Свернуть("Вкус", "ВесФрукта"); /// Как отсортировать таблицу значений по колонке в 1с 8.3, 8.2 Таб.Сортировать("ВесФрукта Возр"); /// Как отсортировать таблицу значений по нескольким колонкам /// в 1с 8.3, 8.2 Таб.Сортировать("ВесФрукта Возр, Вкус Убыв"); /// Как удалить строку из таблицы значений в 1с 8.3, 8.2 // по индексу или по значению Таб.Удалить(0); КонецПроцедуры /// Как программно вывести таблицу значений на /// форму в 1с 8.3, 8.2 // см. примеры использования этой функции ниже // ТабВКоде - таблица значений, созданная программно // ТабРеквизит - имя реквизита формы типа ТаблицаЗначений // ТабНаФорме - имя элемента формы, связанного с ТабРеквизит &НаСервере Процедура ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, ТабРеквизит, ТабНаФорме) // реквизит ТабРеквизит и соответствующий // ему элемент формы ТабНаФорме уже созданы // нами в визуальном режиме // 1. добавляем колонки из ТабВкоде в реквизит ТабРеквизит НовыеРеквизиты = Новый Массив; Для Каждого Колонка Из ТабВКоде.Колонки Цикл НовыеРеквизиты.Добавить( Новый РеквизитФормы( Колонка.Имя, Колонка.ТипЗначения, ТабРеквизит ) ); КонецЦикла; ИзменитьРеквизиты(НовыеРеквизиты); // 2. добавляем колонки из ТабВКоде в элемент ТабНаФорме Для Каждого Колонка Из ТабВКоде.Колонки Цикл НовыйЭлемент = Элементы.Добавить( ТабРеквизит + "_" + Колонка.Имя, Тип("ПолеФормы"), Элементы[ТабНаФорме] ); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = ТабРеквизит + "." + Колонка.Имя; КонецЦикла; // 3. наконец, передаём данные из ТабВКоде в ТабРеквизит ЗначениеВРеквизитФормы(ТабВКоде, ТабРеквизит); // готово! КонецПроцедуры &НаСервере Процедура СоздатьТаблицуНаФормеНаСервере() // программно создаём таблицу значений ТабВКоде ТабВКоде = Новый ТаблицаЗначений; ОписаниеСтроки = Новый ОписаниеТипов("Строка"); ОписаниеВеса = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(12, 3)); ТабВКоде.Колонки.Добавить("Фрукт", ОписаниеСтроки, "Имя фрукта"); ТабВКоде.Колонки.Добавить("Цвет", ОписаниеСтроки, "Цвет фрукта"); ТабВКоде.Колонки.Добавить("Вес", ОписаниеВеса, "Вес фрукта"); Стр = ТабВКоде.Добавить(); Стр.Фрукт = "Яблоко"; Стр.Цвет = "Зелёный"; Стр.Вес = 200; Стр = ТабВКоде.Добавить(); Стр.Фрукт = "Банан"; Стр.Цвет = "Желтый"; Стр.Вес = 150; ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, "ТабРеквизит1", "ТабНаФорме1"); КонецПроцедуры /// Как программно вывести на форму результат запроса /// в виде таблицы значений в 1с 8.3, 8.2 &НаСервере Процедура ВывестиНаФормуРезультатЗапросаНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Товары.Ссылка, | Товары.ВерсияДанных, | Товары.ПометкаУдаления, | Товары.Код, | Товары.Наименование, | Товары.Цвет, | Товары.ЕдиницаИзмерений, | Товары.Предопределенный, | Товары.ИмяПредопределенныхДанных |ИЗ | Справочник.Товары КАК Товары"; РезультатЗапроса = Запрос.Выполнить(); ТабВКоде = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.Прямой); // функция ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме определена выше ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, "ТабРеквизит2", "ТабНаФорме2"); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере
Таблица значений в языке 1С 8.3, 8.2 (в примерах)
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).