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