1с упорядочить список значений
Список значений — это программная коллекция (объект встроенного языка), содержащая пронумерованную последовательность элементов. Каждому элементу присваивается последовательный целочисленный номер — индекс, начинающийся с нуля. По индексу можно получить или установить элемент списка значений.
Элемент списка значений
Каждый элемент списка является программным объектом ЭлементСпискаЗначений встроенного языка и содержит следующие свойства:
- Значение (Произвольный тип) — хранимое значение произвольного типа
- Представление (Строка) — представление элемента списка для пользователя
- Пометка (Булево) — значение пометки элемента в списке
- Картинка (Картинка) — картинка элемента списка для пользователя
Создание списка значений
Создание пустого списка значений выполняется с помощью оператора Новый:
Для добавления элементов в список значений используется одноименный метод СписокЗначений.Добавить():
Каждый новый элемент помещается в конец списка. Для доступа к отдельным элементам списка значений применяется операция разыменования: указывается имя переменной, объявленной как список значений, а затем, в квадратных скобках, указывается индекс элемента. Свойства полученного элемента можно использовать как слева от оператора присваивания:
Так и справа: в выражениях и в качестве параметров процедур и функций:
Границы списка значений
Как было сказано выше, левая граница списка значений постоянна и всегда равно нулю (0). Верхняя граница напрямую связана с количеством элементов в списке значений. Получить ее можно с использованием метода СписокЗначений.Количество() с последующим вычитанием 1.
Давайте рассмотрим распространенные операции со списком значений.
Перебор элементов списка значений
Для перебора (обхода) всех элементов списка значений обычно используется оператор цикла Для :
Либо оператор цикла Для Каждого :
Второй способ больше подходит для ситуации, когда нужно только последовательно перебрать все значения списка. Его использование повышает «читабельность кода».
Поиск в списке значений
Для поиска значений в списке предназначен метод СписокЗначений.НайтиПоЗначению(). Он возвращает найденный элемент списка значений, либо Неопределено , если указанного значения в списке нет.
Сортировка списка значений
Сортировка элементов в списке значений может производиться двумя способами:
Список значений 1С с натяжкой можно назвать расширенным аналогом массива 1С. Это также – набор значений (значения могут разных типов), есть поиск и сортировка значений.
В дополнение – отличия списка значений 1С от массива 1С.
В списке значений отсутствует:
- список значений 1С создается пустой, а значений добавляются потом (т.е. недоступно: Массив = Новый Массив(10))
- многомерность (хотя элементом списка значений 1С может быть другой элемент массива значений)
- метод ВГраница()
В списке значений 1С есть дополнительные возможности:
- в массиве «элемент» — это непосредсвенное значение, а в списке значений 1С «элемент» это структура со свойствами .Значение и .Представление
- каждый элемент списка значений 1С отображается в интерфейсе не по значению, а по представлению (если оно задано), которое может сильно отличаться от значения (так как задал программист)
- у каждого элемента может быть отображена картинка и «чекбокс» (квадратик для установки галочки «отмечено или нет»)
- у списка значений 1С есть метод выбора пользователем значения из списка.
Список значений 1С часто используется:
А) Как обычный массив
Б) Для работа со списком значений 1С на интерфейсе (например выбор значения в «выпадающем списке»)
В) Для отборов в интерфейсных списках (отбор по множеству значений).
Список значений 1С можно использовать для отбора в запросе полностью также, как и массив (см. пример в «Работа с массивами»).
Список значений 1С можно создать из массива:
спЗначений = Новый СписокЗначений();
спЗначений.ЗагрузитьЗначения(Массив);
Массив можно создать из списка значений 1С:
Массив = спЗначений.ВыгрузитьЗначения();
Пример — создадим список значений 1С из 2 значений:
спЗначений = Новый СписокЗначений(); //массив без фиксированного кол-ва значений
ГСЧ = Новый ГенераторСлучайныхЧисел(); //будем заполнять случайными числами
спЗначений.Добавить( ГСЧ.СлучайноеЧисло(0, 1000) );
спЗначений.Добавить( ГСЧ.СлучайноеЧисло(0, 1000) );
//цикл прохода каждого значения массива, сколько бы их ни было
Для каждого Знч из спЗначений Цикл
Сообщить(Знч.Значение); //обратите внимание – отличия от массива, обращаемся к значению «ячейки» через .Значение
КонецЦикла;
« Как стать программистом 1С » Язык 1С » Список значений 1С Сортировать по значению, Сортировать по представлению — сортировка
Список значений 1С Сортировать по значению, Сортировать по представлению — сортировка
Методы 1С СписокЗначений.СортироватьПоЗначению() и 1С СписокЗначений.СортироватьПоПредставлению() сортируют элементы списка значений.
1С СписокЗначений.СортироватьПоЗначению() выполняет сортировку на основании значений элементов элСписка.Значение. 1С СписокЗначений.СортироватьПоПредставлению() выполняет сортировку на основании пользовательского представления элемента элСписка.Представление.
Если требуется, чтобы порядок сортировки в 1С СписокЗначений.СортироватьПоЗначению и 1С СписокЗначений.СортироватьПоПредставлению был от большего к меньшему, то в параметре можно указать НаправлениеСортировки.Убыв.
При сортировке 1С СписокЗначений.СортироватьПоЗначению и 1С СписокЗначений.СортироватьПоПредставлению не забывайте о разнице сортировке чисел и строк:
- Сортировка чисел: 1, 2, 10, 11, 20, 12 (важна величина числа)
- Сортировка строк: 1, 10, 11, 12, 2, 20 (важен порядок цифры)
Пример сортировки чисел 1С СписокЗначений.СортироватьПоЗначению и 1С СписокЗначений.СортироватьПоПредставлению:
спЗначений = Новый СписокЗначений();
//значение – первый параметр, представление – второй параметр
спЗначений.Добавить(1, "1");
спЗначений.Добавить(2, "2");
спЗначений.Добавить(10, "10");
спЗначений.Добавить(11, "11");
спЗначений.Добавить(12, "12");
спЗначений.Добавить(20, "20");
спЗначений.СортироватьПоЗначению(); //сортировка по первому параметру - значению
стрЗначения = "";
Для каждого элСписка из спЗначений Цикл
Если не ПустаяСтрока(стрЗначения) Тогда
стрЗначения = стрЗначения + ", ";
КонецЕсли;
стрЗначения = стрЗначения + Строка(элСписка.Значение);
КонецЦикла;
Сообщить(стрЗначения);
//1С сообщает: 1, 2, 10, 11, 12, 20
Пример сортировки строк 1С СписокЗначений.СортироватьПоЗначению и 1С СписокЗначений.СортироватьПоПредставлению:
спЗначений.СортироватьПоПредставлению();//сортировка по второму параметру - значению
//1С сообщает: 1, 10, 11, 12, 2, 20
Пример обратной сортировки чисел 1С СписокЗначений.СортироватьПоЗначению и 1С СписокЗначений.СортироватьПоПредставлению:
спЗначений = Новый СписокЗначений();
спЗначений.Добавить(-1);
спЗначений.Добавить(-2);
спЗначений.Добавить(0);
спЗначений.Добавить(1);
спЗначений.Добавить(2);
спЗначений.СортироватьПоЗначению();
//1С сообщает: -2, -1, 0, 1, 2
спЗначений.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
//1С сообщает: 2, 1, 0, -1, -2
Пример обратной сортировки строк 1С СписокЗначений.СортироватьПоЗначению и 1С СписокЗначений.СортироватьПоПредставлению:
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: упорядочивание
Автор уроков и преподаватель школы: Владимир Милькин
Упорядочивание в запросах
Давайте напишем запрос, который получает из таблицы Справочник.Еда код и название еды:
Как всегда, выполните этот запрос у себя на компьютере.
С большой долей вероятности у вас получится следующий результат:
Возможно вы удивитесь, но при таком написании запроса никто не гарантирует нам именно такого порядка выдачи записей в таблице. В случае использования клиент-серверного режима работы на различных СУБД результат мог бы быть и такой:
И . ну в общем вы поняли, что если мы не указываем порядок сортировки (упорядочивания) результата запроса, то этот самый порядок может быть абсолютно любым.
Секция УПОРЯДОЧИТЬ ПО
Поля по которым требуется упорядочить запрос перечисляются в секции УПОРЯДОЧИТЬ ПО через запятую:
Следом за именем поля упорядочивания может идти одно из двух ключевых слов:
- ВОЗР- упорядочивание по возрастанию.
- УБЫВ - упорядочивание по убыванию.
Если не указывать ни одно из этих слов, считается, что сортировка идёт по возрастанию.
Вооружившись знаниями, давайте упорядочим результат нашего запроса по убыванию поля Код:
По возрастанию поля Наименование (алфавитный порядок):
А теперь упорядочим следующую таблицу
так, чтобы сначала шла сортировка по полю Вкус по возрастанию, а затем (среди строчек с одинаковым значением поля Вкус) шла сортировка по полю Цвет по убыванию:
Отдельно обращаю ваше внимание на то, что мы указали сортировку не по самим полям Вкус и Цвет, а по их строковому реквизиту Наименование. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Это связано с тем, что сортировка возможна лишь по полям имеющим один из типов: Строка, Число, Дата.
А поля Вкус и Цвет являются ссылками на элементы справочников Вкус и Цвет, сортировать по которым не имеет смысла (в этом случае сортировка будет вестись по внутреннему идентификатору ссылки). Зато можно сделать сортировку по одному из реквизитов этих элементов. Наиболее подходящим в нашем случае будет строковый реквизит Наименование.
Возможность автоупорядочивания
Ключевое слово АВТОУПОРЯДОЧИВАНИЕ позволяет включить режим автоматического формирования полей для упорядочивания результатов запроса.
Мы сейчас познакомимся с этой возможностью подробно, но сразу хочется оговориться, что фирма "1С" в своих методических рекомендациях не советует использовать её без необходимости (о причинах этого мы поговорим ниже).
Прежде всего, ключевое слово АВТОУПОРЯДОЧИВАНИЕ может быть расположено в запросе сразу за или вместо секции УПОРЯДОЧИТЬ ПО:
Автоупорядочивание работает по следующим принципам:
Тогда ссылка на каждую таблицу в этой секции будут заменена полями, по которым по умолчанию сортируется эта таблица.
Для таблиц справочников полями сортировки по умолчанию являются код и наименование, выбор из которых осуществляется в соответствии с настройками справочника в конфигураторе:
Для таблиц документов полем сортировки по умолчанию является дата документа.
Так как поле сортировки ЛюбимыйЦвет имеет тип Справочник.Цвета, в настройках которого основным представлением выбрано поле Наименование, то этот запрос эквивалентен:
- отсутствует секция УПОРЯДОЧИТЬ ПО
- но есть секция ИТОГИ ПО (её мы будем проходить позже)
В этом случае результат запроса будет упорядочен по полям итогов (в той же последовательности).
Если среди этих полей есть ссылки на таблицы, то они также будут заменены полями, по которым сортируются эти таблицы по умолчанию.
- отсутствует секция УПОРЯДОЧИТЬ ПО
- отсутствует секция ИТОГИ ПО
- но есть секция СГРУППИРОВАТЬ ПО (группировку мы проходили здесь)
В этом случае результат запроса будет упорядочен по полям группировки (в той же последовательности).
Если среди этих полей есть ссылки на таблицы, то они также будут заменены полями, по которым сортируются эти таблицы по умолчанию.
Так как поле группировки Город имеет тип Справочник.Города, в настройках которого основным представлением выбрано поле Наименование, то этот запрос эквивалентен:
Наконец, если в запросе:
- отсутствует секция УПОРЯДОЧИТЬ ПО
- отсутствует секция ИТОГИ ПО
- отсутствует секция СГРУППИРОВАТЬ ПО
В этом случае результат запроса будет упорядочен по полям сортировки по умолчанию для таблиц, из которых выбираются данные, в порядке их появления в запросе.
Так как данные выбираются из справочника Еда, в настройках которого основным представлением выбрано поле Наименование, то этот запрос будет эквивалентен:
Почему использование автоупорядочивания нежелательно
- для универсальных запросов, когда разработчик не может предвидеть из каких таблиц будут запрашиваться данные
- для случаев, когда получаемый порядок записей не важен, но при этом он должен быть одинаковым в независимости от применяемой СУБД
Во всех остальных случаях использовать возможность автоупорядочивания нежелательно, так как поля, которые являются полями сортировки сегодня, могут перестать быть такими завтра.
Например, сегодня мы можем написать код, чувствительный к тому, чтобы результаты запроса из справочника Еда были отсортированы по полю Наименование.
А завтра фирма "1С" (или другой разработчик) изменят настройки базы в конфигураторе так, что полем сортировки по умолчанию для справочника Еда станет, к примеру, поле Код. И, если мы использовали автоупорядочивание в запросе, то наш отчет сломается, ведь порядок сортировки уже будет другим. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Поэтому всегда старайтесь указывать конкретные поля и конкретный порядок сортировки по ним в секции УПОРЯДОЧИТЬ ПО, такой запрос уже не сломать просто так:
В процедуру ПриОткрытии или в конец модуля добавить:
Код 1C v 8.х
Где НомерСоглашения - Колонка в списке регистра сведений по которой нужно сортировать!
Далее щелкнув правой клавишей мыши на списке и зайдя в пункт Сортировка - увидим что стала доступна возможность сортировки по НомерСоглашения.
Как отсортировать список документов по признаку ПРОВЕДЕН?
Код 1C v 8.х
Сортировка динамических списков (ЖурналДокументовСписок)
Добавлять элементы настройки порядка в динамические списки нельзя.
Если индексирование для графы установлено, то соответсвующий элемент настройки порядка уже есть, надо его просто включить:
Код 1C v 8.х
При открытии, журнал будет упорядочен!
Похожие FAQ
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ В регламентированной отчетности не печается штрих-код 1С ( EanGnivc ) 0
Установка шрифта EanGnivc В формах регламентированной отчетности, например, налоговые декларации, которые введены для предоставления отчетности, на всех листах в левом верхнем углу содержат свой уникальный штрих-код. В этих формах, которые распрос В чем разница между ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ в языке запросов 1С 10
Цитата из справки 1С: " По умолчанию при объединении запросов полностью одинаковые строки в результате запроса, сформированные РАЗНЫМИ запросами, заменяются одной . Если требуется, чтобы были оставлены разные строки, необходимо указать ключевое Внешние обработки, печатные формы, обработки по заполнению табличных частей 3
Справочник «Внешние обработки, печатные формы, обработки по заполнению табличных частей» содержит список произвольных обработок, произвольных отчетов, дополнительных печатных форм, обработок для заполнения ТЧ объектов, обработок, подключаемых к отч Выгрузка результата запроса в Таблицу и Дерево значений 0
Результат запроса может быть выгружен в таблицу значений или дерево значений с помощью метода Выгрузить. Затем над ними могут быть произведены другие операции: сортировка, свертка, перебор строк и другие действия. Следующий пример выгружает результ Посмотреть все результаты поиска похожих
Еще в этой же категории
Как в форме списка реализовать сортировку по своему реквизиту? 12
Если реквизит примитивного типа, то достаточно установить для свойства реквизита «Индексировать» значение «Индексировать» или «Индексировать с доп. упорядочиванием» (не доступно для реквизитов типа ХранилищеЗначения). Если же реквизит ссылочного типа Оформление строки в ПриПолученииДанных или ПриВыводеСтроки 7
Событие ПриПолученииДанных использется для оформления ячеек строк данных, отображаемых табличным полем. Обработчик данного события вызывается табличным полем в тех же случаях, что и обработчик ПриВыводеСтроки , т.е. при обновлении данных, отображ Табличное поле ~ Как получить строки табличного поля, отобранные отбором? 4
ОтборСтрок = ТабличнаяЧастьИсточник.ОтборСтрок ; ПостроительЗапроса = Новый ПостроительЗапроса; ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличнаяЧастьИсточник); // Добавляются необходимые отборы, такие же как в отбор Отбор по списку значений 3
СозданныйСписок = Новый СписокЗначений; СозданныйСписок.Добавить(Перечисления.СтатусЗаявки.Выполнено); СозданныйСписок.Добавить(Перечисления.СтатусЗаявки.ЗакрытиеЗаявки); СозданныйСписок.Добавить(Перечисления.СтатусЗаявки.ОтклоненаРукОтдЗакупок); Как пользователям запретить удаление условия отбора в форме списка? 3
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; Полный код: ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип(" ЭлементОтбораКомпоновкиДанных" )); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпонов Посмотреть все в категории Список Справочника, Документов, Регистров
Читайте также: