В данной статье пойдет речь о том, какие коллекции значений есть во встроенном языке 1С, их особенности и для чего они применяются.
В материале освещены сразу два вопроса из собеседования программиста 1С:
- Чем отличается структура от соответствия?
- Можно ли сделать запрос по таблице значений?
Разработчику во встроенном языке доступны следующие объекты, описывающие коллекции:
Массив
Объект описывает коллекцию значений массива. У каждого элемента есть индекс. В 1С можно создавать многомерные массивы, например так:
Массив1 = Новый Массив(10,2,4)
В массиве можно искать элементы методом Найти(), но поскольку у массива нет индексов данный поиск выполняется не быстро. Метода сортировки массива разработчики 1С не добавили. Возможно, это сделано не просто так, т.к. сортировать можно другие коллекции
Массивы используются для передачи параметров в запрос, для выгрузки колонки таблицы значений, могут служить источником для списка значений.
Фиксированный массив
Тот же массив, но его элементы нельзя изменить, т.е. у него есть только методы Получить(), Найти(), ВГраница() и Количество(). Создается на основе обычного массива.
Данный объект как правило используется в свойствах интерфейсных объектов (элементов управления)
Список значений
Список значений можно представить в качестве следующей таблицы значений:
Список = Новый ТаблицаЗначений; Список.Колонки.Добавить("Пометка", Новый ОписаниеТипов("Булево")); Список.Колонки.Добавить("Значение"); Список.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); Список.Колонки.Добавить("Картинка", Новый ОписаниеТипов("Картинка"));
Как видно из структуры объекта, в поле «Значение» может быть любой объект.
Данный объект, в отличие от массива, уже содержит методы сортировки как по полю Значение, так и по полю Представление. Список значений можно заполнить элементами массива, используя метод ЗагрузитьЗначения().
Списки используются для передачи параметров в запрос, в качестве объекта сравнения в СКД и построителе, а также в отборах в интерфейсе.
Данный объект может быть отображен в интерфейсе, кроме того он имеет методы позволяющие показать диалог установки отметок в списке, диалог выбора значения из списка.
Структура
Структура представляет собой коллекцию пар КлючИЗначение. При этом ключ может быть только строковым и должен удовлетворять требованиям, предъявляемым к именованию переменных встроенного языка, т.е. ключом не может выступать строка «123ключ». К значениям структуры можно обращаться как к свойствам объекта. При этом ключ используется как имя свойства.
Пары Ключ-значение можно обойти циклом Для каждого … Из … Цикл, проверить существует ли свойство(ключ) структуры можно методом Свойство().
Структура используется обычно для хранения небольшого количества значений, каждое из которых имеет некоторое имя.
Соответствие
Соответствие как и структура представляет собой коллекцию пар КлючИЗначение. При этом, у соответствия в качестве ключа может выступать любое значение! Рекомендуется, чтобы в качестве ключа выступало значение примитивного типа или другого типа, значение которого может только присваиваться, но не может менять свое содержимое. Еще одной особенность соответствия является то, что это индексированная коллекция, т.е. поиск значения по ключу осуществляется очень быстро.
Пары Ключ-значение можно обойти циклом Для каждого … Из … Цикл.
Соответствие обычно используется в тех случаях, когда необходимо заполнить таблицу соответствия одного значения другому, причем размеры этой таблицы могут быть достаточно большими. Также очень удобно использовать соответствие в качестве кэша из-за высокой скорости поиска в нем.
Таблица значений
Таблица значений предназначена для хранения значений в табличном виде. Все основные операции с таблицей производятся именно через этот объект. Он позволяет манипулировать строками таблицы значений и предоставляет доступ к коллекции колонок. Колонки могут быть различных типов (в том числе множественных).
У таблицы значений есть метод Сортировать(), с помощью которого можно сортировать таблицу сразу по нескольким колонкам. С помощью метода Итог() можно сразу получить сумму колонки.
Можно выполнить запрос по таблице значений. Для этого необходимо чтобы все колонки таблицы значений были строго типизированы, т.е. вот такую таблицу нельзя отправить в запрос:
Таблица = Новый ТаблицаЗначений; Таблица.Колонки.Добавить("Значение");</pre> <p>А такую можно:</p> <pre>Таблица = Новый ТаблицаЗначений; Таблица.Колонки.Добавить("Пометка", Новый ОписаниеТипов("Булево")); Таблица.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Причем, в запросе необходимо сразу поместить выбранную таблицу во временную, а после этого выполнять действия с ней.
В управляемом приложении данный объект доступен только на сервере! Другими словами, попытка создать на клиенте равно как и передать таблицу значений с сервера на клиент приведет к ошибке.