🚗
Мини-урок по программированию #1СКлючевые понятия: Тип - [Type] и ОписаниеТипов - [TypeDescription]Допустим мы делаем самую популярную задачу на 1С - парсинг текста с данными. Согласно алгоритму, если некий текст не можем распознать как число (например там пробел или прочерк), то его нужно интерпретировать как ноль. А если не можем распознать дату, то нужно указывать пустую. И если по ИНН не сможем найти сотрудника, то использовать пустую ссылку соответствующего справочника. Другими словами, по указанному типу мы или должны вычислить соответствующее ему значение, или указать значение по умолчанию.
Задание: Как получить значение типа по умолчанию?
Для начала отмечу, что Тип можно легко получить явно указав его в коде: Тип("Дата") - [
Type("Date")], Тип("СправочникСсылка.Сотрудники") -
[Type("CatalogRef.Employees")]. Так же тип можно получить по образцу значения: ТипЗнч(Образец) - [
TypeOf(Sample)].
1С не разрешает получать значение из самого Типа напрямую, так как в модели языка 1С значение Тип не является объектом - это примитив, как Число или Строка, у которых так же нет никаких методов. Поэтому, если мы не хотим писать огромную конструкцию Если... То... ИначеЕсли... То... - [
If... Then... ElsIf... Then...], то нам нужен более продвинутый инструмент.
На основании значения Типа можно создать объект типа ОписаниеТипов, у которого есть полезный метод ПривестиЗначение() - [
AdjustValue()], вызов которого без параметра и возвращает требуемое нам значение по умолчанию. Сложностью является только создать такой объект...
В конструкторе объекта ОписаниеТипов нельзя указать Тип напрямую - нужно передать массив типов. А при создании массива нельзя его сразу инициировать значениями - ни через конструктор, ни через вызов метода вокруг конструктора (в отличии от других ЯП, в 1С методы модификации массива не возвращают ссылку на массив и потому невозможны цепочки и вложения вызовов).
Итого, для получения значения по-умолчанию по указанному типу нужна конструкция:
МассивТипов = Новый Массив;
МассивТипов.Добавить(МойТип);
ОписаниеТипа = Новый ОписаниеТипов(МассивТипов);
МоеЗначение = ОписаниеТипа.ПривестиЗначение();
Или версия в более привычном английском синтаксисе:
TypeArray = New Array;
TypeArray.Add(MyType);
TypeDescription = New TypeDescription(TypeArray);
MyValue = TypeDescription.AdjustValue();
👨💻 Вопросы имеются?