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

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

Как присвоить тип переменной в 1С

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

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

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

Понимание типов критично, потому что большинство ошибок времени выполнения в 1С связаны именно с несоответствием типов: попыткой сложить строку с числом, обратиться к свойству у Неопределено или передать в метод значение не того типа.

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

Переменная в 1С — это просто имя, которому присваивается значение оператором =. Никакого объявления типа заранее не требуется: интерпретатор сам определяет тип по присвоенному значению и хранит его вместе со значением.

Пример базового присваивания:

Количество = 15;            // Число

Наименование = "Товар А"; // Строка

ДатаОтгрузки = '20260115'; // Дата (литерал в одинарных кавычках)

Активен = Истина; // Булево

Ссылка = Неопределено; // Специальное значение "нет значения"

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

Основные примитивные типы и как их присвоить

Чтобы присвоить переменной конкретный примитивный тип, достаточно записать литерал в правильном формате. Ошибка в формате литерала — самая частая причина того, что переменная получает не тот тип, который ожидал разработчик.

ТипКак присвоитьТипичная ошибка
ЧислоХ = 12.5;Запятая вместо точки в дробной части
СтрокаХ = "Текст";Одинарные кавычки вместо двойных
ДатаХ = '20260301';Формат ДД.ММ.ГГГГ вместо ГГГГММДД
БулевоХ = Истина;Строка "Истина" вместо ключевого слова
НеопределеноХ = Неопределено;Путаница с Null и пустой строкой

Особое внимание уделите дате: литерал даты пишется в одинарных кавычках в формате ГГГГММДД (при необходимости — ГГГГММДДЧЧММСС). Запись '01.03.2026' синтаксически допустима, но зависит от региональных настроек, поэтому надёжнее использовать канонический формат.

Как создать переменную составного типа через конструктор Новый

Объектные типы — массивы, структуры, таблицы значений, менеджеры объектов — создаются конструктором Новый или через методы менеджеров. Именно здесь разработчик явно «назначает» тип переменной.

Массив = Новый Массив;                    // Массив

Параметры = Новый Структура("Код, Имя"); // Структура с полями

Соответствие = Новый Соответствие; // Соответствие (ключ-значение)

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

Запрос = Новый Запрос; // Объект запроса

Ссылки на объекты конфигурации создаются через менеджеры:

НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

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

Обратите внимание: СоздатьДокумент() возвращает объект документа (тип ДокументОбъект), а не ссылку. Ссылка появится только после вызова метода Записать(). Путаница между объектом и ссылкой — классический источник ошибок «Поле объекта не обнаружено».

Типичные ошибки
01
Присвоение результата НайтиПоКоду() без проверки на пустую ссылку — дальнейшее обращение к реквизитам пустой ссылки возвращает неожиданные значения
02
Попытка вызвать Записать() у ссылки вместо объекта — ссылка не имеет метода Записать, нужно сначала получить объект через ПолучитьОбъект()
03
Использование одинарных кавычек для строк — одинарные кавычки зарезервированы под литералы дат, строка должна быть в двойных

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

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

// Колонка, которая хранит только строки длиной до 50 символов

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

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

// Колонка с числом: 15 знаков всего, 2 после запятой

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

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

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

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

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

Как проверить и преобразовать тип переменной

После присваивания тип можно проверить функцией ТипЗнч() и сравнить с нужным типом через функцию Тип():

Значение = ПолучитьЗначениеИзвне();

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

Сумма = Значение * 1.2;

ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда

Сообщить("Получена строка: " + Значение);

Иначе

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

КонецЕсли;

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

Для ссылочных типов удобна проверка на пустую ссылку: Если Ссылка.Пустая() Тогда ... или функция ЗначениеЗаполнено(), которая универсально работает с большинством типов.

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

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

Тип переменной после присваивания
Норма

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

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

Ошибка «Операции сравнения/сложения не определены» при работе со значением

Ссылка на объект базы
Норма

Ссылка.Пустая() возвращает Ложь, реквизиты доступны для чтения

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

Получена пустая ссылка или Неопределено после поиска

Числовая колонка таблицы значений
Норма

Итоги по колонке суммируются корректно

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

Платформа трактует значения как строки, суммирование не работает

Где ещё задаётся тип: реквизиты, параметры, реквизиты формы

Кроме переменных в коде, типы назначаются в конфигураторе и в формах. У реквизитов объектов метаданных тип выбирается в палитре свойств — там же задаётся составной тип, если поле должно хранить ссылки разных видов. Это статическая типизация: платформа сама контролирует соответствие записываемых значений.

В формах программное добавление реквизита выглядит так:

ДобавляемыеРеквизиты = Новый Массив;

НовыйРеквизит = Новый РеквизитФормы("Комментарий",

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

ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);

ИзменитьРеквизиты(ДобавляемыеРеквизиты);

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

Частые вопросы о типах переменных в 1С

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

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

Чем отличается Неопределено от Null?

Неопределено — значение по умолчанию для неинициализированных данных в коде и признак отсутствия значения. Null приходит только из запросов к базе данных, когда поле в результате не заполнено (например, при левом соединении). Сравнение Null с чем-либо, кроме Null, всегда даёт Ложь, поэтому проверять его нужно через ЕСТЬ NULL в запросе или Значение = Null в коде.

Почему Число("12,5") вызывает ошибку?

Функция преобразования ожидает точку как разделитель дробной части, а не запятую. Строку с запятой нужно предварительно обработать, например, через СтрЗаменить(Значение, ",", "."), либо использовать ОписаниеТипов с методом ПривестиЗначение(), который учитывает форматные настройки.

Как узнать тип значения в отладчике?

Добавьте переменную в табло (Ctrl+Alt+W или через контекстное меню) — в колонке «Тип» отобразится фактический тип значения. Также можно вычислить выражение ТипЗнч(Переменная) прямо в окне вычисления выражений.

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

Обычная переменная и так может хранить любую ссылку — ограничений нет. Составной тип имеет смысл задавать только для реквизитов: в конфигураторе отметьте нужные типы галочками в свойстве «Тип», а в коде передайте в ОписаниеТипов строку с перечислением типов через запятую, например Новый ОписаниеТипов("СправочникСсылка.Контрагенты,ДокументСсылка.Заказ").

Что делать, если ВЫРАЗИТЬ в запросе обрезает строку?

При приведении типа в запросе указывайте длину строки явно: ВЫРАЗИТЬ(Поле КАК Строка(200)). Без указания длины платформа может применить ограничение по умолчанию, и длинные значения будут усечены без предупреждения.

Итог

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

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