Примеры работы со списком значений

Примеры работы со списком значений на языке программирования 1С:Предприятие. Примеры позволяют быстро разобраться в вопросе и использовать код в своих разработках

Создание и базовые операции со списком значений

// Создание списка значений, добавление и получение элементов
Процедура БазовыеОперацииСоСписком()

    // Создаем новый список значений
    Список = Новый СписокЗначений;
    
    // Добавляем элементы (значение, представление)
    Список.Добавить("Ноутбук", "Ноутбук 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. При переборе списка используйте Для Каждого Элемент Из Список

Поделиться с друзьями
Smirnov code
Добавить комментарий