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