1С 8.3 Список значений
Данные > Примеры кода 1С > 1С 8.3 Список значений
Список значений в 1С 8.3 это динамический набор значений, аналог одномерного массива. Может быть заполнен любыми значениями разных типов. Но в отличие от простого массива, элементы которого могут быть произвольных типов, у списка значений каждый элемент имеет специальный тип "Элемент списка значений". После создание списка значений, в него можно добавлять новые значения, выгружать значения в массив и загружать значения из массива, сортировать и производить различные действия согласно функциональности объекта.
Оглавление:
Работа со Списком значений в 1С 8.3 (&НаКлиенте):
// Создаем список значений
СЗ = Новый СписокЗначений;
// Добавляем элемент в список значений
// Элемент списка значений может хранить в себе следующие данные:
// - значение (любого типа),
// - представление (тип строка),
// - пометка(тип булево),
// - картинка (тип картинка).
//Значения характеризуются позицией в списке (индексом).
СЗ.Добавить("Минск", "Столица Беларуси"); // значение, представление, отметка (необ.), картинка (необ.)
СЗ.Добавить("Москва", "Столица России");
СЗ.Добавить("1067", "Год основания Минска"); // значения в списке могут быть разных типов
СЗ.Добавить("1147", "Год основания Москвы");
// Вставляем элемент в список значений в позицию №2 (элементы нумеруются с 0).
// Элемент со значением "Нур-Султан" и представлением "Столица Казахстана"
СЗ.Вставить(2, "Нур-Султан", "Столица Казахстана");
// Обходим элементы списка значений
Для Каждого ЭлементСЗ Из СЗ Цикл
Сообщить(ЭлементСЗ.Представление + ": " + Строка(ЭлементСЗ.Значение));
КонецЦикла;
// Очистим список значений - удалим все строки
СЗ.Очистить();
СЗ.Добавить("Август");
СЗ.Добавить("Сентябрь");
СЗ.Добавить("Октябрь");
// Получаем количество элементов списка значений, и элемент списка по его индексу (нумерация с нуля)
Для Индекс = 0 По СЗ.Количество() - 1 Цикл
Сообщить(СЗ[Индекс]);
КонецЦикла;
// Находим элемент списка по его значению
ЗначСентябрь = СЗ.НайтиПоЗначению("Сентябрь");
// Узнаем индекс элемента в списке
Сообщить(СЗ.Индекс(ЗначСентябрь)); // 1, так как нумерация с нуля
// Сортируем список по его значениям
// было: Август, Сентябрь, Октябрь
СЗ.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
// стало: Сентябрь, Октябрь, Август
/// Удаляем элемент из списка значений
СЗ.Удалить(СЗ[0]);// удаляем первый элемент, параметр: элемент списка
СЗ.Удалить(0);// удаляем по индексу элемента
//Выборочно удаляем элемент из списка значений по индексу - этот вариант замечательно подходит для Цикла
Индекс = СЗ.Количество() - 1;
Пока Индекс >= 0 Цикл
Если ТипЗнч(СЗ[Индекс].Значение) = Тип("Число") Тогда
СЗ.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
/// Удаляем элемент из списка значений по элементу
НайденныйЭлемент = СЗ.НайтиПоЗначению("Ноябрь");
// Не подходит для удаления в Цикле. Чтобы удалить в цикле - см. конструкцию выше
Если НайденныйЭлемент <> Неопределено Тогда
СЗ.Удалить(НайденныйЭлемент);
Иначе
Сообщить("Значение не найдено!");
КонецЕсли;
// Сдвигаем нулевой элемент списка значений на одну позицию вперёд
// было: Сентябрь, Октябрь
СЗ.Сдвинуть(0, 1);
// стало: Октябрь, Сентябрь
// Делаем копию списка значений
КопияСписка = СЗ.Скопировать();
Металлы = Новый СписокЗначений;
Металлы.Добавить("Золото");
Металлы.Добавить("Серебро");
Металлы.Добавить("Медь");
// Выгружаем значения списка значений в массив
МассивМеталлов = Металлы.ВыгрузитьЗначения();
// Загружаем значения списка значений из массива
Металлы.ЗагрузитьЗначения(МассивМеталлов);
СЗ = Новый СписокЗначений;
// Добавляем элемент в список значений
// Элемент списка значений может хранить в себе следующие данные:
// - значение (любого типа),
// - представление (тип строка),
// - пометка(тип булево),
// - картинка (тип картинка).
//Значения характеризуются позицией в списке (индексом).
СЗ.Добавить("Минск", "Столица Беларуси"); // значение, представление, отметка (необ.), картинка (необ.)
СЗ.Добавить("Москва", "Столица России");
СЗ.Добавить("1067", "Год основания Минска"); // значения в списке могут быть разных типов
СЗ.Добавить("1147", "Год основания Москвы");
// Вставляем элемент в список значений в позицию №2 (элементы нумеруются с 0).
// Элемент со значением "Нур-Султан" и представлением "Столица Казахстана"
СЗ.Вставить(2, "Нур-Султан", "Столица Казахстана");
// Обходим элементы списка значений
Для Каждого ЭлементСЗ Из СЗ Цикл
Сообщить(ЭлементСЗ.Представление + ": " + Строка(ЭлементСЗ.Значение));
КонецЦикла;
// Очистим список значений - удалим все строки
СЗ.Очистить();
СЗ.Добавить("Август");
СЗ.Добавить("Сентябрь");
СЗ.Добавить("Октябрь");
// Получаем количество элементов списка значений, и элемент списка по его индексу (нумерация с нуля)
Для Индекс = 0 По СЗ.Количество() - 1 Цикл
Сообщить(СЗ[Индекс]);
КонецЦикла;
// Находим элемент списка по его значению
ЗначСентябрь = СЗ.НайтиПоЗначению("Сентябрь");
// Узнаем индекс элемента в списке
Сообщить(СЗ.Индекс(ЗначСентябрь)); // 1, так как нумерация с нуля
// Сортируем список по его значениям
// было: Август, Сентябрь, Октябрь
СЗ.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
// стало: Сентябрь, Октябрь, Август
/// Удаляем элемент из списка значений
СЗ.Удалить(СЗ[0]);// удаляем первый элемент, параметр: элемент списка
СЗ.Удалить(0);// удаляем по индексу элемента
//Выборочно удаляем элемент из списка значений по индексу - этот вариант замечательно подходит для Цикла
Индекс = СЗ.Количество() - 1;
Пока Индекс >= 0 Цикл
Если ТипЗнч(СЗ[Индекс].Значение) = Тип("Число") Тогда
СЗ.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
/// Удаляем элемент из списка значений по элементу
НайденныйЭлемент = СЗ.НайтиПоЗначению("Ноябрь");
// Не подходит для удаления в Цикле. Чтобы удалить в цикле - см. конструкцию выше
Если НайденныйЭлемент <> Неопределено Тогда
СЗ.Удалить(НайденныйЭлемент);
Иначе
Сообщить("Значение не найдено!");
КонецЕсли;
// Сдвигаем нулевой элемент списка значений на одну позицию вперёд
// было: Сентябрь, Октябрь
СЗ.Сдвинуть(0, 1);
// стало: Октябрь, Сентябрь
// Делаем копию списка значений
КопияСписка = СЗ.Скопировать();
Металлы = Новый СписокЗначений;
Металлы.Добавить("Золото");
Металлы.Добавить("Серебро");
Металлы.Добавить("Медь");
// Выгружаем значения списка значений в массив
МассивМеталлов = Металлы.ВыгрузитьЗначения();
// Загружаем значения списка значений из массива
Металлы.ЗагрузитьЗначения(МассивМеталлов);
Немодальный выбор значения из списка значений в 1С 8.3:
&НаКлиенте
Процедура НемодальныйВыборЗначения(Команда)
Металлы = Новый СписокЗначений;
Металлы.Добавить("Золото");
Металлы.Добавить("Серебро");
Металлы.Добавить("Медь");
// Процедура ПослеВыбораЭлемента определена чуть ниже
ОповещениеПослеВыбораЭлемента = Новый ОписаниеОповещения("ПослеВыбораЭлемента", ЭтотОбъект);
Металлы.ПоказатьВыборЭлемента(ОповещениеПослеВыбораЭлемента, "Выберите металл");
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораЭлемента(Элемент, Параметры)
Если Элемент <> Неопределено Тогда
Сообщить(Элемент.Значение);
КонецЕсли;
КонецПроцедуры
Процедура НемодальныйВыборЗначения(Команда)
Металлы = Новый СписокЗначений;
Металлы.Добавить("Золото");
Металлы.Добавить("Серебро");
Металлы.Добавить("Медь");
// Процедура ПослеВыбораЭлемента определена чуть ниже
ОповещениеПослеВыбораЭлемента = Новый ОписаниеОповещения("ПослеВыбораЭлемента", ЭтотОбъект);
Металлы.ПоказатьВыборЭлемента(ОповещениеПослеВыбораЭлемента, "Выберите металл");
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораЭлемента(Элемент, Параметры)
Если Элемент <> Неопределено Тогда
Сообщить(Элемент.Значение);
КонецЕсли;
КонецПроцедуры
Примечание: Модальные окна 1С - блокируют работу с другими окнами 1С до своего закрытия. Обычно с их помощью реализуется диалог, требующий от пользователя принятия некоторого решения. Соответственно немодальные окна могут параллельно отрываться и работать одновременно с другими окнами
Модальный выбор значения из списка значений в 1С 8.3:
&НаКлиенте
Процедура МодальныйВыборЗначения(Команда)
Металлы = Новый СписокЗначений;
Металлы.Добавить("Золото");
Металлы.Добавить("Серебро");
Металлы.Добавить("Медь");
ВыбМеталл = Металлы.ВыбратьЭлемент("Выберите металл");
Если ВыбМеталл <> Неопределено Тогда
Сообщить(ВыбМеталл.Значение);
КонецЕсли;
КонецПроцедуры
Процедура МодальныйВыборЗначения(Команда)
Металлы = Новый СписокЗначений;
Металлы.Добавить("Золото");
Металлы.Добавить("Серебро");
Металлы.Добавить("Медь");
ВыбМеталл = Металлы.ВыбратьЭлемент("Выберите металл");
Если ВыбМеталл <> Неопределено Тогда
Сообщить(ВыбМеталл.Значение);
КонецЕсли;
КонецПроцедуры
Модальная отметка значений из списка значений в 1С 8.3:
&НаКлиенте
Процедура МодальнаяОтметкаЗначений(Команда)
Металлы = Новый СписокЗначений;
Металлы.Добавить("Золото");
Металлы.Добавить("Серебро");
Металлы.Добавить("Медь");
Если Металлы.ОтметитьЭлементы("Выберите металлы") Тогда
Для Каждого Металл Из Металлы Цикл
Если Металл.Пометка Тогда
Сообщить(Металл.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
// можно также разом установить все отметки списка в определенное значение
Металлы.ЗаполнитьПометки(Истина);
КонецПроцедуры
Процедура МодальнаяОтметкаЗначений(Команда)
Металлы = Новый СписокЗначений;
Металлы.Добавить("Золото");
Металлы.Добавить("Серебро");
Металлы.Добавить("Медь");
Если Металлы.ОтметитьЭлементы("Выберите металлы") Тогда
Для Каждого Металл Из Металлы Цикл
Если Металл.Пометка Тогда
Сообщить(Металл.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
// можно также разом установить все отметки списка в определенное значение
Металлы.ЗаполнитьПометки(Истина);
КонецПроцедуры
Выбор из Списка Значений в Таблице Значений на УФ в 1С 8.3:
&НаКлиенте
Процедура ТЗОбъектыЗакрепленияСчетНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
СписокСчет = Новый СписокЗначений;
МассивВсехФайлов = НайтиФайлы("D:\SUBK", "*.*");
Для Каждого Файл Из МассивВсехФайлов Цикл
ИмяОдногоИзФайлов=СокрЛП(Файл.Имя);
ИмяФайлаДо_="";//Например 41_1
Для Счетчик = 1 По СтрДлина(ИмяОдногоИзФайлов) Цикл
ПолученныйСимвол=Сред(ИмяОдногоИзФайлов,Счетчик,1); //Сред(<Строка>, <НачальныйНомер>, <ЧислоСимволов>)
Если ПолученныйСимвол<>"_" Тогда
ИмяФайлаДо_=ИмяФайлаДо_+ПолученныйСимвол;
Иначе
НашеИмя=ИмяФайлаДо_;
СписокСчет.Добавить(НашеИмя, НашеИмя); // значение элемента // представление
ИмяФайлаДо_="";
Конецесли;
КонецЦикла;
КонецЦикла;
Элемент.СписокВыбора.Очистить();
Для Каждого ЭлементСЗ Из СписокСчет Цикл
Элемент.СписокВыбора.Добавить(ЭлементСЗ);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ТЗОбъектыЗакрепленияСчетОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Строка = Элементы.ТЗОбъектыЗакрепления.ТекущиеДанные;
// Счет - реквизит ТаблицыЗначений с типом Строка
Строка.Счет = ВыбранноеЗначение; // в этом случаи значение сразу будет сохраняться/обновляться в поле
//у реквизита Счет (ТЗОбъектыЗакрепления.Счет) галка "РежимВыбораИзСписка" = Ложь
//у реквизита Счет (ТЗОбъектыЗакрепления.Счет) галка "КнопкаВыбора" = Истина
КонецПроцедуры
Процедура ТЗОбъектыЗакрепленияСчетНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
СписокСчет = Новый СписокЗначений;
МассивВсехФайлов = НайтиФайлы("D:\SUBK", "*.*");
Для Каждого Файл Из МассивВсехФайлов Цикл
ИмяОдногоИзФайлов=СокрЛП(Файл.Имя);
ИмяФайлаДо_="";//Например 41_1
Для Счетчик = 1 По СтрДлина(ИмяОдногоИзФайлов) Цикл
ПолученныйСимвол=Сред(ИмяОдногоИзФайлов,Счетчик,1); //Сред(<Строка>, <НачальныйНомер>, <ЧислоСимволов>)
Если ПолученныйСимвол<>"_" Тогда
ИмяФайлаДо_=ИмяФайлаДо_+ПолученныйСимвол;
Иначе
НашеИмя=ИмяФайлаДо_;
СписокСчет.Добавить(НашеИмя, НашеИмя); // значение элемента // представление
ИмяФайлаДо_="";
Конецесли;
КонецЦикла;
КонецЦикла;
Элемент.СписокВыбора.Очистить();
Для Каждого ЭлементСЗ Из СписокСчет Цикл
Элемент.СписокВыбора.Добавить(ЭлементСЗ);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ТЗОбъектыЗакрепленияСчетОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Строка = Элементы.ТЗОбъектыЗакрепления.ТекущиеДанные;
// Счет - реквизит ТаблицыЗначений с типом Строка
Строка.Счет = ВыбранноеЗначение; // в этом случаи значение сразу будет сохраняться/обновляться в поле
//у реквизита Счет (ТЗОбъектыЗакрепления.Счет) галка "РежимВыбораИзСписка" = Ложь
//у реквизита Счет (ТЗОбъектыЗакрепления.Счет) галка "КнопкаВыбора" = Истина
КонецПроцедуры
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом "СписокЗначений":
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник