Разработка и Конфигурация · 11 мин
Как объявить тип переменной в 1С
Разбираем, как объявить переменную в 1С: неявное и явное задание типа, конструкторы, ОписаниеТипов, типизация параметров и реквизитов, типичные ошибки.
Встроенный язык 1С относится к языкам с динамической типизацией: при объявлении переменной через Перем её тип не указывается. Переменная получает тип в момент присваивания значения, и этот тип может меняться в ходе выполнения кода. Поэтому фраза «объявить тип переменной» в 1С означает не синтаксическую конструкцию, а набор приёмов, с помощью которых разработчик контролирует, какие значения попадут в переменную.
Такая гибкость ускоряет разработку, но создаёт риски: переменная, в которую ожидалось число, может получить строку или Неопределено, и ошибка всплывёт только в момент использования значения. Чтобы этого избежать, в 1С применяют инициализацию значением нужного типа, объект ОписаниеТипов, явное приведение через функции преобразования и проверку типа перед использованием.
Ниже разобраны все рабочие способы задать и контролировать тип переменной: от простейшего присваивания до типизации реквизитов формы и параметров процедур. Материал ориентирован на конфигурации, работающие в режиме управляемого приложения, но большинство приёмов актуальны и для обычных форм.
Как устроена типизация переменных в 1С
Объявление переменной выполняется ключевым словом Перем. На этом этапе переменная не имеет ни значения, ни типа — фактически она содержит Неопределено:
Перем СуммаДокумента; // значение Неопределено, тип ещё не задан
СуммаДокумента = 1500.50; // теперь тип — Число
Если далее присвоить той же переменной строку, тип изменится без ошибки компиляции. Это законное поведение языка, но в реальных модулях оно почти всегда указывает на дефект логики. Платформа не защищает от такой подмены, поэтому дисциплина типизации лежит на разработчике.
Определить фактический тип значения в любой момент можно функцией ТипЗнч(), а сравнить с нужным типом — через функцию Тип():
Если ТипЗнч(СуммаДокумента) <> Тип("Число") Тогда
ВызватьИсключение "Ожидалось числовое значение суммы";
КонецЕсли;
Инициализация значением нужного типа
Самый распространённый приём «объявить тип» — сразу присвоить переменной значение-заглушку требуемого типа. Это делает код предсказуемым и упрощает чтение: по первому присваиванию видно, что автор ожидал хранить в переменной.
Количество = 0; // Число
Цена = 0.00; // Число
Наименование = ""; // Строка
ДатаОтгрузки = Дата(1,1,1); // пустая Дата
ЭтоПроведён = Ложь; // Булево
ТаблицаТоваров = Новый ТаблицаЗначений; // объектный тип
Для ссылочных типов пустую ссылку получают через менеджер объекта: Справочники.Номенклатура.ПустаяСсылка() или Документы.РеализацияТоваровУслуг.ПустаяСсылка(). Такая инициализация предпочтительнее Неопределено, потому что пустую ссылку можно безопасно сравнивать и передавать в запросы без дополнительных проверок на NULL-подобные значения.
Обратите внимание на дату: конструктор Дата(1,1,1) создаёт «пустую» дату, а присваивание строки вида "01.01.2026" создаст строку, а не дату. Преобразование строки в дату выполняется функцией Дата() с числовыми аргументами либо через ОписаниеТипов.
Явное задание типа через ОписаниеТипов
Объект ОписаниеТипов — основной инструмент формальной работы с типами. Он описывает допустимый состав типов, длину строки, точность числа и позволяет привести произвольное значение к заданному типу методом ПривестиЗначение().
ОписаниеЧисла = Новый ОписаниеТипов("Число",
Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой));
Сумма = ОписаниеЧисла.ПривестиЗначение(ВходящееЗначение);
Если входящее значение невозможно преобразовать (например, произвольную строку в число), метод вернёт значение по умолчанию для этого типа — для числа это 0, для строки пустую строку. Исключения не возникает, поэтому приведение безопасно для пользовательского ввода, но способно скрыть ошибку данных: вместо «нечислового» значения вы молча получите ноль.
ОписаниеТипов обязательно применяется при программном создании колонок таблицы значений и реквизитов формы — там тип задаётся именно этим объектом, а не присваиванием:
ТаблицаТоваров.Колонки.Добавить("Цена",
Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
Типизация параметров процедур и функций
Параметры процедур и функций объявляются без типа, как и обычные переменные. Контроль типа на входе — распространённая практика в серверных модулях и API-подобных функциях, куда значения приходят извне.
Функция РассчитатьСкидку(СуммаПокупки, Процент) Экспорт
Если ТипЗнч(СуммаПокупки) <> Тип("Число")
Или ТипЗнч(Процент) <> Тип("Число") Тогда
ВызватьИсключение "Параметры должны быть числами";
КонецЕсли;
Возврат СуммаПокупки * Процент / 100;
КонецФункции
Альтернатива исключению — мягкое приведение через ОписаниеТипов или функции Число(), Строка(), Дата(). Выбор зависит от контекста: для внутренних вызовов лучше жёсткая проверка с исключением (ошибка обнаружится при тестировании), для данных от пользователя или обмена — приведение с последующей валидацией результата.
Как выбрать способ контроля типа
Типизация реквизитов форм и элементов данных
Когда «переменной» выступает реквизит формы или объекта конфигурации, тип задаётся декларативно — в свойствах реквизита в конфигураторе или через ОписаниеТипов при программном добавлении. Платформа тогда сама ограничивает ввод: в поле с типом «Число» пользователь физически не сможет ввести произвольный текст.
Программное добавление реквизита управляемой формы выполняется через массив ДобавляемыеРеквизиты с объектами ОписаниеРеквизитаФормы, где тип указывается тем же ОписаниеТипов. Это единственный сценарий, где 1С позволяет «объявить тип переменной» в классическом смысле — с ограничением на уровне платформы.
Составной тип (например, «Число или Строка») задаётся перечислением типов через запятую: Новый ОписаниеТипов("Число,Строка", ...). Для реквизитов объектов составные типы увеличивают размер индексов и усложняют запросы, поэтому без необходимости их лучше избегать.
- 1Создайте объект ОписаниеТипов с нужным составом типов и квалификаторами
- 2Сформируйте ОписаниеРеквизитаФормы, указав имя и описание типов
- 3Добавьте реквизит через ИзменитьРеквизиты() в обработчике ПриСозданииНаСервере
- 4Создайте элемент формы и свяжите его с реквизитом через ПутьКДанным
- 5Проверьте ввод значений разных типов в пользовательском режиме
Проверка типа перед использованием значения
Даже при аккуратной инициализации значение может прийти извне: из запроса, параметра, результата функции. Перед операциями, чувствительными к типу (арифметика, обращение к свойствам объекта, сравнение дат), тип стоит проверить.
Для ссылочных типов удобна проверка на конкретный вид через Тип("СправочникСсылка.Номенклатура"). Универсальная проверка «это любая ссылка» выполняется через Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) или через ОбщегоНазначения.ЭтоСсылка() в типовых конфигурациях на БСП.
Отдельный случай — значение Неопределено и NULL из запроса. Сравнение с ними выполняется только оператором равенства (Если Значение = Неопределено Тогда), а NULL следует обрабатывать ещё в запросе через ЕСТЬNULL(), чтобы в код не выходили сырые значения выборки.
Как проверить корректность типизации
ТипЗнч() возвращает ожидаемый тип сразу после объявления
Тип остаётся Неопределено до первого присваивания в ветках условий
Корректные входные данные преобразуются без потерь
Любые некорректные данные молча превращаются в 0 или пустую строку
Переменная имеет один и тот же тип на любом пути выполнения
В одной ветке присваивается число, в другой — строка или Неопределено
Типичные ошибки при работе с типами переменных
Наиболее частая ошибка — использование переменной до первого присваивания. Значение Неопределено в арифметике или конкатенации вызывает исключение «Преобразование значения к типу Число не может быть выполнено». Лечится инициализацией при объявлении.
Вторая группа ошибок — неявные преобразования. Конкатенация числа со строкой даст строку, сравнение числа со строкой может вернуть неожиданный результат, а передача строки в реквизит типа «Дата» вызовет ошибку. Правило простое: перед операцией приводите значения к одному типу явно.
Третья ошибка — сравнение типов по имени строкой (ТипЗнч(Х) = "Число"). Такая проверка не работает: ТипЗнч() возвращает значение типа Тип, а не строку. Корректное сравнение — только через Тип("Число").
Что важно запомнить
Явного объявления типа переменной в 1С нет: тип задаётся присваиванием. Инициализируйте переменные значениями нужного типа, приводите внешние данные через ОписаниеТипов, проверяйте тип через ТипЗнч() перед критичными операциями и обрабатывайте Неопределено и NULL до использования значения.
Частые вопросы
Можно ли в 1С написать «Перем Х Как Число», как в других языках?
Нет, такой синтаксической конструкции во встроенном языке 1С не существует. Ближайший аналог — сразу присвоить переменной значение нужного типа: Х = 0;. Для реквизитов форм и объектов тип задаётся через ОписаниеТипов, и там ограничение контролируется платформой.
Чем отличаются Неопределено и NULL?
Неопределено — значение переменной, которой ничего не присвоено, либо признак отсутствия значения в коде. NULL возникает только в результатах запросов, когда соединение таблиц не нашло соответствия. Это разные значения: сравнение NULL = Неопределено не даёт истины, поэтому NULL обрабатывают функцией ЕСТЬNULL() прямо в запросе.
Как проверить, что значение является ссылкой на конкретный справочник?
Сравните тип через функцию Тип() с полным именем: Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда. Имя типа строится по шаблону: имя объекта метаданных во множественном числе, точка, вид ссылки, точка, имя конкретного объекта.
Что вернёт ПривестиЗначение(), если преобразование невозможно?
Метод не вызывает исключения, а возвращает значение по умолчанию для целевого типа: 0 для числа, пустую строку для строки, пустую дату для даты, Ложь для булева. Если важно отличить неудачу приведения от реального нулевого значения, проверяйте исходные данные до вызова метода.
Меняется ли тип переменной, если присвоить ей значение другого типа?
Да, платформа это разрешает: после Х = 5; можно написать Х = "текст";, и ошибки не будет. Однако такой приём считается дефектом кода — он затрудняет чтение и откладывает выявление ошибок до момента использования значения. Для разных типов данных заводите отдельные переменные.
Как задать тип колонки при программном создании таблицы значений?
Передайте объект ОписаниеТипов вторым параметром метода Добавить(): ТЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));. Без описания типов колонка примет значения любого типа, что замедляет работу и мешает контролю данных.