Читайте дальше...
Создание и базовые операции со списком значений
// Создание списка значений, добавление и получение элементов
Процедура БазовыеОперацииСоСписком()
// Создаем новый список значений
Список = Новый СписокЗначений;
// Добавляем элементы (значение, представление)
Список.Добавить("Ноутбук", "Ноутбук Lenovo");
Список.Добавить("Монитор", "Монитор Samsung");
Список.Добавить("Клавиатура", "Клавиатура Logitech");
Список.Добавить("Мышь", "Мышь Defender");
// Получаем количество элементов
Сообщить("Количество элементов: " + Список.Количество());
// Получаем значение по индексу
Значение = Список.ПолучитьЗначение(0);
Представление = Список.ПолучитьПредставление(0);
Сообщить("Элемент 0: " + Представление + " (значение: " + Значение + ")");
// Поиск индекса по значению
Индекс = Список.НайтиПоЗначению("Монитор");
Если Индекс <> Неопределено Тогда
Сообщить("Монитор найден на позиции: " + Индекс);
Сообщить("Представление: " + Список.ПолучитьПредставление(Индекс));
КонецЕсли;
// Поиск индекса по представлению
ИндексПоПредставлению = Список.НайтиПоПредставлению("Мышь Defender");
Сообщить("Индекс мыши: " + ИндексПоПредставлению);
// Вставка элемента в середину
Список.Вставить(2, "Принтер", "Принтер HP");
Сообщить("После вставки элементов: " + Список.Количество());
// Изменение представления элемента
Список.УстановитьПредставление(0, "Ноутбук Asus");
Сообщить("Новое представление элемента 0: " + Список.ПолучитьПредставление(0));
// Удаление элемента
Список.Удалить(1);
Сообщить("После удаления: " + Список.Количество() + " элементов");
// Очистка списка
Список.Очистить();
Сообщить("После очистки: " + Список.Количество());
КонецПроцедуры
Перебор списка значений
// Различные способы обхода списка значений
Процедура ПереборСписка()
Список = Новый СписокЗначений;
Список.Добавить("Товар1", "Ноутбук", 50000);
Список.Добавить("Товар2", "Монитор", 15000);
Список.Добавить("Товар3", "Клавиатура", 2000);
Список.Добавить("Товар4", "Мышь", 1000);
// Способ 1: перебор по индексам
Сообщить("Перебор по индексам:");
Для Инд = 0 По Список.ВГраница() Цикл
Значение = Список.ПолучитьЗначение(Инд);
Представление = Список.ПолучитьПредставление(Инд);
Метка = Список.ПолучитьМетку(Инд);
Сообщить(Строка(Инд) + ": " + Представление + " (значение: " + Значение + ", метка: " + Метка + ")");
КонецЦикла;
// Способ 2: перебор с использованием Для Каждого
Сообщить("Перебор с Для Каждого:");
Для Каждого Элемент Из Список Цикл
Сообщить(Элемент.Представление + " | Значение: " + Элемент.Значение +
" | Метка: " + Элемент.Метка + " | Пометка: " + Элемент.Пометка);
КонецЦикла;
// Способ 3: перебор с использованием ВыбратьЭлементы
Сообщить("Перебор через ВыбратьЭлементы:");
Выборка = Список.ВыбратьЭлементы();
Пока Выборка.Следующий() Цикл
Сообщико(Выборка.Элемент.Представление);
КонецЦикла;
КонецПроцедуры
Сортировка списка значений
// Сортировка списка значений по значению, представлению или метке
Процедура СортировкаСписка()
Список = Новый СписокЗначений;
Список.Добавить("Петров", "Петров Иван", 150);
Список.Добавить("Иванов", "Иванов Сергей", 100);
Список.Добавить("Сидоров", "Сидоров Алексей", 200);
Список.Добавить("Кузнецов", "Кузнецов Дмитрий", 50);
Сообщить("Исходный список:");
ВывестиСписок(Список);
// Сортировка по значению (по возрастанию)
Список.СортироватьПоЗначению(НаправлениеСортировки.Возр);
Сообщить("Сортировка по значению (возрастание):");
ВывестиСписок(Список);
// Сортировка по значению (по убыванию)
Список.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
Сообщить("Сортировка по значению (убывание):");
ВывестиСписок(Список);
// Сортировка по представлению
Список.СортироватьПоПредставлению(НаправлениеСортировки.Возр);
Сообщить("Сортировка по представлению:");
ВывестиСписок(Список);
// Сортировка по метке
Список.СортироватьПоМетке(НаправлениеСортировки.Возр);
Сообщить("Сортировка по метке:");
ВывестиСписок(Список);
КонецПроцедуры
Процедура ВывестиСписок(Список)
Для Каждого Элемент Из Список Цикл
Сообщить(" " + Элемент.Значение + " | " + Элемент.Представление + " | метка: " + Элемент.Метка);
КонецЦикла;
КонецПроцедуры
Использование пометок элементов
// Работа с пометками элементов списка (отметка выбранных элементов)
Процедура ИспользованиеПометок()
Список = Новый СписокЗначений;
Список.Добавить("Товар1", "Ноутбук");
Список.Добавить("Товар2", "Монитор");
Список.Добавить("Товар3", "Клавиатура");
Список.Добавить("Товар4", "Мышь");
// Устанавливаем пометки
Список.УстановитьПометку(0, Истина);
Список.УстановитьПометку(2, Истина);
Сообщить("Список с пометками:");
Для Каждого Элемент Из Список Цикл
Сообщить(Элемент.Представление + " | Пометка: " + Элемент.Пометка);
КонецЦикла;
// Получаем отмеченные элементы
Отмеченные = Список.ПолучитьОтмеченныеЭлементы();
Сообщить("Отмеченные элементы:");
Для Каждого Элемент Из Отмеченные Цикл
Сообщить(Элемент.Представление);
КонецЦикла;
// Получаем массив значений отмеченных элементов
МассивЗначений = Список.ВыгрузитьЗначенияОтмеченных();
Сообщить("Значения отмеченных элементов:");
Для Каждого Значение Из МассивЗначений Цикл
Сообщить(Значение);
КонецЦикла;
// Снять все пометки
Список.СнятьПометки();
Сообщить("После снятия пометок:");
Для Каждого Элемент Из Список Цикл
Сообщить(Элемент.Представление + " | Пометка: " + Элемент.Пометка);
КонецЦикла;
КонецПроцедуры
Загрузка и выгрузка данных из списка
// Преобразование списка значений в массив, таблицу и обратно
Процедура ЗагрузкаВыгрузкаСписка()
// Создаем исходный список
Список = Новый СписокЗначений;
Список.Добавить("Январь", "Месяц 1", 31);
Список.Добавить("Февраль", "Месяц 2", 28);
Список.Добавить("Март", "Месяц 3", 31);
// Выгрузка в массив значений
МассивЗначений = Список.ВыгрузитьЗначения();
Сообщить("Массив значений:");
Для Каждого Значение Из МассивЗначений Цикл
Сообщить(Значение);
КонецЦикла;
// Выгрузка в таблицу значений
Таблица = Список.Выгрузить();
Сообщить("Таблица значений (колонки: Значение, Представление, Метка):");
Для Каждого Строка Из Таблица Цикл
Сообщить(Строка.Значение + " | " + Строка.Представление + " | " + Строка.Метка);
КонецЦикла;
// Загрузка из массива значений
НовыйСписок = Новый СписокЗначений;
МассивНовыхЗначений = Новый Массив;
МассивНовыхЗначений.Добавить("Апрель");
МассивНовыхЗначений.Добавить("Май");
МассивНовыхЗначений.Добавить("Июнь");
НовыйСписок.ЗагрузитьЗначения(МассивНовыхЗначений);
Сообщить("Список, загруженный из массива:");
Для Каждого Элемент Из НовыйСписок Цикл
Сообщить(Элемент.Значение);
КонецЦикла;
// Загрузка из таблицы значений
ТаблицаДляЗагрузки = Новый ТаблицаЗначений;
ТаблицаДляЗагрузки.Колонки.Добавить("Значение");
ТаблицаДляЗагрузки.Колонки.Добавить("Представление");
ТаблицаДляЗагрузки.Добавить().Значение = "Июль"; ТаблицаДляЗагрузки[0].Представление = "Месяц 7";
ТаблицаДляЗагрузки.Добавить().Значение = "Август"; ТаблицаДляЗагрузки[1].Представление = "Месяц 8";
ЕщеСписок = Новый СписокЗначений;
ЕщеСписок.Загрузить(ТаблицаДляЗагрузки);
Сообщить("Список, загруженный из таблицы:");
Для Каждого Элемент Из ЕщеСписок Цикл
Сообщить(Элемент.Значение + " | " + Элемент.Представление);
КонецЦикла;
КонецПроцедуры
Поиск и фильтрация в списке значений
// Поиск элементов по различным критериям
Процедура ПоискИФильтрацияВСписке()
Список = Новый СписокЗначений;
Список.Добавить(1000, "Товар дешевый", 1);
Список.Добавить(5000, "Товар средний", 2);
Список.Добавить(10000, "Товар дорогой", 3);
Список.Добавить(15000, "Товар очень дорогой", 4);
Список.Добавить(2000, "Товар бюджетный", 1);
// Поиск по значению
Индекс = Список.НайтиПоЗначению(10000);
Если Индекс <> Неопределено Тогда
Сообщить("Найден товар с ценой 10000: " + Список.ПолучитьПредставление(Индекс));
КонецЕсли;
// Поиск по представлению (частичное совпадение)
ЭлементыССловомТовар = Новый Массив;
Для Каждого Элемент Из Список Цикл
Если СтрНайти(Элемент.Представление, "Товар") > 0 Тогда
ЭлементыССловомТовар.Добавить(Элемент);
КонецЕсли;
КонецЦикла;
Сообщить("Элементы, содержащие 'Товар' в представлении:");
Для Каждого Элемент Из ЭлементыССловомТовар Цикл
Сообщить(Элемент.Значение + " - " + Элемент.Представление);
КонецЦикла;
// Фильтрация по метке
ФильтрПоМетке = Новый СписокЗначений;
Для Каждого Элемент Из Список Цикл
Если Элемент.Метка = 1 Тогда
ФильтрПоМетке.Добавить(Элемент.Значение, Элемент.Представление);
КонецЕсли;
КонецЦикла;
Сообщить("Элементы с меткой 1:");
Для Каждого Элемент Из ФильтрПоМетке Цикл
Сообщить(Элемент.Значение + " - " + Элемент.Представление);
КонецЦикла;
// Поиск по условию (цена > 5000)
ДорогиеТовары = Новый СписокЗначений;
Для Каждого Элемент Из Список Цикл
Если Элемент.Значение > 5000 Тогда
ДорогиеТовары.Добавить(Элемент.Значение, Элемент.Представление);
КонецЕсли;
КонецЦикла;
Сообщить("Товары дороже 5000:");
Для Каждого Элемент Из ДорогиеТовары Цикл
Сообщить(Элемент.Значение + " - " + Элемент.Представление);
КонецЦикла;
КонецПроцедуры
Использование списка значений для заполнения элементов формы
// Список значений как источник данных для выпадающего списка
Процедура ЗаполнениеСпискаДляФормы()
// Создаем список для выбора месяца
Месяцы = Новый СписокЗначений;
Месяцы.Добавить(1, "Январь");
Месяцы.Добавить(2, "Февраль");
Месяцы.Добавить(3, "Март");
Месяцы.Добавить(4, "Апрель");
Месяцы.Добавить(5, "Май");
Месяцы.Добавить(6, "Июнь");
Месяцы.Добавить(7, "Июль");
Месяцы.Добавить(8, "Август");
Месяцы.Добавить(9, "Сентябрь");
Месяцы.Добавить(10, "Октябрь");
Месяцы.Добавить(11, "Ноябрь");
Месяцы.Добавить(12, "Декабрь");
Сообщить("Список месяцев:");
Для Каждого Месяц Из Месяцы Цикл
Сообщить(Месяц.Значение + " - " + Месяц.Представление);
КонецЦикла;
// Выбор текущего месяца
ТекущийМесяц = 5;
ИндексТекущегоМесяца = Месяцы.НайтиПоЗначению(ТекущийМесяц);
Если ИндексТекущегоМесяца <> Неопределено Тогда
Сообщить("Выбранный месяц: " + Месяцы.ПолучитьПредставление(ИндексТекущегоМесяца));
КонецЕсли;
// Создаем список с группировкой
СписокСГруппировкой = Новый СписокЗначений;
СписокСГруппировкой.Добавить("Группа1:Элемент1", "Элемент 1", "Группа 1");
СписокСГруппировкой.Добавить("Группа1:Элемент2", "Элемент 2", "Группа 1");
СписокСГруппировкой.Добавить("Группа2:Элемент3", "Элемент 3", "Группа 2");
СписокСГруппировкой.Добавить("Группа2:Элемент4", "Элемент 4", "Группа 2");
Сообщить("Список с группировкой:");
Для Каждого Элемент Из СписокСГруппировкой Цикл
Сообщить(Элемент.Значение + " | " + Элемент.Представление + " | " + Элемент.Метка);
КонецЦикла;
КонецПроцедуры
Копирование и клонирование списка значений
// Создание копий списка значений
Процедура КопированиеСписка()
Исходный = Новый СписокЗначений;
Исходный.Добавить("Значение1", "Представление1", 10);
Исходный.Добавить("Значение2", "Представление2", 20);
Исходный.Добавить("Значение3", "Представление3", 30);
// Устанавливаем пометки
Исходный.УстановитьПометку(0, Истина);
Исходный.УстановитьПометку(2, Истина);
// Неглубокая копия (ссылка на тот же список)
НеглубокаяКопия = Исходный;
НеглубокаяКопия.Добавить("Значение4", "Представление4");
Сообщить("Исходный после изменения неглубокой копии: " + Исходный.Количество());
// Глубокое копирование (создается новый список)
ГлубокаяКопия = Исходный.Скопировать();
ГлубокаяКопия.Добавить("Значение5", "Представление5");
Сообщить("Исходный после изменения глубокой копии: " + Исходный.Количество());
Сообщить("Глубокая копия: " + ГлубокаяКопия.Количество() + " элементов");
// Копирование только отмеченных элементов
ОтмеченныеКопия = Исходный.СкопироватьОтмеченные();
Сообщить("Копия отмеченных элементов: " + ОтмеченныеКопия.Количество() + " элементов");
// Копирование с изменением значений
СкопированныйСИзменением = Новый СписокЗначений;
Для Каждого Элемент Из Исходный Цикл
// Можно изменить представление или метку при копировании
СкопированныйСИзменением.Добавить(Элемент.Значение,
"Новое: " + Элемент.Представление,
Элемент.Метка * 10);
КонецЦикла;
Сообщить("Копия с измененными данными:");
Для Каждого Элемент Из СкопированныйСИзменением Цикл
Сообщить(Элемент.Значение + " - " + Элемент.Представление + " (метка: " + Элемент.Метка + ")");
КонецЦикла;
КонецПроцедуры
Список значений для последовательной обработки (очередь)
// Использование списка значений как очереди или стека
Процедура СписокКакОчередь()
Очередь = Новый СписокЗначений;
// Добавляем задачи в конец очереди
Процедура ДобавитьЗадачу(Очередь, Задача, Приоритет = 0)
Очередь.Добавить(Задача, "Задача: " + Задача, Приоритет);
КонецПроцедуры
// Извлекаем задачу из начала очереди
Функция ПолучитьСледующуюЗадачу(Очередь)
Если Очередь.Количество() = 0 Тогда
Возврат Неопределено;
КонецЕсли;
// Сортируем по приоритету (чем меньше число, тем выше приоритет)
Очередь.СортироватьПоМетке(НаправлениеСортировки.Возр);
Задача = Очередь.ПолучитьЗначение(0);
Очередь.Удалить(0);
Возврат Задача;
КонецФункции
// Добавляем задачи
ДобавитьЗадачу(Очередь, "Задача 1", 2);
ДобавитьЗадачу(Очередь, "Задача 2", 1);
ДобавитьЗадачу(Очередь, "Задача 3", 3);
ДобавитьЗадачу(Очередь, "Задача 4", 1);
Сообщить("Очередь содержит " + Очередь.Количество() + " задач");
// Обрабатываем задачи
Сообщить("Обработка задач (с учетом приоритета):");
Пока Истина Цикл
Задача = ПолучитьСледующуюЗадачу(Очередь);
Если Задача = Неопределено Тогда
Прервать;
КонецЕсли;
Сообщить("Выполняется: " + Задача);
КонецЦикла;
КонецПроцедуры
Комбинирование списков значений
// Объединение, пересечение и разность списков значений
Процедура КомбинированиеСписков()
Список1 = Новый СписокЗначений;
Список1.Добавить("A", "Элемент A");
Список1.Добавить("B", "Элемент B");
Список1.Добавить("C", "Элемент C");
Список2 = Новый СписокЗначений;
Список2.Добавить("B", "Элемент B");
Список2.Добавить("C", "Элемент C");
Список2.Добавить("D", "Элемент D");
Список2.Добавить("E", "Элемент E");
// Объединение (уникальные элементы из обоих списков)
Объединение = Новый СписокЗначений;
Для Каждого Элемент Из Список1 Цикл
Объединение.Добавить(Элемент.Значение, Элемент.Представление);
КонецЦикла;
Для Каждого Элемент Из Список2 Цикл
Если Объединение.НайтиПоЗначению(Элемент.Значение) = Неопределено Тогда
Объединение.Добавить(Элемент.Значение, Элемент.Представление);
КонецЕсли;
КонецЦикла;
Сообщить("Объединение списков:");
Для Каждого Элемент Из Объединение Цикл
Сообщить(Элемент.Значение);
КонецЦикла;
// Пересечение (элементы, присутствующие в обоих списках)
Пересечение = Новый СписокЗначений;
Для Каждого Элемент Из Список1 Цикл
Если Список2.НайтиПоЗначению(Элемент.Значение) <> Неопределено Тогда
Пересечение.Добавить(Элемент.Значение, Элемент.Представление);
КонецЕсли;
КонецЦикла;
Сообщить("Пересечение списков:");
Для Каждого Элемент Из Пересечение Цикл
Сообщить(Элемент.Значение);
КонецЦикла;
// Разность (элементы из первого списка, отсутствующие во втором)
Разность = Новый СписокЗначений;
Для Каждого Элемент Из Список1 Цикл
Если Список2.НайтиПоЗначению(Элемент.Значение) = Неопределено Тогда
Разность.Добавить(Элемент.Значение, Элемент.Представление);
КонецЕсли;
КонецЦикла;
Сообщить("Разность (Список1 - Список2):");
Для Каждого Элемент Из Разность Цикл
Сообщить(Элемент.Значение);
КонецЦикла;
КонецПроцедуры
Список значений для управления пользовательским выбором
// Реализация множественного выбора с помощью списка значений
Процедура УправлениеВыбором()
ДоступныеПрава = Новый СписокЗначений;
ДоступныеПрава.Добавить("Чтение", "Разрешить чтение");
ДоступныеПрава.Добавить("Запись", "Разрешить запись");
ДоступныеПрава.Добавить("Удаление", "Разрешить удаление");
ДоступныеПрава.Добавить("Проведение", "Разрешить проведение");
// Изначально выбранные права
ВыбранныеПрава = Новый СписокЗначений;
ВыбранныеПрава.Добавить("Чтение", "Разрешить чтение");
ВыбранныеПрава.Добавить("Запись", "Разрешить запись");
// Отмечаем выбранные права в основном списке
Для Каждого Выбранное Из ВыбранныеПрава Цикл
Индекс = ДоступныеПрава.НайтиПоЗначению(Выбранное.Значение);
Если Индекс <> Неопределено Тогда
ДоступныеПрава.УстановитьПометку(Индекс, Истина);
КонецЕсли;
КонецЦикла;
Сообщить("Все права с пометками выбранных:");
Для Инд = 0 По ДоступныеПрава.ВГраница() Цикл
Элемент = ДоступныеПрава[Инд];
Сообщить(Элемент.Представление + " - Выбрано: " + ?(Элемент.Пометка, "Да", "Нет"));
КонецЦикла;
// Добавляем новое право в выбранные
ИндексДобавляемого = ДоступныеПрава.НайтиПоЗначению("Проведение");
Если ИндексДобавляемого <> Неопределено Тогда
ДоступныеПрава.УстановитьПометку(ИндексДобавляемого, Истина);
КонецЕсли;
// Формируем финальный список выбранных прав
ФинальныйСписок = ДоступныеПрава.ПолучитьОтмеченныеЭлементы();
Сообщить("Финальный список выбранных прав:");
Для Каждого Пара Из ФинальныйСписок Цикл
Сообщить(Пара.Значение + " - " + Пара.Представление);
КонецЦикла;
КонецПроцедуры
Примечания
// Важные особенности работы со списком значений:
// 1. Список значений часто используется для заполнения полей выбора на формах
// 2. Каждый элемент списка имеет значение, представление, метку и пометку
// 3. Значение и представление могут быть любого типа
// 4. Метка обычно используется для хранения дополнительной информации (числа, структуры)
// 5. Пометка (флаг) используется для отметки выбранных элементов
// 6. Вставка элемента возможна только по индексу, добавление - в конец
// 7. Список можно сортировать по значению, представлению или метке
// 8. Для поиска используйте НайтиПоЗначению() или НайтиПоПредставлению()
// 9. ВыгрузитьЗначения() - получить массив всех значений
// 10. ПолучитьОтмеченныеЭлементы() - получить список выбранных элементов
// 11. Скопировать() создает полную независимую копию списка
// 12. При переборе списка используйте Для Каждого Элемент Из Список








