К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С: как задать тип переменной

Как задать тип переменной в 1С: динамическая типизация во встроенном языке, типы реквизитов и колонок, ОписаниеТипов, проверка типа значения и частые ошибки.

Во встроенном языке 1С переменные имеют динамическую типизацию: тип не объявляется заранее, а определяется значением, которое присвоено переменной в конкретный момент. Одна и та же переменная сначала может хранить строку, затем число, затем ссылку на документ — платформа не выдаст ошибку при смене типа.

Однако «задать тип» в 1С всё же требуется — но не для локальных переменных процедур, а для реквизитов объектов метаданных, колонок таблиц значений, параметров запросов и полей форм. Там тип задаётся явно через палитру типов в конфигураторе или через объект ОписаниеТипов в коде.

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

Как устроена типизация переменных во встроенном языке

Переменная в 1С создаётся либо явно через инструкцию Перем, либо неявно — при первом присваивании. В обоих случаях тип не указывается:

Перем Сумма;        // тип пока Неопределено

Сумма = 1500.50; // теперь это Число

Сумма = "Оплачено"; // теперь это Строка — ошибки не будет

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

Практический вывод: раз тип переменной нельзя зафиксировать, его нужно контролировать логикой кода — проверками перед операциями, осмысленными именами переменных и инициализацией значениями нужного типа.

Как задать тип реквизиту в конфигураторе

Наиболее частая задача «задать тип» возникает при создании реквизита справочника, документа, обработки или ресурса регистра. Здесь типизация строгая, и платформа контролирует её автоматически.

Порядок действий в конфигураторе:

Порядок действий
  1. 1
    Откройте объект метаданных (справочник, документ, обработку) и добавьте новый реквизит.
  2. 2
    В палитре свойств найдите поле «Тип» и нажмите кнопку выбора.
  3. 3
    Отметьте нужные типы: примитивные (Строка, Число, Дата, Булево) или ссылочные (СправочникСсылка, ДокументСсылка и т.д.).
  4. 4
    Для Строки задайте длину, для Числа — длину и точность, для Даты — состав (дата, время или дата и время).
  5. 5
    Если реквизит может хранить значения разных типов, отметьте несколько — получится составной тип.
  6. 6
    Сохраните конфигурацию и обновите конфигурацию базы данных (F7).

Для составного типа включите флажок, разрешающий выбор нескольких типов. Учтите: составные типы усложняют индексирование и запросы — поле с неограниченным составом типов хранится менее эффективно, а сравнения в запросах могут работать медленнее.

После изменения типа существующего реквизита, в котором уже есть данные, платформа при обновлении конфигурации базы данных попытается преобразовать значения. Если преобразование невозможно (например, ссылку в число), значение будет очищено. Перед таким изменением обязательно сделайте резервную копию.

Как задать тип через ОписаниеТипов в коде

Когда тип нужно задать программно — для колонки таблицы значений, реквизита формы, поля компоновки данных — используется объект ОписаниеТипов. Он создаётся конструктором Новый ОписаниеТипов().

// Один тип

ОписаниеЧисла = Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(15, 2));

ОписаниеСтроки = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));

// Составной тип — перечисление через запятую

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

// Применение: колонка таблицы значений

Таблица = Новый ТаблицаЗначений;

Таблица.Колонки.Добавить("Сумма", ОписаниеЧисла);

Таблица.Колонки.Добавить("Комментарий", ОписаниеСтроки);

Квалификаторы уточняют тип: КвалификаторыЧисла задают длину и точность, КвалификаторыСтроки — максимальную длину и допустимость неограниченной строки, КвалификаторыДаты — состав даты. Без квалификаторов число получит параметры по умолчанию, что иногда приводит к неожиданному округлению.

Если нужно получить описание типов существующего реквизита (например, чтобы создать колонку точно такого же типа), используйте выгрузку через Документы.ИмяДокумента.ПустаяСсылка().Метаданные().Реквизиты.ИмяРеквизита.Тип или получите тип из пустой таблицы запроса.

1c
ОписаниеТипа = Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,2));
ТЗ.Колонки.Добавить("Сумма", ОписаниеТипа);

Как проверить и преобразовать тип значения в коде

Раз тип переменной не фиксируется, перед операциями часто требуется проверка. Для этого служат функции ТипЗнч() и Тип():

Если ТипЗнч(Параметр) = Тип("Число") Тогда

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

ИначеЕсли ТипЗнч(Параметр) = Тип("СправочникСсылка.Номенклатура") Тогда

Результат = Параметр.ПолучитьОбъект();

Иначе

ВызватьИсключение "Неподдерживаемый тип параметра";

КонецЕсли;

Для преобразования типов используются функции Число(), Строка(), Дата(), Булево() и XMLЗначение(). Учтите, что Число("abc") вызовет ошибку выполнения — перед преобразованием строки в число проверяйте содержимое или оборачивайте вызов в Попытка...Исключение.

