Что будет, если переменной или реквизиту в 1С присвоить значение другого типа?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Поведение обычных переменных встроенного языка

Первое, что нужно усвоить — это отсутствие жесткой типизации у переменных, объявленных через ключевое слово Перем или созданных «на лету» в коде. В языке 1С переменная представляет собой лишь именованный контейнер для хранения ссылки на значение.

Рассмотрим пример:


Перем МояПеременная;
МояПеременная = ТекущаяДата(); // Сейчас это тип Дата
МояПеременная = "Это строка"; // Теперь это тип Строка

Как вы видите, переменная не обладает «памятью» о своем предыдущем типе. Она просто принимает тип и значение того объекта, который ей был присвоен в последний момент. В этом случае никаких ошибок приведения типов не возникнет, и переменная будет успешно хранить строку.

Поведение типизированных реквизитов объектов и формы

Ситуация меняется, если мы работаем с реквизитами формы, справочника, регистра или документа. У таких объектов в конфигураторе жестко задан допустимый тип (например, Дата). В этом случае платформа выступает строгим контролером данных.

При попытке присвоить такому полю значение другого типа происходит попытка автоматического приведения (преобразования) данных:

  1. Успешное приведение: Если платформа может логически преобразовать данные (например, строка содержит дату в стандартном формате ГГГГММДД), значение будет успешно преобразовано и сохранено.
  2. Неудача и значение по умолчанию: Если данные не поддаются конвертации (как в вашем примере со строкой ВремяГода), платформа не допустит хранения некорректного типа в типизированном поле. Вместо этого полю будет присвоено значение по умолчанию.

Для каждого типа данных существует свое «пустое» значение, которое установится в случае ошибки:

Почему не стоит путать значение по умолчанию с NULL?

Важно понимать разницу между «пустым значением» и значением NULL. В коде 1С мы практически не сталкиваемся с NULL как с типом значения переменной. NULL — это специфическое понятие, пришедшее из теории баз данных и запросов 1С, которое означает «отсутствие данных» при операциях соединения таблиц.

В обычном алгоритме 1С, если вы присвоили реквизиту неверное значение, вы получите не NULL, а именно «пустое» значение соответствующего типа. Если же вы используете переменную для хранения результата какой-либо функции, и она по логике алгоритма не должна ничего возвращать, чаще всего используется значение Неопределено.

Практические рекомендации

Чтобы избежать ошибок в работе вашего приложения, придерживайтесь следующих правил:

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

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

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

Подводя итог, можно сказать: если вы присваиваете значение в реквизит с заданным типом Дата, и это значение нельзя интерпретировать как календарную дату, система «сбросит» поле в 0001-01-01. Если же это просто локальная переменная, она станет строкой. Будьте внимательны с тем, какой именно тип контейнера вы используете в своем коде.

← На главную