Перейти к содержимому

❓ 6.5 Типизация переменных во встроенном языке “1С:Предприятие 8”


Во встроенном языке «1С:Предприятие» используется динамическая типизация.

Это означает, что тип закрепляется не за именем переменной, а за значением, которое находится в переменной в текущий момент.

Переменная → текущее значение → тип значения

Одна и та же переменная последовательно может содержать число, строку, дату или значение другого типа.

Данные = 100;
// В переменной находится значение типа Число
Данные = "Основной склад";
// Теперь в переменной находится значение типа Строка
Данные = Истина;
// Теперь в переменной находится значение типа Булево

Переменная — это именованное место, через которое программа обращается к некоторому значению.

Значение — это конкретные данные, имеющие определённый тип.

Например:

Данные = 100;

Эту операцию можно представить так:

Данные ─────► 100
Число

После следующего присваивания:

Данные = "Готово";

связь изменяется:

Данные ─────► "Готово"
Строка

Число 100 не превращается в строку "Готово". Переменная просто перестаёт содержать одно значение и начинает содержать другое.

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

Каждое созданное значение имеет определённый тип:

ЗначениеТип
100Число
"Склад"Строка
ИстинаБулево
ТекущаяДата()Дата
НеопределеноНеопределено

Текущий тип значения можно получить функцией ТипЗнч():

Данные = 100;
ТипДанных = ТипЗнч(Данные); // Число
Данные = "100";
ТипДанных = ТипЗнч(Данные); // Строка

В первом случае переменная содержит число, а во втором — строку. Несмотря на одинаковое внешнее представление, это значения разных типов.

Переменные модуля могут явно объявляться в разделе определения переменных с помощью оператора Перем.

Перем ТекущийПользователь;
Перем ПараметрыЗапуска Экспорт;

Оператор Перем объявляет имя переменной, но не задаёт её тип.

В объявлении нельзя указать, что переменная должна содержать исключительно число, строку или другой конкретный тип:

Перем Результат;

До присваивания такая переменная содержит значение Неопределено.

Перем Результат;
Если Результат = Неопределено Тогда
Результат = 0;
КонецЕсли;

После этого в ту же переменную можно поместить значение другого типа:

Результат = 0;
Результат = "Расчёт завершён";

Наличие оператора Перем не делает тип переменной фиксированным.

Локальную переменную процедуры или функции не требуется предварительно объявлять оператором Перем.

Новое имя переменной может быть определено при его первом появлении в левой части оператора присваивания.

Процедура РассчитатьСумму()
Сумма = 100;
КонецПроцедуры

Переменная Сумма предварительно не объявлена. Её определяет конструкция:

Сумма = 100;

Здесь:

Сумма = 100
│ │
│ └─ присваиваемое значение типа Число
└─ имя неявно определяемой переменной

После этого переменная может содержать значение другого типа:

Сумма = 100;
Сумма = "Не рассчитана";

Явное объявление не означает жёсткую типизацию

Заголовок раздела «Явное объявление не означает жёсткую типизацию»

Следующие понятия не следует смешивать:

ПонятиеЧто означает
Явное объявлениеИмя указано с помощью оператора Перем
Неявное определениеИмя впервые указано в левой части присваивания
Тип значенияОпределяется значением, находящимся в переменной
Жёсткое закрепление типаОграничение переменной одним заранее заданным типом

Во встроенном языке оператор Перем объявляет переменную, но не ограничивает набор типов значений, которые впоследствии могут быть ей присвоены.

Типы данных разделяются на:

  • мутабельные — изменяемые;
  • иммутабельные — неизменяемые.

Это свойство относится к значению, а не к переменной.

После создания состояние иммутабельного значения изменить нельзя.

К примитивным иммутабельным типам относятся:

  • Неопределено;
  • Null;
  • Число;
  • Строка;
  • Дата;
  • Булево.

Например:

Наименование = "Док";
Наименование = Наименование + "умент";

При выполнении второго оператора строка "Док" не дополняется новыми символами. Выражение создаёт новое строковое значение "Документ", которое затем помещается в переменную Наименование.

Схематично:

Наименование ─────► "Док"
После присваивания:
Наименование ─────► "Документ"

Прежнее значение "Док" не изменилось. Переменная получила другое значение.

Состояние мутабельного значения можно изменять без создания нового объекта.

Примерами служат:

  • Массив;
  • Структура;
  • ТаблицаЗначений;
  • объект справочника;
  • объект документа.
Товары = Новый Массив;
Товары.Добавить("Монитор");
Товары.Добавить("Клавиатура");

Метод Добавить() изменяет существующий массив.

Особенно важно учитывать присваивание мутабельных значений:

ПервыйМассив = Новый Массив;
ВторойМассив = ПервыйМассив;
ВторойМассив.Добавить("Товар");

Обе переменные связаны с одним и тем же массивом:

ПервыйМассив ───┐
├──► Массив
ВторойМассив ───┘

Поэтому изменение через переменную ВторойМассив будет видно и при обращении к массиву через переменную ПервыйМассив.

Присваивание мутабельного значения само по себе не создаёт его копию.

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

Ссылочный тип — это отдельная категория типов платформы. Такое значение содержит идентификатор, позволяющий обратиться к данным прикладного объекта.

Примеры:

  • СправочникСсылка.Номенклатура;
  • ДокументСсылка.РеализацияТоваровУслуг;
  • ПеречислениеСсылка.ВидыОпераций.

В имени такого типа явно присутствует слово Ссылка. Например: СправочникСсылка, ДокументСсылка, ПеречислениеСсылка

СсылкаНаТовар = Справочники.Номенклатура.НайтиПоКоду("000001");

Переменная СсылкаНаТовар содержит не изменяемый объект справочника, а ссылочное значение, идентифицирующее элемент.

Ссылочный тип является иммутабельным. Нельзя изменить реквизиты элемента непосредственно внутри значения ссылки.

Для изменения элемента справочника по ссылке получают его объект:

СсылкаНаТовар = Справочники.Номенклатура.НайтиПоКоду("000001");
ОбъектТовара = СсылкаНаТовар.ПолучитьОбъект();
ОбъектТовара.Наименование = "Новое наименование";
ОбъектТовара.Записать();

Здесь используются два разных значения:

ЗначениеНазначениеИзменяемость
СсылкаНаТоварИдентифицирует элемент справочникаИммутабельное
ОбъектТовараПозволяет изменять данные элементаМутабельное

Получение данных или объекта по ссылке называется разыменованием ссылки.

Переменная
└── содержит значение
├── значение имеет определённый тип
├── тип может быть изменяемым или неизменяемым
└── значение может относиться к ссылочному типу

Динамическая типизация определяет, может ли одна переменная содержать значения разных типов.

Мутабельность определяет, можно ли изменить состояние уже созданного значения.

Ссылочный тип определяет способ представления ссылки на данные прикладного объекта.

Это три связанных, но разных свойства.

Во встроенном языке тип определяется текущим значением переменной и не закрепляется за её именем. Поэтому одной переменной в разные моменты могут присваиваться значения разных типов.

Имя переменной может быть объявлено явно оператором Перем или определено неявно при первом появлении в левой части оператора присваивания. Явное объявление переменной не устанавливает для неё постоянный тип.