Отдельный случай — значение Неопределено и NULL (последнее встречается в результатах запросов). Сравнивать их между собой нельзя: NULL = Неопределено вернёт ложь. Для NULL в запросах используйте функцию ЕСТЬNULL(), а в коде проверяйте оба варианта, если данные приходят из запроса.

Контрольные точки

Как проверить результат

Тип реквизита в конфигураторе
Норма

В палитре свойств указан нужный тип, база обновилась без ошибок

Тревожный признак

При обновлении предупреждения о преобразовании или потере данных

Колонка таблицы значений
Норма

При присвоении значения другого типа оно приводится к типу колонки

Тревожный признак

Значения записываются как есть — колонка создана без ОписаниеТипов

Проверка типа в коде
Норма

ТипЗнч() возвращает ожидаемый тип, ветки условий срабатывают

Тревожный признак

Сравнение с Тип() всегда ложно — проверьте точное имя типа

Типизация параметров запросов и полей формы

При передаче параметра в запрос через Запрос.УстановитьПараметр() тип определяется переданным значением. Проблема возникает с пустыми значениями: если передать пустую ссылку или Неопределено, платформа может не вывести тип параметра. Решение — использовать функцию ВЫРАЗИТЬ() в тексте запроса:

Запрос.Текст = "ВЫБРАТЬ * ИЗ Документ.Реализация

|ГДЕ Контрагент = ВЫРАЗИТЬ(&Контрагент КАК Справочник.Контрагенты)";

Для реквизитов управляемой формы тип задаётся при создании реквизита — в дереве реквизитов формы через свойство «Тип» или программно через массив ДобавляемыеРеквизиты с указанием ОписаниеТипов. Элемент формы, связанный с реквизитом, автоматически получит соответствующий контроль ввода.

Составные типы: когда оправданы и чем опасны

Составной тип позволяет реквизиту хранить значения нескольких типов — например, «Контрагент» как ссылку на справочник контрагентов или на физических лиц. Это удобно для универсальных механизмов, но имеет цену.

Основные ограничения составных типов: более сложная структура хранения в базе данных, замедление соединений в запросах, невозможность части проверок на уровне СУБД. Поле с типом «строка неограниченной длины» или произвольным составом может вообще не попасть в индекс.

Практическая рекомендация: используйте составной тип только когда разные типы действительно будут встречаться в данных. Если в 99% случаев хранится один тип, лучше сделать основной реквизит строгого типа, а редкие случаи обрабатывать отдельным механизмом.

Типичные ошибки
01
Попытка «объявить» тип локальной переменной как в C# или Java — в 1С такого синтаксиса нет, тип задаётся только присваиванием.
02
Создание колонки таблицы значений без ОписаниеТипов — колонка примет любые значения, и сортировка чисел как строк даст неверный порядок.
03
Сравнение NULL с Неопределено — условие никогда не выполнится, используйте ЕСТЬNULL() в запросе.
04
Сужение типа реквизита без копии базы — данные, не поддающиеся преобразованию, будут очищены безвозвратно.
05
Опечатка в имени типа в Тип("СправочникСсылка.Номенклатра") — функция вызовет исключение во время выполнения, а не при сохранении модуля.

Частые вопросы

Можно ли объявить переменную с фиксированным типом, как в других языках?

Нет, встроенный язык 1С не поддерживает объявление типа переменной. Тип определяется присвоенным значением и может меняться. Для контроля используйте проверки через ТипЗнч() и осмысленные имена переменных, отражающие ожидаемое содержимое.

Чем отличается ТипЗнч() от Тип()?

ТипЗнч(Значение) возвращает тип конкретного значения, а Тип("ИмяТипа") возвращает тип по его строковому имени. Обычно они используются в паре: ТипЗнч(Переменная) = Тип("Число") — так проверяется соответствие значения ожидаемому типу.

Как задать тип колонки динамического списка или таблицы на форме?

Для реквизита формы тип указывается в свойствах реквизита или через ОписаниеТипов при программном добавлении. Для динамического списка типы полей определяются запросом — при необходимости используйте ВЫРАЗИТЬ() в тексте запроса списка.

Что произойдёт с данными при изменении типа реквизита?

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

Как проверить, что строка содержит число, перед преобразованием?

Надёжный способ — обернуть вызов Число() в конструкцию Попытка...Исключение и в ветке Исключение обработать ошибку. Альтернатива — проверить строку регулярным выражением или посимвольно, но Попытка проще и безопаснее.

Что такое Неопределено и когда переменная его содержит?

Неопределено — специальное значение, означающее отсутствие значения. Переменная, объявленная через Перем, но не получившая присваивания, содержит Неопределено. Также его возвращают функции без явного Возврат и обращения к несуществующим свойствам через точку в безопасном режиме.

Итог

Что важно запомнить

Тип переменной в 1С не объявляется — он задаётся присваиванием и может меняться. Явная типизация применяется к реквизитам метаданных, колонкам таблиц значений и полям форм: в конфигураторе через палитру свойств, в коде через ОписаниеТипов. Проверяйте типы функциями ТипЗнч() и Тип(), а перед изменением типа реквизита с данными делайте резервную копию.