[Alimir_BootModal_Login]

Внутренний язык программирования 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 Цикл
    Сообщить(МассивЧисел[А]); // не нужно указывать поле Значение
КонецЦикла;

Подводим итог

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

  • если требуется какое-то интерактивное взаимодействие с пользователем в части выбора элемента из этого списка
  • если требуются какие-то особенные возможности (например, сортировка)

Пройдите тест

Начать тест

Домашнее задание

Необходимо ввести от пользователя 5 чисел, найти наибольшее и наименьшее из них и вывести их пользователю. В решении должен использоваться список значений.

Эталонное решение. Сначала пишем код сами, проверяем на компьютере (как и все примеры программ из уроков), только потом сверяемся

Дополнение

Данный материал рассчитан на начинающих разработчиков. Если он показался вам слишком лёгким - рассмотрите другие примеры использования списка значений в 1С (ссылка).

Для учеников

Уровень сложности уроков идёт снизу вверх. Поэтому старайтесь заниматься последовательно, ничего не пропуская и не откладывая на потом.

Обязательно выполняйте все тесты и домашние задания, старайтесь улучшить свои результаты. Сверяйтесь с эталонными решениями только после самостоятельного выполнения задач.

На вопросы учеников — отвечаю по почте,  но прежде загляните в ЧАВО (ссылка) .

С уважением, Владимир Милькин