Разработка и Конфигурация · 10 мин
Как изменить тип в 1С: реквизиты, значения и данные
Как изменить тип в 1С: настройка типа реквизита в конфигураторе, преобразование значений в коде, изменение типа данных без потери информации.
Фраза «изменить тип в 1С» может означать три разные задачи: поменять тип реквизита объекта в конфигураторе, преобразовать значение переменной во встроенном языке или изменить тип уже заполненных данных без их потери. Каждая из этих задач решается своим инструментом, и смешение подходов — частая причина ошибок и потери данных.
Самый рискованный сценарий — изменение типа реквизита в конфигураторе, когда база уже содержит данные. Сужение типа (например, уменьшение длины строки или замена составного типа на одиночный) может привести к обрезанию или очистке значений при реструктуризации. Поэтому любые такие изменения выполняются только после резервного копирования и проверки на копии базы.
Ниже разобраны основные сценарии: работа с типом реквизита в конфигураторе, составные типы, преобразование значений в коде, изменение типа данных в заполненной базе и типичные ошибки.
Как изменить тип реквизита в конфигураторе
Основной способ изменить тип — через конфигуратор. Откройте конфигурацию (меню «Конфигурация» → «Открыть конфигурацию»), найдите нужный объект в дереве (справочник, документ, регистр), раскройте его ветку «Реквизиты» и вызовите палитру свойств реквизита двойным щелчком или через контекстное меню «Свойства».
В палитре свойств найдите поле «Тип». Нажмите кнопку выбора — откроется окно редактирования типа данных, где можно отметить один или несколько типов: примитивные (Строка, Число, Дата, Булево) и ссылочные (ссылки на справочники, документы, перечисления, планы видов характеристик). Для строки задаётся длина и признак «Неограниченная длина», для числа — длина и точность (количество знаков после запятой).
После изменения типа сохраните конфигурацию (F7 или «Конфигурация» → «Обновить конфигурацию базы данных»). Платформа выполнит реструктуризацию — перестроит таблицы базы под новый формат. На больших базах это может занять значительное время, поэтому обновление рабочей базы планируют на нерабочие часы.
- 1Сделайте резервную копию базы (выгрузка .dt или средствами СУБД)
- 2Откройте конфигуратор и найдите реквизит в дереве объектов
- 3В палитре свойств откройте редактор типа и установите нужный тип
- 4Сохраните конфигурацию и обновите конфигурацию базы данных (F7)
- 5Проверьте на копии базы, что данные сохранились корректно
- 6Только после проверки выполните обновление рабочей базы
Составные типы и их настройка
Составной тип позволяет реквизиту хранить значения разных видов — например, поле «Контрагент» может ссылаться и на справочник «Контрагенты», и на «Физические лица». В редакторе типа для этого отмечают несколько ссылочных типов одновременно. Примитивные типы тоже комбинируются, но сочетание «строка + ссылка» обычно признак неудачного проектного решения.
Расширение типа (добавление новых допустимых типов) проходит безболезненно: старые значения остаются на месте, просто появляется возможность хранить новые. Сужение типа опаснее: если в данных есть значения исключаемого типа, при реструктуризации они будут очищены. Перед сужением стоит запросом найти все записи с «лишними» типами и решить их судьбу — перенести, заменить или удалить.
Для хранения произвольных значений в типовых конфигурациях часто используется тип «Характеристика» через план видов характеристик — это гибче, чем жёсткий составной тип, и не требует реструктуризации при добавлении новых видов значений.
Как преобразовать тип значения во встроенном языке
Во встроенном языке 1С переменные не имеют жёсткого типа — тип определяется значением. Для явного преобразования используются встроенные функции: Число(), Строка(), Дата(), Булево(). Например, Число("123,45") вернёт числовое значение, а Строка(ТекущаяДата()) — строковое представление даты.
Для проверки типа значения применяют функцию ТипЗнч() в паре с Тип():
Если ТипЗнч(Значение) = Тип("СправочникСсылка.Контрагенты") Тогда
// работаем как со ссылкой на контрагента
КонецЕсли;
Функция Число() вызывает исключение, если строка не содержит корректного числа. Чтобы избежать падения кода, преобразование оборачивают в попытку или предварительно проверяют строку. Описание типов для программного создания (например, при заполнении таблицы значений) формируется объектом ОписаниеТипов, где задаются допустимые типы и квалификаторы — длина строки, точность числа, состав даты.
ОписаниеТипов = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));Изменение типа без потери данных
Реструктуризация при изменении типа не всегда безопасна. Платформа автоматически преобразует данные, если это возможно: число в строку, строку с цифрами в число, дату в строку. Но обратные и «сужающие» преобразования приводят к потерям: строка с буквами при смене типа на «Число» обнулится, длинная строка обрежется до новой длины, дробная часть отбросится при уменьшении точности.
Безопасная последовательность для рискованного изменения выглядит так. Сначала добавляют новый реквизит нужного типа, затем обработкой переносят в него данные из старого реквизита с контролем преобразований. После проверки полноты переноса старый реквизит удаляют, а новый при необходимости переименовывают. Такой подход даёт точку отката на каждом шаге.
Отдельный случай — изменение типа измерения регистра или реквизита, входящего в уникальный индекс. Здесь реструктуризация может завершиться ошибкой из-за дублирования записей после преобразования. Проверку на дубли стоит выполнить запросом заранее.
Типовые сценарии изменения типа
Увеличение длины строкового реквизита
Самый безопасный сценарий: увеличение длины строки не трогает существующие данные. Достаточно поменять длину в свойствах реквизита и обновить конфигурацию. Учтите, что строки, участвующие в индексах и кодах справочников, ограничены по длине требованиями индексации.
Замена строки на ссылку на справочник
Типичная задача при развитии конфигурации: реквизит «Поставщик» был строкой, а должен стать ссылкой. Прямая смена типа очистит все значения. Правильный путь — создать новый реквизит ссылочного типа, обработкой найти или создать элементы справочника по строковым значениям, заполнить ссылки, затем удалить старый реквизит.
Изменение типа значения в форме или отчёте
В формах тип поля ввода определяется типом связанного реквизита данных. Если нужно ограничить ввод, меняют тип реквизита формы или устанавливают свойство «Ограничение типа» у поля. В СКД тип поля набора данных задаётся на закладке «Наборы данных» и может отличаться от типа в запросе — это частая причина «пустых» полей в отчёте.
Проверка результата после изменения типа
После реструктуризации нужно убедиться, что данные в порядке. Откройте несколько типовых объектов и проверьте значения изменённого реквизита. Для массовой проверки полезен произвольный запрос через консоль запросов: посчитайте количество пустых значений реквизита до и после изменения — рост числа пустых значений указывает на потери.
Также проверьте связанные места: отчёты, печатные формы, обмены данными, права доступа. Изменение типа может сломать запросы со сравнением или соединением по этому реквизиту — такие ошибки проявляются только при выполнении, поэтому прогоните ключевые операции вручную на копии.
Как проверить результат
Значения на месте и соответствуют новому типу
Поля пустые или обрезанные
Совпадает с количеством до изменения
Число пустых значений выросло
Отчёты формируются, обмены проходят без ошибок
Ошибки сравнения типов или пустые поля
FAQ
Можно ли изменить тип реквизита без конфигуратора?
Нет. Тип реквизита — часть метаданных и меняется только в конфигураторе с последующим обновлением конфигурации базы данных. В режиме «Предприятие» можно менять лишь значения, а не их типы. Исключение — дополнительные реквизиты и сведения в типовых конфигурациях: их тип настраивается пользователем через «Администрирование» → «Общие настройки» → «Дополнительные реквизиты и сведения».
Что произойдёт с данными при смене типа «Строка» на «Число»?
При реструктуризации платформа попытается преобразовать каждое значение. Строки, содержащие корректное число, преобразуются успешно. Строки с буквами, пустые или некорректные значения станут нулём. Поэтому перед такой сменой стоит запросом найти все нечисловые значения и обработать их заранее.
Как узнать тип значения переменной в отладке?
Используйте функцию ТипЗнч(Значение) — она возвращает объект типа «Тип». В отладчике достаточно добавить в табло выражение ТипЗнч(Переменная). Для вывода строкового имени типа применяют конструкцию Строка(ТипЗнч(Значение)) или XML-функции.
Почему после изменения типа отчёт показывает пустые поля?
Чаще всего тип поля в наборе данных СКД не совпадает с новым типом реквизита, либо запрос содержит явное приведение типа (ВЫРАЗИТЬ ... КАК) со старым описанием. Откройте схему компоновки, обновите тип поля на закладке «Наборы данных» и проверьте текст запроса.
Можно ли отменить реструктуризацию после обновления?
Автоматической отмены нет. Откат возможен только восстановлением базы из резервной копии, сделанной до обновления. Если копии нет, а данные повреждены, вернуть их штатными средствами не получится — поэтому резервное копирование перед изменением типов обязательно.
Чем отличается «Неограниченная длина» строки от большой фиксированной?
Строка неограниченной длины хранится иначе и не может участвовать в индексах, кодах и ряде сравнений. Если реквизит используется для поиска или соединений в запросах, лучше задать разумную фиксированную длину. Неограниченную длину оставляют для описаний, комментариев и многострочных текстов.
Что важно запомнить
Тип реквизита меняется в конфигураторе через палитру свойств, значения в коде — функциями преобразования. Расширение типа безопасно, сужение и смена вида типа требуют копии базы, переноса данных обработкой и проверки результата запросами. Любое обновление конфигурации базы данных с реструктуризацией выполняйте только после резервного копирования.