Внутренний язык программирования 1С 8.3 для начинающих программистов: список значений в 1С
Автор уроков и преподаватель школы: Владимир Милькин
Сегодня мы познакомимся с новым типом данных языка 1С, который называется СписокЗначений.
Список значений в языке 1С
Похож на массив
Список значений - это в общем тот же массив, с которым мы уже умеем работать (ссылка на урок). Но массив этот не простой, а волшебный! Он умеет делать некоторые вещи, которые не умеет делать обычный массив. Давайте рассмотрим некоторые из его возможностей.
Раз список значений - это некоторый аналог массива, то он тоже является коллекцией данных. И мы смело можем поместить в него набор чисел:
Список = Новый СписокЗначений; // создали список значений Список.Добавить(10); // добавили в список число 10 Список.Добавить(0); // добавили в список число 0 Список.Добавить(-5); Список.Добавить(23); |
Его элементы не просто значения
Чтобы теперь вывести эти числа пользователю напишем:
// пробежимся циклом по каждому элементу списка Для Каждого Элемент Из Список Цикл Сообщить(Элемент.Значение); // выводим значение элемента КонецЦикла; |
Если элементами обычного массива являлись бы сами числа, то в случае со списком значений это не совсем так. Элементами списка являются структуры со следующими полями:
- Значение (может иметь произвольный тип)
- Представление (тип Строка)
Там есть и другие поля (например, Картинка), но они нас в этом уроке интересовать не будут.
И когда мы напишем...
Список.Добавить(10); |
... в список добавится структура, у которой поле Значение равно 10.
При желании мы можем указать вторым параметром представление этого значения, например, вот так:
Список.Добавить(10, "десять"); |
Тогда в список добавится структура со следующими значениями полей:
- Значение (10)
- Представление ("десять")
Убедиться в этом легко:
Для Каждого Элемент Из Список Цикл Сообщить(Элемент.Значение); Сообщить(Элемент.Представление); КонецЦикла; |
В этой особенности и состоит главное отличие списка значений от массива. Список содержит в себе не только сами значения, но ещё их представления в виде строки (или даже картинки).
Всё это делает список значений очень удобным для интерактивного взаимодействия с пользователем. Например, нам может потребоваться вывести пользователю для выбора какой-то список элементов, каждому из которых будет сопоставлено какое-то значение (с ним мы будем работать в коде) и какое-то строковое представление (его и увидит пользователь в списке вместо значений).
Разберите и выполните на компьютере следующий пример:
Список = Новый СписокЗначений; Список.Добавить(1861, "Отмена рабства"); Список.Добавить(988, "Крещение Руси"); ВыбранныйЭлемент = Список.ВыбратьЭлемент("Выберите событие:"); Если ВыбранныйЭлемент <> Неопределено Тогда Сообщить("Это событие произошло в " + ВыбранныйЭлемент.Значение + " году."); КонецЕсли; |
Умеет сортировать
Мы можем легко отсортировать список значений. Список умеет это делать сам:
Список.СортироватьПоЗначению(НаправлениеСортировки.Возр); |
В случае с обычным массивом нам пришлось бы реализовывать один из алгоритмов сортировки (например, "пузырёк").
Умеет искать
Список значений, также как и массив, умеет сам искать свои элементы. Пусть мы хотим выяснить, присутствует ли введённое пользователем число в нашем списке:
Число = 0; ВвестиЧисло(Число); // ввели число от пользователя НайденныйЭлемент = Список.НайтиПоЗначению(Число); Если НайденныйЭлемент = Неопределено Тогда ОткрытьЗначение("Число " + Число + " в списке не найдено!"); Иначе ОткрытьЗначение("Число " + Число + " присутствует в списке. Вот оно: " + НайденныйЭлемент.Значение); КонецЕсли; |
Поддерживает вставку и удаление
Список значений, также как и массив, поддерживает вставку и удаление элементов:
Список.Вставить(0, 1000); // вставляем тысячу в самое начало списка Список.Удалить(0); // и тут же удаляем её из списка Список.Вставить(Список.Количество(), 13); // вставляем 13 в конец списка Сообщить(Список[Список.Количество() - 1]); // выводим последний элемент списка (13) |
Поддерживает квадратные скобки
Как вы уже поняли, нумерация элементов списка также идёт с нуля и мы можем обратиться к любому элементу по его индексу используя квадратные скобки:
Сообщить(Список[1].Значение); // вывели второй элемент списка |
Таким образом, мы можем пробежаться по всем элементам списка ещё и так:
Для А = 0 По Список.Количество() - 1 Цикл Сообщить(Список[А].Значение); КонецЦикла; |
Умеет создавать свою копию
У списка значений есть просто шикарная возможность - он умеет сам создавать свою копию:
КопияСписка = Список.Скопировать(); // сделали копию списка // теперь можем смело менять КопияСписка // при этом исходный список меняться не будет КопияСписка[0].Значение = 123456; |
Умеет превращаться в массив
Ну и, наконец, вы можете в любой момент легко выгрузить все значения элементов списка в массив:
МассивЧисел = Список.ВыгрузитьЗначения(); // выгрузили в массив Для А = 0 По МассивЧисел.Количество() - 1 Цикл Сообщить(МассивЧисел[А]); // не нужно указывать поле Значение КонецЦикла; |
Подводим итог
Список значений уместно использовать вместо обычного массива в следующих случаях:
- если требуется какое-то интерактивное взаимодействие с пользователем в части выбора элемента из этого списка
- если требуются какие-то особенные возможности (например, сортировка)