Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1C_ПрикладноеПрограммирование8.doc
Скачиваний:
45
Добавлен:
22.09.2019
Размер:
51.67 Mб
Скачать

1.4.5.5 Список значений, таблица значений, дерево значений

Все эти объекты являются универсальными коллекциями, то есть объектами, предназначенным для работы с не хранящимися в базе данных совокупностями значений. Необходимость в использовании списка значений возникает, когда требуется работать с временным набором данных для решения интерфейсных задач. Дело в том, что в отличие от более простых универсальных коллекций (массива, структуры, соответствия) список зна чений состоит из объектов – «ЭлементСпискаЗначений». А элемент списка значений характеризуется следующим набором свойств:

  • Значение;

  • Представление. Содержит строковое пользовательское представление, т.е именно его пользователь увидит на экране. По умолчанию – генерируется автоматически;

  • Пометка;

  • Картинка;

Применение списков значений для обычных задач универсальных коллекций, но не связанных с интерфейсными действиями, как правило - излишне. Обычно с этой функциональностью справляются объекты попроще: «Массив», «Структура», «Соответствие».

Таблицы значений позволяют работать с данными сущностей, представимых в виде таблиц, то есть раскладываемых на колонки и строки. А ведь с точки зрения многих систем автоматизации вообще весь мир - это совокупность таблиц. При этом можно:

  • добавлять/удалять данные (и колонки, и строки, и значения);

  • искать данные (и колонки, и строки, и значения); сортировать данные (по любым колонкам);

  • выгружать-загружать данные;

  • подсчитывать итоги по колонкам;

  • сворачивать данные и т.д.

Дерево значений позволяет в добавление к вышеприведенным операциям еще вводить уровни иерархии для этих данных и оперировать в пределах уровней или игнорируя их.

Подобный набор возможностей помогает решать самый широкий спектр задач промежуточной обработки данных произвольного типа.

1.4.5.5.1 Список значений

Список значений — это объект позволяющий строить динамические наборы значений и манипулировать ими. Может быть наполнен значениями любых типов. Условно список значений можно представить как таблицу из пяти колонок: индекс (индекс — скорее не колонка, а позиция элемента), пометка, значение, представление, картинка.

Список значений можно создать посредством конструктора «Новый»:

СозданныйСписок=Новый СписокЗначений;

где СозданныйСписок - имя переменной, которая будет содержать созданный объект типа «СписокЗначений».

Например, требуется добавить в список значений «СписокСотрудников» новый элемент со значением ссылки на сотрудника (содержится в переменной «ТекущийСотрудник»), ФИО сотрудника в качестве представления (содержится в реквизите «ФИО» объекта «ТекущийСотрудник») и фотографии сотрудника в качестве картинки (содержится в переменной «Фото»):

СписокСотрудников.Добавить()ТекущийСотрудник,

ТекущийСотрудник.ФИО,Фото);

Если нужно, чтобы новые значения добавлялись с определенным индексом (переменная «Инд»), то можно использовать метод «Вставить()»:

СписокСотрудников.Вставить(Инд, ТекущийСотрудник, ТекущийСотрудник.ФИО,Фото);

Если при этом в списке значений уже был элемент с таким индексом, то старый элемент получит индекс на единицу больше предыдущего; аналогично сдвинутся индексы у всех последующих. Если при использовании метода «Вставить()» указать индекс, выходящий за границы списка, - получим сообщение об ошибке.

Например, в списке значений «СписокСотрудников» надо найти элемент, в котором в качестве значения указан сотрудник, на которого ссылается переменная «ИскомыйСотрудник». Затем нужно сообщить индекс найденного элемента.

Это можно выполнить следующим образом:

ЭлементСписка=СписокСотрудников.НайтиПоЗначению

(ИскомыйСотрудник);

Если ЭлементСписка<>Неопределено Тогда

Сообщить(СписокСотрудников.Индекс(ЭлементСписка));

КонецЕсли;

Если искомое значение в списке может встретиться несколько раз - при таком подходе найдем только первый элемент, где оно содержится. Поэтому надо смотреть по ситуации. Поскольку список значения - объект, предназначенный, прежде всего для визуализации возможностей выбора пользователем, обычно при его заполнении уже сразу предотвращают возможность повторов.

Если же такая возможность осмыслена, то получить все элементы списка значений, содержащие определенное значение можно, например, в цикле перебора элементов списка значений.

Если требуется получить доступ к элементу списка значений с определенным индексом (пусть содержится в переменной «Инд»), можно поступить так:

ЭлементСписка=СписокСотрудников[Инд];

или так:

ЭлементСписка=СписокСотрудников.Получить(Инд);

В любом случае - то, что получаем, еще не есть значение, заложенное в этот элемент списка (это еще не сотрудник), а именно объект типа «ЭлементСпискаЗначений».

Впоследствии с него можно считать значения свойств:

Сотрудник=ЭлементСписка.Значение;

Представление=ЭлементСписка.Представление;

Картинка=ЭлементСписка.Картинка;

Поскольку имеем дело с индексированной коллекцией, то можно использовать цикл перебора элементов коллекции или «цикл-счетчик». Например, чтобы сообщить значения всех элементов списка значений «СписокСотрудников», можно использовать следующий код:

Для Каждого ЭлементСписка Из СписокСотрудников Цикл

Сообщить(ЭлементСписка.Значение);

КонецЦикла;

То же через «цикл-счетчик»:

СтаршийИндекс=СписокСотрудников.Количество()-1;

Для Сч=0 по СтаршийИндекс Цикл

Сообщить(СписокСотрудников[Сч].Значение);

КонецЦикла;

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

СписокСотрудников.Удалить(0);

Естественно, если указанный индекс будет выходить за границу индексов списка - получим сообщение об ошибке. Кроме того, необходимо учитывать, что удаление элемента из середины списка приведет к уменьшению на единицу индексов элементов, стоявших после удаленного. Список значений сомкнет ряды.

Решим задачу удаления всех элементов списка значений «СписокОбъектов», содержащих числовые значения:

Индекс=СписокОбъектов.Количество()-1;

Пока Индекс>=0 Цикл

Если ТипЗнч(СписокОбъектов[Индекс].Значение)=Тип(«Число») Тогда

СписокОбъектов.Удалить(Индекс);

КонецЕсли;

Индекс=Индекс-1;

КонецЦикла;

Сначала определяем самый старший индекс элементов списка значений. Цикл проверок и удалений элементов будет выполняться, пока очередное значение индекса не окажется меньше нуля. В цикле определяем тип значения элемента с текущим индексом. Если это число - удаляем данный элемент. Кроме того, в любом случае уменьшаем на единицу значение переменной «Индекс». В результате, поскольку перебор элементов списка значений производится с конца, то эффект «смыкания рядов» будет актуален только для уже проверенных элементов.