Разработка и Конфигурация · 10 мин
1С: как изменить тип значения
Как изменить тип значения реквизита, переменной или колонки таблицы в 1С: работа в конфигураторе, функции ОписаниеТипов, приведение типов и типичные ошибки.
Задача изменить тип значения в 1С возникает в двух разных ситуациях: когда нужно поменять тип реквизита объекта метаданных (справочника, документа, регистра) и когда требуется преобразовать тип значения прямо в коде — например, привести строку к числу или сформировать колонку таблицы значений с нужным типом. Подходы в этих случаях принципиально различаются, и путать их нельзя.
Изменение типа реквизита в конфигураторе затрагивает структуру базы данных и при обновлении может привести к потере данных, если новый тип несовместим со старым. Преобразование типа в коде — безопасная операция, но она требует понимания того, какие функции приведения существуют во встроенном языке и как работает объект ОписаниеТипов.
Ниже разобраны оба сценария: изменение типа через конфигуратор, работа с ОписаниеТипов, приведение простых типов в коде, изменение типа колонки таблицы значений, а также ограничения и типичные ошибки.
Изменение типа реквизита в конфигураторе
Чтобы изменить тип реквизита справочника, документа или другого объекта, откройте конфигуратор, найдите нужный объект в дереве конфигурации и перейдите на вкладку «Данные». Выделите реквизит, откройте палитру свойств (правый клик — «Свойства» или Alt+Enter) и найдите поле «Тип».
Нажмите кнопку выбора в поле «Тип» — откроется окно редактирования типа данных. В нём можно выбрать один примитивный тип (число, строка, дата, булево), ссылочный тип (ссылка на справочник, документ, перечисление) или снять флажок «Составной тип данных», если он установлен, и наоборот. Для числа дополнительно задаются длина и точность, для строки — длина и вид (фиксированная или переменная).
После изменения типа необходимо обновить конфигурацию базы данных (F7 или «Конфигурация — Обновить конфигурацию базы данных»). Именно на этом этапе происходит реструктуризация таблиц, и именно здесь возможна потеря данных.
Составной тип и его особенности
Составной тип — это реквизит, который может хранить значения нескольких типов, например строку или ссылку на любой справочник. Чтобы сделать тип составным, в окне редактирования типа установите флажок «Составной тип данных» и отметьте нужные типы в списке.
Сужение составного типа (удаление одного из типов) — опасная операция: значения исключённого типа в существующих записях будут потеряны при реструктуризации. Расширение составного типа, наоборот, безопасно — старые данные сохраняются.
Практическая рекомендация: перед сужением типа выполните запрос к базе и проверьте, есть ли записи со значениями исключаемого типа. Если такие записи есть, сначала обработайте их — перенесите данные в другой реквизит или очистите осознанно.
Приведение типов значений в коде
Когда тип нужно изменить не в метаданных, а для конкретного значения в переменной, используются встроенные функции преобразования. Основные из них: Число(), Строка(), Дата(), Булево(). Они принимают значение и возвращают его в целевом типе.
Функция Число("123,45") вернёт число 123,45; если строка не может быть преобразована, будет вызвана ошибка выполнения. Поэтому перед преобразованием строк из внешних источников (файлов, форм ввода) полезно проверять содержимое или оборачивать вызов в Попытка/Исключение.
Для дат функция Дата() принимает строку в формате «ГГГГММДДччммсс» или отдельные числовые компоненты: Дата(2026, 3, 15). Преобразование ссылочных типов функциями не выполняется — ссылку получают методами НайтиПоКоду(), НайтиПоНаименованию(), ПолучитьСсылку() и подобными.
СтрокаЧисло = "1250,5";
Попытка
ЗначениеЧисло = Число(СтрокаЧисло);
Исключение
ЗначениеЧисло = 0;
Сообщить("Не удалось преобразовать строку в число");
КонецПопытки;
ДатаИзСтроки = Дата("20260315143000"); // 15 марта 2026, 14:30Объект ОписаниеТипов: зачем он нужен
ОписаниеТипов — это объект встроенного языка, который описывает допустимые типы значения. Он используется там, где тип нужно задать программно: при создании колонок таблицы значений, реквизитов формы, параметров запросов, полей компоновки данных.
Конструктор принимает строку с именами типов через запятую или массив типов, а также квалификаторы: длину и точность числа, длину строки, состав даты. Например: Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)) — число до 15 разрядов с двумя знаками после запятой.
Метод ПривестиЗначение() объекта ОписаниеТипов приводит переданное значение к описанному типу и, в отличие от функции Число(), не вызывает исключения при невозможности преобразования — возвращает значение по умолчанию (ноль, пустую строку, пустую дату). Это удобно для «тихой» обработки сомнительных данных.
ОписаниеЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
БезопасноеЗначение = ОписаниеЧисло.ПривестиЗначение("не число"); // вернёт 0 без ошибки
ОписаниеСсылка = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");Изменение типа колонки таблицы значений
Тип колонки таблицы значений задаётся при её добавлении: Таблица.Колонки.Добавить("Сумма", ОписаниеТипов). Если колонка уже существует, её тип напрямую изменить нельзя — у объекта КолонкаТаблицыЗначений свойство ТипЗначения доступно только для чтения.
Обходной путь — создать новую колонку с нужным типом, перенести в неё значения с приведением, затем удалить старую колонку и переименовать новую. Либо сформировать новую таблицу с корректной структурой и заполнить её преобразованными данными.
Тот же приём работает для дерева значений и для реквизитов управляемой формы типа «ТаблицаЗначений»: программно изменить тип существующей колонки нельзя, только пересоздать.
- 1Добавьте новую колонку с нужным ОписаниеТипов, например НоваяКолонка
- 2В цикле по строкам таблицы заполните новую колонку: Строка.НоваяКолонка = Описание.ПривестиЗначение(Строка.СтараяКолонка)
- 3Удалите старую колонку методом Колонки.Удалить()
- 4Переименуйте новую колонку через свойство Имя
- 5Проверьте результат выборочно по нескольким строкам
Проверка типа значения перед изменением
Перед преобразованием полезно определить фактический тип значения. Для этого служат функция ТипЗнч() и оператор сравнения с Тип(): конструкция Если ТипЗнч(Значение) = Тип("Строка") Тогда ... позволяет выполнять разные действия для разных типов.
Для проверки ссылочных типов удобны методы Ссылка.Пустая() и проверка на Неопределено и NULL. Значение NULL приходит из запросов при левом соединении, Неопределено — при отсутствии значения; обе ситуации нужно отработать до приведения типа, иначе возможны ошибки.
Как проверить результат преобразования
Значение соответствует исходной строке
Получен 0 при непустом исходном значении — строка не преобразовалась
Дата совпадает с ожидаемой
Получена пустая дата 01.01.0001 — неверный формат строки
Старые данные на месте, тип в форме корректный
Данные очищены — типы оказались несовместимы
Типичные ошибки и ограничения
Самая частая ошибка — изменение типа реквизита без анализа существующих данных. Реструктуризация при несовместимых типах молча очищает значения, и обнаруживается это уже пользователями. Вторая типичная проблема — сокращение длины строки или точности числа: значения усекаются без предупреждения.
В коде разработчики часто забывают, что Число() вызывает исключение на некорректной строке, и не оборачивают вызов в Попытка/Исключение. Ещё одна ошибка — попытка изменить тип колонки таблицы значений напрямую, что невозможно, или присвоить реквизиту формы значение несовместимого типа.
Часто задаваемые вопросы
Можно ли изменить тип стандартного реквизита, например кода или наименования?
Частично. У стандартных реквизитов можно менять длину (кода, наименования) и тип кода (число или строка) через свойства объекта конфигурации. Полностью произвольный тип задать нельзя — состав стандартных реквизитов фиксирован платформой.
Что произойдёт с данными, если изменить тип строки на число?
При реструктуризации значения, которые нельзя преобразовать в число, будут потеряны — реквизит очистится. Даже преобразуемые значения могут обработаться не так, как ожидается. Перед таким изменением сделайте копию базы и протестируйте обновление на ней.
Как преобразовать строку в ссылку на справочник?
Напрямую — никак. Ссылку получают поиском: Справочники.Номенклатура.НайтиПоНаименованию(Строка) или НайтиПоКоду(). Если элемент не найден, метод вернёт пустую ссылку, которую следует проверить через Пустая().
Чем ПривестиЗначение() лучше функции Число()?
Метод ПривестиЗначение() объекта ОписаниеТипов не вызывает исключения: при невозможности преобразования он возвращает значение по умолчанию (0, пустую строку или дату). Это удобно при пакетной обработке данных из внешних источников, где ошибочные значения нужно пропускать, а не прерывать выполнение.
Можно ли изменить тип значения в уже работающей базе без конфигуратора?
Тип реквизита метаданных — нет, это возможно только через конфигуратор с последующим обновлением конфигурации базы данных. Значения в записях можно преобразовать программно обработкой, но сам тип хранения при этом останется прежним.
Почему после изменения типа реквизита в форме отображаются пустые поля?
Скорее всего, при реструктуризации старые значения оказались несовместимы с новым типом и были очищены. Проверьте данные запросом. Если копия базы сохранилась, восстановите данные и выполните предварительную конвертацию значений обработкой перед повторным изменением типа.
Что важно запомнить
Тип реквизита меняется в конфигураторе с обязательной копией базы и проверкой совместимости данных. В коде используйте функции Число(), Строка(), Дата() с обработкой исключений или ОписаниеТипов с методом ПривестиЗначение(). Тип существующей колонки таблицы значений изменить нельзя — колонку пересоздают.