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

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

1С: как изменить тип значения

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

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

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

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

Изменение типа реквизита в конфигураторе

Чтобы изменить тип реквизита справочника, документа или другого объекта, откройте конфигуратор, найдите нужный объект в дереве конфигурации и перейдите на вкладку «Данные». Выделите реквизит, откройте палитру свойств (правый клик — «Свойства» или Alt+Enter) и найдите поле «Тип».

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

После изменения типа необходимо обновить конфигурацию базы данных (F7 или «Конфигурация — Обновить конфигурацию базы данных»). Именно на этом этапе происходит реструктуризация таблиц, и именно здесь возможна потеря данных.

Составной тип и его особенности

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

Сужение составного типа (удаление одного из типов) — опасная операция: значения исключённого типа в существующих записях будут потеряны при реструктуризации. Расширение составного типа, наоборот, безопасно — старые данные сохраняются.

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

Приведение типов значений в коде

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

Функция Число("123,45") вернёт число 123,45; если строка не может быть преобразована, будет вызвана ошибка выполнения. Поэтому перед преобразованием строк из внешних источников (файлов, форм ввода) полезно проверять содержимое или оборачивать вызов в Попытка/Исключение.

Для дат функция Дата() принимает строку в формате «ГГГГММДДччммсс» или отдельные числовые компоненты: Дата(2026, 3, 15). Преобразование ссылочных типов функциями не выполняется — ссылку получают методами НайтиПоКоду(), НайтиПоНаименованию(), ПолучитьСсылку() и подобными.

bsl
СтрокаЧисло = "1250,5";
Попытка
    ЗначениеЧисло = Число(СтрокаЧисло);
Исключение
    ЗначениеЧисло = 0;
    Сообщить("Не удалось преобразовать строку в число");
КонецПопытки;

ДатаИзСтроки = Дата("20260315143000"); // 15 марта 2026, 14:30

Объект ОписаниеТипов: зачем он нужен

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

Конструктор принимает строку с именами типов через запятую или массив типов, а также квалификаторы: длину и точность числа, длину строки, состав даты. Например: Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)) — число до 15 разрядов с двумя знаками после запятой.

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

bsl
ОписаниеЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
БезопасноеЗначение = ОписаниеЧисло.ПривестиЗначение("не число"); // вернёт 0 без ошибки

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

Изменение типа колонки таблицы значений

Тип колонки таблицы значений задаётся при её добавлении: Таблица.Колонки.Добавить("Сумма", ОписаниеТипов). Если колонка уже существует, её тип напрямую изменить нельзя — у объекта КолонкаТаблицыЗначений свойство ТипЗначения доступно только для чтения.

Обходной путь — создать новую колонку с нужным типом, перенести в неё значения с приведением, затем удалить старую колонку и переименовать новую. Либо сформировать новую таблицу с корректной структурой и заполнить её преобразованными данными.

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

Как изменить тип колонки таблицы значений
  1. 1
    Добавьте новую колонку с нужным ОписаниеТипов, например НоваяКолонка
  2. 2
    В цикле по строкам таблицы заполните новую колонку: Строка.НоваяКолонка = Описание.ПривестиЗначение(Строка.СтараяКолонка)
  3. 3
    Удалите старую колонку методом Колонки.Удалить()
  4. 4
    Переименуйте новую колонку через свойство Имя
  5. 5
    Проверьте результат выборочно по нескольким строкам

Проверка типа значения перед изменением

Перед преобразованием полезно определить фактический тип значения. Для этого служат функция ТипЗнч() и оператор сравнения с Тип(): конструкция Если ТипЗнч(Значение) = Тип("Строка") Тогда ... позволяет выполнять разные действия для разных типов.

Для проверки ссылочных типов удобны методы Ссылка.Пустая() и проверка на Неопределено и NULL. Значение NULL приходит из запросов при левом соединении, Неопределено — при отсутствии значения; обе ситуации нужно отработать до приведения типа, иначе возможны ошибки.

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

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

Число после Число() или ПривестиЗначение()
Норма

Значение соответствует исходной строке

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

Получен 0 при непустом исходном значении — строка не преобразовалась

Дата из строки
Норма

Дата совпадает с ожидаемой

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

Получена пустая дата 01.01.0001 — неверный формат строки

Реквизит после изменения типа в конфигураторе
Норма

Старые данные на месте, тип в форме корректный

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

Данные очищены — типы оказались несовместимы

Типичные ошибки и ограничения

Самая частая ошибка — изменение типа реквизита без анализа существующих данных. Реструктуризация при несовместимых типах молча очищает значения, и обнаруживается это уже пользователями. Вторая типичная проблема — сокращение длины строки или точности числа: значения усекаются без предупреждения.

В коде разработчики часто забывают, что Число() вызывает исключение на некорректной строке, и не оборачивают вызов в Попытка/Исключение. Ещё одна ошибка — попытка изменить тип колонки таблицы значений напрямую, что невозможно, или присвоить реквизиту формы значение несовместимого типа.

Типичные ошибки
01
Изменение типа реквизита без резервной копии — при несовместимости типов данные теряются при реструктуризации
02
Использование Число() без обработки исключений — падение кода на первой некорректной строке из файла
03
Попытка изменить ТипЗначения существующей колонки таблицы — свойство доступно только для чтения, нужна новая колонка
04
Сужение составного типа без проверки данных запросом — записи с исключённым типом обнулятся

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

Можно ли изменить тип стандартного реквизита, например кода или наименования?

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

Что произойдёт с данными, если изменить тип строки на число?

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

Как преобразовать строку в ссылку на справочник?

Напрямую — никак. Ссылку получают поиском: Справочники.Номенклатура.НайтиПоНаименованию(Строка) или НайтиПоКоду(). Если элемент не найден, метод вернёт пустую ссылку, которую следует проверить через Пустая().

Чем ПривестиЗначение() лучше функции Число()?

Метод ПривестиЗначение() объекта ОписаниеТипов не вызывает исключения: при невозможности преобразования он возвращает значение по умолчанию (0, пустую строку или дату). Это удобно при пакетной обработке данных из внешних источников, где ошибочные значения нужно пропускать, а не прерывать выполнение.

Можно ли изменить тип значения в уже работающей базе без конфигуратора?

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

Почему после изменения типа реквизита в форме отображаются пустые поля?

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

Итог

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

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