В языке «1С:Предприятия» не использовались обобщенные типы.
Теперь в языке «Элемента» применяются обобщенные типы, чтобы типизировать элементы коллекций. То есть при объявлении коллекций указывается тип содержащихся в них элементов.
Зачем нужно типизировать содержимое коллекций?
Например, в языке «1С:Предприятия» было известно, что в метод придет массив чисел. Соответственно, алгоритм этого метода рассчитан на то, что в массиве числа. Но вдруг пришел массив, в котором есть строки, и на этом приложение выдаст ошибку во время выполнения.
Теперь же в языке «Элемента» в тексте программы указано, что массив должен состоять из чисел. И если компилятор обнаружит, что в какой-то ветке алгоритма в этом массиве появляются строки, он сразу же выдаст ошибку еще до начала выполнения приложения. Причем информация о типах-параметрах обобщенного типа сохраняется до времени выполнения приложения.
Например, объявляется массив, состоящий из чисел:
пер МассивЧисел: Массив<Число>
Это означает, что в массиве будут храниться числа. И уже не получится добавить в этот массив строки (МассивЧисел.Добавить("333")) – будет получена ошибка несоответствия типа аргумента.
Или, например, можно написать:
пер СуммаЧисел = 3 + МассивЧисел[0]
Компилятор поймет, что в массиве МассивЧисел только числа, и не потребует преобразования МассивЧисел[0] к числу.
При создании экземпляра коллекции с помощью конструктора тип элементов коллекции указывается в угловых скобках после имени типа, без пробела. Причем элемент коллекции может иметь составной тип. Например:
// Создание экземпляра массива
пер МассивЧисел = новый Массив<Число>()
// Создание экземпляра соответствия
пер ЭтапыРаботы = новый Соответствие<Строка|Дата, Число|Строка>()
// Создание экземпляра множества
пер МножествоСДанными = новый Множество<Число|Строка>()
При создании экземпляра коллекции с помощью литерала тип элементов коллекции можно явно указать слева от списка элементов в угловых скобках без пробела, если в коллекцию нужно добавлять элементы, типы которых отличаются от перечисленных в литерале. Например:
// Создание экземпляра массива с помощью литерала
пер Строки = ["один", "два", "три"]
// В следующий массив можно добавлять и числа тоже
пер ЧислаИСтроки = <Число|Строка>["один", "три"]
// Создание экземпляра соответствия с помощью литерала
пер КурсыВалют = {"RUB": 1, "BYN": 31.01}
// В качестве значения соответствия можно указывать еще и процент выполнения работы числом
пер СрокиРаботы = <Дата, Число|Строка>{Дата{2022-07-03} : "Выполнено", Дата{2022-08-15} : "Планируется"}
// Создание экземпляра множества с помощью литерала
пер МножествоСДанными = {1, 2, 3}
// В следующее множество можно добавлять и строки тоже
пер МножествоСДанными = <Число|Строка>{1, 2}
Тип элементов коллекций определяется следующим образом:
пер Массив1 = <Число>[1]
пер ТипМассива = Массив1.ПолучитьТип() // Тип: Массив<Число>
пер Массив2: ЧитаемыйМассив<Число>
Массив2 = [1]
ТипМассива = Массив2.ПолучитьТип() // Тип: ЧитаемыйМассив<Число>
пер Массив3 = [1, Истина]
ТипМассива = Массив3.ПолучитьТип() // Тип: Массив<Булево|Число>
Кроме того, можно создать пустую типизированную коллекцию с помощью пустого литерала. Например:
// Пустой массив
пер МассивСтрок = <Строка>[]
// Пустое соответствие
пер ЭтапыРаботы = <Строка, Число>{:}
// Пустое множество
пер МножествоЧисел = <Число>{}
Сравнение экземпляров обобщенных типов не учитывает параметры обобщенного типа. Например:
пер Соответствие1 = новый Соответствие<Объект, Объект>()
Соответствие1.Вставить(1, 2)
пер Соответствие2 = новый Соответствие<Число, Число>()
Соответствие2.Вставить(1, 2)
если Соответствие1 == Соответствие2
Сообщить("истина") //соответствия равны
;