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

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

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

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

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

На практике «указать тип» в 1С означает одну из нескольких задач: присвоить переменной значение нужного типа, ограничить состав типов у реквизита объекта конфигурации, проверить тип значения перед обработкой или явно преобразовать значение. Каждая из этих задач решается своими инструментами — от литералов и конструкторов до функций Тип(), ТипЗнч() и описания типов.

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

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

Переменная создаётся в момент первого присваивания. Инструкция Количество = 10; создаёт переменную с числовым значением, а Количество = "десять"; далее в коде изменит её тип на строковый. Платформа не выдаст ошибку при смене типа — ответственность за корректность лежит на разработчике.

Ключевые примитивные типы: Число, Строка, Дата, Булево. Кроме них существуют ссылочные типы (ссылки на справочники, документы, перечисления), универсальные коллекции (Массив, Структура, Соответствие, ТаблицаЗначений) и специальное значение Неопределено, означающее отсутствие значения.

Для объявления переменных на уровне модуля используется ключевое слово Перем, но и оно не задаёт тип — только область видимости. Запись Перем Счетчик; создаёт переменную со значением Неопределено, и тип появится только после первого присваивания.

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

Самый прямой способ указать тип — присвоить литерал нужного вида. Числа пишутся без кавычек, строки — в кавычках, даты — в одинарных кавычках в формате ГГГГММДД, булевы значения — словами Истина и Ложь.

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

Цена = 199.99; // Число с дробной частью

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

ДатаОтгрузки = '20260115'; // Дата

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

Для ссылочных типов значение получают через менеджеры объектов: Справочники.Номенклатура.НайтиПоКоду("0001") вернёт ссылку на элемент справочника, а Документы.РеализацияТоваров.ПустаяСсылка() — пустую ссылку заданного типа. Пустые ссылки удобны, когда переменная должна иметь конкретный ссылочный тип, но реального объекта ещё нет.

Коллекции создаются конструктором с ключевым словом Новый: Новый Массив, Новый Структура, Новый ТаблицаЗначений. Тип коллекции фиксируется в момент создания, а вот типы элементов внутри массива или структуры могут быть любыми и разными.

bsl
// Явное задание типа через значение
Сумма = 0;                    // Число
Комментарий = "";           // Строка
Период = '00010101';          // Пустая дата
Контрагент = Справочники.Контрагенты.ПустаяСсылка(); // Ссылка

Как проверить тип переменной: ТипЗнч и Тип

Поскольку тип может измениться в ходе выполнения, перед операциями, чувствительными к типу, его проверяют. Функция ТипЗнч(Значение) возвращает тип конкретного значения, а функция Тип("ИмяТипа") — тип по его имени в виде строки. Сравнение результатов этих функций даёт признак совпадения типов.

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

Итог = Итог + Параметр;

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

// работа со ссылкой

КонецЕсли;

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

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

Порядок безопасной обработки параметра
  1. 1
    Проверьте, что параметр не равен Неопределено
  2. 2
    Сравните ТипЗнч(Параметр) с ожидаемым типом через Тип()
  3. 3
    При несовпадении — преобразуйте значение или сообщите об ошибке
  4. 4
    Только после проверки выполняйте операции с реквизитами и арифметику

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

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

Реквизит может иметь составной тип — например, ссылку одновременно на справочники «Контрагенты» и «ФизическиеЛица». Составной тип включается флажками в окне выбора типа. Чем шире состав типа, тем гибче структура, но тем сложнее запросы и тем больше проверок требуется в коде, поэтому составные типы стоит использовать только при реальной необходимости.

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

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

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

Преобразование типов и типичные ошибки

Явное преобразование выполняется функциями Число(), Строка(), Дата() и Булево(). Они принимают значение и пытаются привести его к целевому типу. Если приведение невозможно — например, Число("текст") — возникает ошибка выполнения, поэтому перед преобразованием данные из внешних источников проверяют.

Отдельный класс задач — приведение типов в запросах. Функция языка запросов ВЫРАЗИТЬ(Поле КАК Число(15,2)) приводит значение к указанному типу на стороне СУБД. Это используют для соединений по составным реквизитам и для устранения лишних типов, что ускоряет выполнение запроса.

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

Типичные ошибки
01
Сравнение строки с числом без преобразования — условие ведёт себя непредсказуемо
02
Обращение к реквизиту через Неопределено — ошибка выполнения «Поле объекта не обнаружено»
03
Сложение строки и числа без Строка() или Число() — неожиданная конкатенация или исключение
04
Слишком широкий составной тип реквизита — замедление запросов и усложнение проверок
05
Опечатка в имени типа внутри Тип() — исключение в момент вызова функции

Как проверить корректность типизации

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

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

Если ТипЗнч(ДокументОснование) <> Тип("ДокументСсылка.ЗаказКлиента") Тогда

ВызватьИсключение "Ожидался документ «Заказ клиента»";

КонецЕсли;

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

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

Тип переменной в отладчике
Норма

Совпадает с ожидаемым (например, ДокументСсылка.ЗаказКлиента)

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

Неопределено или тип другого вида объекта

Выполнение арифметики и сравнений
Норма

Операции проходят без исключений и дают ожидаемый результат

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

Ошибка «Несоответствие типов» или неверный итог

Обновление конфигурации после смены типа реквизита
Норма

Обновление проходит, данные на месте

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

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

Когда какой подход выбирать

Для локальных вычислений достаточно присваивания литерала — это самый простой и читаемый способ. Для параметров экспортных процедур добавляйте проверку ТипЗнч, чтобы защититься от некорректных вызовов. Для структур данных, хранящихся в базе, тип всегда задаётся в конфигураторе, а не в коде.

ОписаниеТипов применяйте при программном создании колонок таблиц значений, реквизитов форм и отборов компоновки данных. ВЫРАЗИТЬ в запросах — когда нужно сузить составной тип поля или выровнять типы для соединения. Комбинация этих инструментов покрывает все практические сценарии типизации в 1С.

Маршрут решения

Как выбрать действие

Нужна переменная внутри процедурыПрисвойте литерал нужного типа или результат конструктора Новый
Параметр приходит извне и тип не гарантированПроверьте ТипЗнч() и при необходимости вызовите исключение
Нужен типизированный реквизит объекта базыЗадайте тип в палитре свойств в конфигураторе
Создаётся колонка таблицы значений в кодеИспользуйте Новый ОписаниеТипов с квалификаторами
Соединение в запросе по составному полюПримените ВЫРАЗИТЬ для сужения типа поля

Часто задаваемые вопросы

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

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

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

ТипЗнч() принимает значение и возвращает его фактический тип. Тип() принимает строку с именем типа и возвращает сам тип. Обычно их используют в паре: результат ТипЗнч(Значение) сравнивают с Тип("ИмяТипа").

Как проверить, что значение — ссылка на конкретный справочник?

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

Что произойдёт, если изменить тип реквизита в конфигураторе?

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

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

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

Почему сравнение переменной со строкой даёт неверный результат, хотя значения «похожи»?

Вероятно, переменная хранит число или дату, а не строку. Платформа сравнивает значения разных типов по внутренним правилам, а не по внешнему виду. Проверьте тип через ТипЗнч() и приведите значение функцией Строка() перед сравнением.

Итог

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

Тип переменной в 1С задаётся присваиваемым значением, а не объявлением. Проверяйте типы через ТипЗнч() и Тип(), типы реквизитов настраивайте в конфигураторе, для колонок таблиц используйте ОписаниеТипов, а в запросах — ВЫРАЗИТЬ. Всегда обрабатывайте Неопределено до обращения к свойствам значения.