Объект СписокЗначений является одной из часто используемых универсальных коллекций в языке 1С:Предприятие. Он предназначен для хранения и обработки упорядоченного набора элементов, каждый из которых состоит из значения и, опционально, его представления. Также, для интерактивной работы в интерфейсе, у списка значений есть еще два свойства — картинка и пометка. В этой статье мы рассмотрим ключевые аспекты работы с этим объектом, от его создания до использования в реальных задачах.
Описание:
Список значений — это не сохраняемый в базе данных объект, который позволяет строить для решения интерфейсных задач динамические наборы значений и манипулировать ими (добавлять, редактировать, удалять элементы, сортировать). Он может быть наполнен значениями любого типа, т.е. в одном списке типы хранимых значений могут быть разными. Одним из примеров использования данного объекта может служить организация выбора конкретного документа из списка возможных документов, сформированного по сложному алгоритму.
Элементы коллекции: ЭлементСпискаЗначений
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора […]. В качестве аргумента передается индекс элемента (нумерация с 0).
Свойства:
| ДоступныеЗначения | Применяется в случаях, когда требуется ограничить возможность задания значений для элементов списка некоторым подмножеством значений допустимого типа (если для списка установлено описание типа). Неопределено — ограничения отсутствуют. Установка этого свойства влияет на работу диалога редактирования списка значений, элементов управления «Таблица» и «Поле ввода», связанных со списком значений, а также на программное добавление-вставку нового элемента списка значений и установку значений элементам списков. |
| ТипЗначения | Определяет тип (см. ОписаниеТипов) для значений, которые могут храниться в элементах данного списка значений. |
Методы:
| Вставить(Индекс, Значение, Представление, Пометка, Картинка) | Вставляет новый элемент в список значений на позицию с указанным индексом. |
| ВыбратьЭлемент(Заголовок, Элемент) | Вызывает окно для интерактивного выбора одного из элементов, входящих в список значений. Элемент — элемент, на который следует изначально спозиционировать список значений при интерактивном выборе. Если значением параметра не является элемент списка значений, входящий в данный список, позиционирования не произойдет. |
| ВыгрузитьЗначения() | Создает массив и копирует в него значения элементов списка значений. |
| Добавить(Значение, Представление, Пометка, Картинка) | Добавляет новый элемент в конец списка значений. |
| ЗагрузитьЗначения(МассивЗначений) | Загружает список значений значениями из переданного массива. При этом все прежние элементы списка удаляются. |
| ЗаполнитьПометки(Пометка) | Устанавливает пометку у всех элементов списка значений. |
| Индекс(Элемент) | Получает индекс элемента в списке значений. Если не найдено, то возвращается -1. |
| Количество() | Получает количество элементов списка значений. |
| НайтиПоЗначению(ИскомоеЗначение) | Осуществляет поиск значения элемента списка значений. Если ни один элемент не хранит значения, равного искомому, то возвращается значение Неопределено. |
| НайтиПоИдентификатору(Идентификатор) | Получает элемент списка значений по идентификатору. Если элемент не найден, то возвращается Неопределено. |
| ОтметитьЭлементы(Заголовок) | Устанавливает или снимает (интерактивно) пометки у элементов списка значений. Возвращает Истина, если в диалоге нажата кнопка «ОК», Ложь — в противном случае. |
| Очистить() | Очищает список значений, удаляя из него все элементы. |
| ПоказатьВыборЭлемента( ОписаниеОповещенияОЗакрытии, Заголовок, Элемент) | Вызывает окно для интерактивного выбора одного из элементов, входящих в список значений. |
| ПоказатьОтметкуЭлементов( ОписаниеОповещенияОЗакрытии, Заголовок) | Предназначен для интерактивной установки состояний пометок у элементов списка значений. |
| Получить(Индекс) | Получает значение по индексу. Работает аналогично оператору []. |
| Сдвинуть(Элемент, Смещение) | Сдвигает элемент списка значений на заданное количество позиций вперед или назад. |
| Скопировать() | Создает копию списка значений. |
| СортироватьПоЗначению(Направление) | Сортирует список значений в порядке возрастания или убывания хранимых элементами значений. См. пример ниже. |
| СортироватьПоПредставлению( Направление) | Сортирует список значений по возрастанию или по убыванию в алфавитном порядке представлений входящих в состав списка значений элементов. См. пример ниже. |
| Удалить(Элемент) | Удаляет элемент из списка значений, где Элемент — индекс удаляемого элемента, либо сам элемент. |
Конструкторы:
| Новый СписокЗначений |
Как работать со списком значений программно? Примеры кода
Создание и заполнение СпискаЗначений
Основная задача списка значений в 1С — хранить данные. Создается объект стандартным образом через конструктор Новый. Заполнить его можно несколькими способами. Самый простой — последовательное добавление элементов методом Добавить().
Этот метод имеет два параметра:
Значение — обязательный параметр, содержащий добавляемое значение любого типа.
Представление — необязательный параметр строкового типа, который определяет, как значение будет отображаться пользователю, например, в элементах форм.
Рассмотрим пример простого заполнения:
// Как создать новый пустой список значений в 1С 8.3 МоиЗадачи = Новый СписокЗначений; // Как добавить элементы в список значений в 1С 8.3 МоиЗадачи.Добавить("ВыполнитьПроверку", "Проверить отчетность"); МоиЗадачи.Добавить("ПодготовитьДанные", "Сформировать данные для выгрузки"); МоиЗадачи.Добавить(Перечисления.СтатусыЗадач.ВРаботе, "Задачи в работе");
В данном примере мы добавили три элемента. Последний элемент использует значение из перечисления, но для пользователя будет отображаться понятная строка «Задачи в работе». Если представление не указано, система использует стандартное представление для типа значения.
Перебор элементов списка значений
Перебрать элементы списка можно стандартным циклом Для каждого … Из …. При таком переборе мы получаем доступ к объекту типа ЭлементСпискаЗначений, у которого есть свойства Значение, Представление, Пометка и Картинка.
// Как обойти элементы списка значений в цикле Для Каждого Элемент Из МоиЗадачи Цикл Сообщить("Значение: " + Элемент.Значение + ", Представление: " + Элемент.Представление); КонецЦикла;
Поиск и получение элементов списка значений в 1С 8.3
Для поиска по значению конкретного элемента в списке используется метод НайтиПоЗначению(). Он возвращает найденный элемент (ЭлементСпискаЗначений) или Неопределено, если элемент с таким значением отсутствует.
НайденныйЭлемент = МоиЗадачи.НайтиПоЗначению("ПодготовитьДанные"); Если НайденныйЭлемент <> Неопределено Тогда Сообщить("Найдена задача: " + НайденныйЭлемент.Представление); Иначе Сообщить("Задача не найдена."); КонецЕсли;
Помимо поиска, можно обращаться к элементам по их индексу (нумерация начинается с 0). Для этого используется метод Получить() или синтаксис с квадратными скобками.
// Получение первого элемента списка значений в 1С 8.3 ПервыйЭлемент = МоиЗадачи[0]; Сообщить(ПервыйЭлемент.Представление); // Выведет "Проверить отчетность"
Сортировка списка значений
Список можно отсортировать как по значению, так и по представлению. Это особенно полезно для подготовки данных к выводу пользователю в упорядоченном виде.
СписокСотрудников = Новый СписокЗначений; СписокСотрудников.Добавить(115, "Иванов П.С."); СписокСотрудников.Добавить(34, "Петров А.И."); СписокСотрудников.Добавить(201, "Сидоров В.В."); // Сортировка по значению (табельному номеру) по возрастанию СписокСотрудников.СортироватьПоЗначению(); // По умолчанию НаправлениеСортировки.ПоВозрастанию // Результат: 34, 115, 201 // Сортировка по представлению (ФИО) по возрастанию СписокСотрудников.СортироватьПоПредставлению(); // Результат: Иванов П.С., Петров А.И., Сидоров В.В.
Вставка и удаление элементов списка значений в 1С 8.3
Элементы можно не только добавлять в конец, но и вставлять в определенную позицию или удалять.
// Исходный список СписокОчереди = Новый СписокЗначений; СписокОчереди.Добавить("Задача1"); СписокОчереди.Добавить("Задача3"); // Вставим "Задачу2" на вторую позицию (индекс 1) СписокОчереди.Вставить(1, "Задача2"); // Теперь список: Задача1, Задача2, Задача3 // Удалим "Задачу1" ЭлементДляУдаления = СписокОчереди.НайтиПоЗначению("Задача1"); Если ЭлементДляУдаления <> Неопределено Тогда СписокОчереди.Удалить(ЭлементДляУдаления); КонецЕсли; // Теперь список: Задача2, Задача3
Перемещение элементов и получение информации
Иногда требуется изменить порядок элементов в списке значений, или определить индекс конкретного элемента, или найти в списке значений нужный элемент.
Оригинал = Новый СписокЗначений; Оригинал.Добавить(1); Оригинал.Добавить(2); // Как скопировать список значений Копия = Оригинал.Скопировать(); // Удалить элемент из списка значений Копия.Удалить(Копия[0]); // Проверим оба списка // В "Копии" остался один элемент: 2 // В "Оригинале" осталось два элемента: 1, 2 // Полная очистка списка значений Оригинал.Очистить(); Сообщить(Оригинал.Количество()); // Выведет 0
Копирование списка значений, очистка и удаление
Присваивание (=) не создает новый список, а лишь копирует ссылку на существующий. Для создания полностью независимой копии используется метод Скопировать().
Оригинал = Новый СписокЗначений; Оригинал.Добавить(1); Оригинал.Добавить(2); // Создание независимой копии Копия = Оригинал.Скопировать(); // Удалим элемент из копии Копия.Удалить(Копия[0]); // Проверим оба списка // В "Копии" остался один элемент: 2 // В "Оригинале" осталось два элемента: 1, 2 // Полная очистка списка Оригинал.Очистить(); Сообщить(Оригинал.Количество()); // Выведет 0
Как выгрузить из списка, и загрузить значения в список?
СписокЗначений легко преобразуется в массив с помощью метода ВыгрузитьЗначения(). Это бывает полезно, когда для дальнейшей работы нужен именно массив, например, для передачи в запрос в качестве параметра.
// Выгрузить список значений в массив МассивЗначений = МоиЗадачи.ВыгрузитьЗначения(); // Теперь МассивЗначений - это массив, содержащий: // "ВыполнитьПроверку", "ПодготовитьДанные", Перечисления.СтатусыЗадач.ВРаботе // Обратная операция — загрузка значений из массива в список — выполняется методом `ЗагрузитьЗначения()`. НовыйСписок = Новый СписокЗначений; НовыйСписок.ЗагрузитьЗначения(МассивЗначений);
Заключение
СписокЗначений в 1С:Предприятие предоставляет гибкие методы для управления динамическими наборами данных, от простого добавления и поиска до сортировки и выгрузки. Освоение этих методов позволяет эффективно строить интерфейсы и обрабатывать данные в приложениях, минимизируя ручной код.
Сэкономь часы на дебаге 1C!
Скачай PDF с топ-11 ошибок начинающих разработчиков + файл с примерами кода!