6.5 Типизация переменных во встроенном языке "1С:Предприятие 8"
❓ 6.5 Типизация переменных во встроенном языке “1С:Предприятие 8”
📚 Документация
Заголовок раздела «📚 Документация»- ИТС: Руководство разработчика — 4.3. Типы данных и переменные, 4.3.1. Общая информация https://its.1c.ru/db/v854doc/bookmark/dev/TI000000116
🧠 Краткая теория
Заголовок раздела «🧠 Краткая теория»Во встроенном языке «1С:Предприятие» используется динамическая типизация.
Это означает, что тип закрепляется не за именем переменной, а за значением, которое находится в переменной в текущий момент.
Переменная → текущее значение → тип значенияОдна и та же переменная последовательно может содержать число, строку, дату или значение другого типа.
Данные = 100;// В переменной находится значение типа Число
Данные = "Основной склад";// Теперь в переменной находится значение типа Строка
Данные = Истина;// Теперь в переменной находится значение типа БулевоПеременная и значение — не одно и то же
Заголовок раздела «Переменная и значение — не одно и то же»Переменная — это именованное место, через которое программа обращается к некоторому значению.
Значение — это конкретные данные, имеющие определённый тип.
Например:
Данные = 100;Эту операцию можно представить так:
Данные ─────► 100 ЧислоПосле следующего присваивания:
Данные = "Готово";связь изменяется:
Данные ─────► "Готово" СтрокаЧисло 100 не превращается в строку "Готово". Переменная просто перестаёт содержать одно значение и начинает содержать другое.
Поэтому корректнее говорить не о том, что у переменной изменился постоянный тип, а о том, что в переменную было помещено значение другого типа.
Тип принадлежит значению
Заголовок раздела «Тип принадлежит значению»Каждое созданное значение имеет определённый тип:
| Значение | Тип |
|---|---|
100 | Число |
"Склад" | Строка |
Истина | Булево |
ТекущаяДата() | Дата |
Неопределено | Неопределено |
Текущий тип значения можно получить функцией ТипЗнч():
Данные = 100;ТипДанных = ТипЗнч(Данные); // Число
Данные = "100";ТипДанных = ТипЗнч(Данные); // СтрокаВ первом случае переменная содержит число, а во втором — строку. Несмотря на одинаковое внешнее представление, это значения разных типов.
Явное определение переменной
Заголовок раздела «Явное определение переменной»Переменные модуля могут явно объявляться в разделе определения переменных с помощью оператора Перем.
Перем ТекущийПользователь;Перем ПараметрыЗапуска Экспорт;Оператор Перем объявляет имя переменной, но не задаёт её тип.
В объявлении нельзя указать, что переменная должна содержать исключительно число, строку или другой конкретный тип:
Перем Результат;До присваивания такая переменная содержит значение Неопределено.
Перем Результат;
Если Результат = Неопределено Тогда Результат = 0;КонецЕсли;После этого в ту же переменную можно поместить значение другого типа:
Результат = 0;Результат = "Расчёт завершён";Наличие оператора Перем не делает тип переменной фиксированным.
Неявное определение переменной
Заголовок раздела «Неявное определение переменной»Локальную переменную процедуры или функции не требуется предварительно объявлять оператором Перем.
Новое имя переменной может быть определено при его первом появлении в левой части оператора присваивания.
Процедура РассчитатьСумму()
Сумма = 100;
КонецПроцедурыПеременная Сумма предварительно не объявлена. Её определяет конструкция:
Сумма = 100;Здесь:
Сумма = 100 │ │ │ └─ присваиваемое значение типа Число └─ имя неявно определяемой переменнойПосле этого переменная может содержать значение другого типа:
Сумма = 100;Сумма = "Не рассчитана";Явное объявление не означает жёсткую типизацию
Заголовок раздела «Явное объявление не означает жёсткую типизацию»Следующие понятия не следует смешивать:
| Понятие | Что означает |
|---|---|
| Явное объявление | Имя указано с помощью оператора Перем |
| Неявное определение | Имя впервые указано в левой части присваивания |
| Тип значения | Определяется значением, находящимся в переменной |
| Жёсткое закрепление типа | Ограничение переменной одним заранее заданным типом |
Во встроенном языке оператор Перем объявляет переменную, но не ограничивает набор типов значений, которые впоследствии могут быть ей присвоены.
Дополнительная информация
Заголовок раздела «Дополнительная информация»Изменяемые и неизменяемые типы
Заголовок раздела «Изменяемые и неизменяемые типы»Типы данных разделяются на:
- мутабельные — изменяемые;
- иммутабельные — неизменяемые.
Это свойство относится к значению, а не к переменной.
Иммутабельные значения
Заголовок раздела «Иммутабельные значения»После создания состояние иммутабельного значения изменить нельзя.
К примитивным иммутабельным типам относятся:
Неопределено;Null;Число;Строка;Дата;Булево.
Например:
Наименование = "Док";Наименование = Наименование + "умент";При выполнении второго оператора строка "Док" не дополняется новыми символами. Выражение создаёт новое строковое значение "Документ", которое затем помещается в переменную Наименование.
Схематично:
Наименование ─────► "Док"
После присваивания:
Наименование ─────► "Документ"Прежнее значение "Док" не изменилось. Переменная получила другое значение.
Мутабельные значения
Заголовок раздела «Мутабельные значения»Состояние мутабельного значения можно изменять без создания нового объекта.
Примерами служат:
Массив;Структура;ТаблицаЗначений;- объект справочника;
- объект документа.
Товары = Новый Массив;Товары.Добавить("Монитор");Товары.Добавить("Клавиатура");Метод Добавить() изменяет существующий массив.
Особенно важно учитывать присваивание мутабельных значений:
ПервыйМассив = Новый Массив;ВторойМассив = ПервыйМассив;
ВторойМассив.Добавить("Товар");Обе переменные связаны с одним и тем же массивом:
ПервыйМассив ───┐ ├──► МассивВторойМассив ───┘Поэтому изменение через переменную ВторойМассив будет видно и при обращении к массиву через переменную ПервыйМассив.
Присваивание мутабельного значения само по себе не создаёт его копию.
Что означает ссылочный тип данных
Заголовок раздела «Что означает ссылочный тип данных»Понятие ссылочного типа данных не следует смешивать с общим утверждением о том, что переменная связана со значением.
Ссылочный тип — это отдельная категория типов платформы. Такое значение содержит идентификатор, позволяющий обратиться к данным прикладного объекта.
Примеры:
СправочникСсылка.Номенклатура;ДокументСсылка.РеализацияТоваровУслуг;ПеречислениеСсылка.ВидыОпераций.
В имени такого типа явно присутствует слово Ссылка.
Например: СправочникСсылка, ДокументСсылка, ПеречислениеСсылка
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоКоду("000001");Переменная СсылкаНаТовар содержит не изменяемый объект справочника, а ссылочное значение, идентифицирующее элемент.
Ссылочный тип является иммутабельным. Нельзя изменить реквизиты элемента непосредственно внутри значения ссылки.
Для изменения элемента справочника по ссылке получают его объект:
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоКоду("000001");
ОбъектТовара = СсылкаНаТовар.ПолучитьОбъект();ОбъектТовара.Наименование = "Новое наименование";ОбъектТовара.Записать();Здесь используются два разных значения:
| Значение | Назначение | Изменяемость |
|---|---|---|
СсылкаНаТовар | Идентифицирует элемент справочника | Иммутабельное |
ОбъектТовара | Позволяет изменять данные элемента | Мутабельное |
Получение данных или объекта по ссылке называется разыменованием ссылки.
Как связаны эти понятия
Заголовок раздела «Как связаны эти понятия»Переменная │ └── содержит значение │ ├── значение имеет определённый тип │ ├── тип может быть изменяемым или неизменяемым │ └── значение может относиться к ссылочному типуДинамическая типизация определяет, может ли одна переменная содержать значения разных типов.
Мутабельность определяет, можно ли изменить состояние уже созданного значения.
Ссылочный тип определяет способ представления ссылки на данные прикладного объекта.
Это три связанных, но разных свойства.
🧠 Ключевая мысль
Заголовок раздела «🧠 Ключевая мысль»Во встроенном языке тип определяется текущим значением переменной и не закрепляется за её именем. Поэтому одной переменной в разные моменты могут присваиваться значения разных типов.
Имя переменной может быть объявлено явно оператором Перем или определено неявно при первом появлении в левой части оператора присваивания. Явное объявление переменной не устанавливает для неё постоянный тип.