Разработка и Конфигурация · 10 мин
1С: как задать тип переменной
Как задать тип переменной в 1С: динамическая типизация во встроенном языке, типы реквизитов и колонок, ОписаниеТипов, проверка типа значения и частые ошибки.
Во встроенном языке 1С переменные имеют динамическую типизацию: тип не объявляется заранее, а определяется значением, которое присвоено переменной в конкретный момент. Одна и та же переменная сначала может хранить строку, затем число, затем ссылку на документ — платформа не выдаст ошибку при смене типа.
Однако «задать тип» в 1С всё же требуется — но не для локальных переменных процедур, а для реквизитов объектов метаданных, колонок таблиц значений, параметров запросов и полей форм. Там тип задаётся явно через палитру типов в конфигураторе или через объект ОписаниеТипов в коде.
Путаница между этими двумя подходами — главный источник вопросов у начинающих разработчиков. Ниже разобраны оба сценария: как работает неявная типизация переменных и как явно задать тип там, где платформа это поддерживает.
Как устроена типизация переменных во встроенном языке
Переменная в 1С создаётся либо явно через инструкцию Перем, либо неявно — при первом присваивании. В обоих случаях тип не указывается:
Перем Сумма; // тип пока Неопределено
Сумма = 1500.50; // теперь это Число
Сумма = "Оплачено"; // теперь это Строка — ошибки не будет
Такое поведение называется слабой динамической типизацией. Платформа не контролирует тип на этапе написания кода, поэтому ошибки несоответствия типов всплывают только во время выполнения — например, при попытке сложить строку с датой или вызвать метод, которого нет у текущего значения.
Практический вывод: раз тип переменной нельзя зафиксировать, его нужно контролировать логикой кода — проверками перед операциями, осмысленными именами переменных и инициализацией значениями нужного типа.
Как задать тип реквизиту в конфигураторе
Наиболее частая задача «задать тип» возникает при создании реквизита справочника, документа, обработки или ресурса регистра. Здесь типизация строгая, и платформа контролирует её автоматически.
Порядок действий в конфигураторе:
- 1Откройте объект метаданных (справочник, документ, обработку) и добавьте новый реквизит.
- 2В палитре свойств найдите поле «Тип» и нажмите кнопку выбора.
- 3Отметьте нужные типы: примитивные (Строка, Число, Дата, Булево) или ссылочные (СправочникСсылка, ДокументСсылка и т.д.).
- 4Для Строки задайте длину, для Числа — длину и точность, для Даты — состав (дата, время или дата и время).
- 5Если реквизит может хранить значения разных типов, отметьте несколько — получится составной тип.
- 6Сохраните конфигурацию и обновите конфигурацию базы данных (F7).
Для составного типа включите флажок, разрешающий выбор нескольких типов. Учтите: составные типы усложняют индексирование и запросы — поле с неограниченным составом типов хранится менее эффективно, а сравнения в запросах могут работать медленнее.
После изменения типа существующего реквизита, в котором уже есть данные, платформа при обновлении конфигурации базы данных попытается преобразовать значения. Если преобразование невозможно (например, ссылку в число), значение будет очищено. Перед таким изменением обязательно сделайте резервную копию.
Как задать тип через ОписаниеТипов в коде
Когда тип нужно задать программно — для колонки таблицы значений, реквизита формы, поля компоновки данных — используется объект ОписаниеТипов. Он создаётся конструктором Новый ОписаниеТипов().
// Один тип
ОписаниеЧисла = Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(15, 2));
ОписаниеСтроки = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));
// Составной тип — перечисление через запятую
ОписаниеСоставное = Новый ОписаниеТипов("СправочникСсылка.Номенклатура,СправочникСсылка.Контрагенты");
// Применение: колонка таблицы значений
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Сумма", ОписаниеЧисла);
Таблица.Колонки.Добавить("Комментарий", ОписаниеСтроки);
Квалификаторы уточняют тип: КвалификаторыЧисла задают длину и точность, КвалификаторыСтроки — максимальную длину и допустимость неограниченной строки, КвалификаторыДаты — состав даты. Без квалификаторов число получит параметры по умолчанию, что иногда приводит к неожиданному округлению.
Если нужно получить описание типов существующего реквизита (например, чтобы создать колонку точно такого же типа), используйте выгрузку через Документы.ИмяДокумента.ПустаяСсылка().Метаданные().Реквизиты.ИмяРеквизита.Тип или получите тип из пустой таблицы запроса.
ОписаниеТипа = Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,2));
ТЗ.Колонки.Добавить("Сумма", ОписаниеТипа);Как проверить и преобразовать тип значения в коде
Раз тип переменной не фиксируется, перед операциями часто требуется проверка. Для этого служат функции ТипЗнч() и Тип():
Если ТипЗнч(Параметр) = Тип("Число") Тогда
Результат = Параметр * 1.2;
ИначеЕсли ТипЗнч(Параметр) = Тип("СправочникСсылка.Номенклатура") Тогда
Результат = Параметр.ПолучитьОбъект();
Иначе
ВызватьИсключение "Неподдерживаемый тип параметра";
КонецЕсли;
Для преобразования типов используются функции Число(), Строка(), Дата(), Булево() и XMLЗначение(). Учтите, что Число("abc") вызовет ошибку выполнения — перед преобразованием строки в число проверяйте содержимое или оборачивайте вызов в Попытка...Исключение.
Отдельный случай — значение Неопределено и NULL (последнее встречается в результатах запросов). Сравнивать их между собой нельзя: NULL = Неопределено вернёт ложь. Для NULL в запросах используйте функцию ЕСТЬNULL(), а в коде проверяйте оба варианта, если данные приходят из запроса.
Как проверить результат
В палитре свойств указан нужный тип, база обновилась без ошибок
При обновлении предупреждения о преобразовании или потере данных
При присвоении значения другого типа оно приводится к типу колонки
Значения записываются как есть — колонка создана без ОписаниеТипов
ТипЗнч() возвращает ожидаемый тип, ветки условий срабатывают
Сравнение с Тип() всегда ложно — проверьте точное имя типа
Типизация параметров запросов и полей формы
При передаче параметра в запрос через Запрос.УстановитьПараметр() тип определяется переданным значением. Проблема возникает с пустыми значениями: если передать пустую ссылку или Неопределено, платформа может не вывести тип параметра. Решение — использовать функцию ВЫРАЗИТЬ() в тексте запроса:
Запрос.Текст = "ВЫБРАТЬ * ИЗ Документ.Реализация
|ГДЕ Контрагент = ВЫРАЗИТЬ(&Контрагент КАК Справочник.Контрагенты)";
Для реквизитов управляемой формы тип задаётся при создании реквизита — в дереве реквизитов формы через свойство «Тип» или программно через массив ДобавляемыеРеквизиты с указанием ОписаниеТипов. Элемент формы, связанный с реквизитом, автоматически получит соответствующий контроль ввода.
Составные типы: когда оправданы и чем опасны
Составной тип позволяет реквизиту хранить значения нескольких типов — например, «Контрагент» как ссылку на справочник контрагентов или на физических лиц. Это удобно для универсальных механизмов, но имеет цену.
Основные ограничения составных типов: более сложная структура хранения в базе данных, замедление соединений в запросах, невозможность части проверок на уровне СУБД. Поле с типом «строка неограниченной длины» или произвольным составом может вообще не попасть в индекс.
Практическая рекомендация: используйте составной тип только когда разные типы действительно будут встречаться в данных. Если в 99% случаев хранится один тип, лучше сделать основной реквизит строгого типа, а редкие случаи обрабатывать отдельным механизмом.
Частые вопросы
Можно ли объявить переменную с фиксированным типом, как в других языках?
Нет, встроенный язык 1С не поддерживает объявление типа переменной. Тип определяется присвоенным значением и может меняться. Для контроля используйте проверки через ТипЗнч() и осмысленные имена переменных, отражающие ожидаемое содержимое.
Чем отличается ТипЗнч() от Тип()?
ТипЗнч(Значение) возвращает тип конкретного значения, а Тип("ИмяТипа") возвращает тип по его строковому имени. Обычно они используются в паре: ТипЗнч(Переменная) = Тип("Число") — так проверяется соответствие значения ожидаемому типу.
Как задать тип колонки динамического списка или таблицы на форме?
Для реквизита формы тип указывается в свойствах реквизита или через ОписаниеТипов при программном добавлении. Для динамического списка типы полей определяются запросом — при необходимости используйте ВЫРАЗИТЬ() в тексте запроса списка.
Что произойдёт с данными при изменении типа реквизита?
При обновлении конфигурации базы данных платформа попытается преобразовать существующие значения к новому типу. Значения, которые преобразовать нельзя (например, ссылку в число), будут заменены на пустые. Перед таким изменением сделайте резервную копию и протестируйте обновление на копии базы.
Как проверить, что строка содержит число, перед преобразованием?
Надёжный способ — обернуть вызов Число() в конструкцию Попытка...Исключение и в ветке Исключение обработать ошибку. Альтернатива — проверить строку регулярным выражением или посимвольно, но Попытка проще и безопаснее.
Что такое Неопределено и когда переменная его содержит?
Неопределено — специальное значение, означающее отсутствие значения. Переменная, объявленная через Перем, но не получившая присваивания, содержит Неопределено. Также его возвращают функции без явного Возврат и обращения к несуществующим свойствам через точку в безопасном режиме.
Что важно запомнить
Тип переменной в 1С не объявляется — он задаётся присваиванием и может меняться. Явная типизация применяется к реквизитам метаданных, колонкам таблиц значений и полям форм: в конфигураторе через палитру свойств, в коде через ОписаниеТипов. Проверяйте типы функциями ТипЗнч() и Тип(), а перед изменением типа реквизита с данными делайте резервную копию.