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

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

Как изменить тип реквизита в 1С без потери данных

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

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

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

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

Когда изменение типа безопасно, а когда грозит потерей данных

Платформа 1С при реструктуризации умеет преобразовывать значения между рядом типов. Число превращается в строку без потерь, строка — в число, если она содержит только цифры и допустимые разделители. Дата, булево и ссылочные типы преобразуются значительно хуже: например, при смене ссылки на строку значение будет очищено либо преобразовано в служебное представление, которое для учёта бесполезно.

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

Маршрут решения

Как выбрать действие

Новый тип шире старого (строка длиннее, добавлен тип в составной)Меняйте тип напрямую — данные сохранятся
Типы несовместимы или новый тип уже (число в дату, ссылка в строку)Сначала выгрузите старые значения, после обновления загрузите их с преобразованием
Реквизит используется в запросах, отчётах и формулахНайдите все места использования через поиск по конфигурации до изменения типа
База рабочая и в ней критичные данныеВыполняйте изменение на копии базы, а в рабочей — только после успешного теста

Подготовка: резервная копия и анализ использования реквизита

Первый шаг — резервная копия информационной базы. Для файловой базы достаточно скопировать файл 1Cv8.1CD при остановленной работе пользователей, для клиент-серверной — сделать выгрузку через конфигуратор (Администрирование → Выгрузить информационную базу) или штатный бэкап СУБД. Без копии откатить неудачную реструктуризацию будет невозможно.

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

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

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

Откройте конфигуратор, загрузите актуальную конфигурацию (Конфигурация → Загрузить конфигурацию из файла не нужно — достаточно открыть конфигурацию базы данных). В дереве объектов найдите нужный справочник, документ или регистр, разверните ветку «Реквизиты» и дважды щёлкните по реквизиту либо откройте палитру свойств (правый клик → Свойства).

В поле «Тип» нажмите кнопку выбора. Откроется окно редактирования типа данных, где можно отметить один или несколько типов: примитивные (Строка, Число, Дата, Булево), ссылочные (ссылки на справочники, документы, перечисления), а также ХранилищеЗначения и УникальныйИдентификатор. Для строки задайте длину и вид (фиксированная или переменная), для числа — длину и точность, для даты — состав (дата, время или дата и время).

После выбора типа сохраните конфигурацию (Ctrl+S) и запустите обновление конфигурации базы данных клавишей F7 или через меню Конфигурация → Обновить конфигурацию базы данных. Платформа покажет окно реструктуризации со списком изменений — убедитесь, что в нём фигурирует именно ваш реквизит, и подтвердите операцию кнопкой «Принять».

Порядок действий
  1. 1
    Сделайте резервную копию базы и протестируйте изменение на копии
  2. 2
    Найдите все места использования реквизита через поиск ссылок
  3. 3
    Откройте свойства реквизита и задайте новый тип с нужными параметрами длины и точности
  4. 4
    Сохраните конфигурацию и выполните обновление базы данных (F7)
  5. 5
    Проверьте данные после реструктуризации и исправьте зависимый код

Как сохранить данные при несовместимых типах

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

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

Пример простейшего переноса строки в число через обработку:

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Ссылка, СтарыйРеквизит ИЗ Справочник.Контрагенты";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Объект = Выборка.Ссылка.ПолучитьОбъект();

ОписаниеЧисла = Новый ОписаниеТипов("Число");

Объект.НовыйРеквизит = ОписаниеЧисла.ПривестиЗначение(Выборка.СтарыйРеквизит);

Объект.Записать();

КонецЦикла;

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

Составной тип данных: когда он оправдан

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

Платите за гибкость производительностью и удобством: поля составного типа хуже индексируются, в запросах требуют приведения через ВЫРАЗИТЬ или проверки типа через ССЫЛКА, а в формах усложняют выбор значения. Если реально используется только один тип, составной тип лучше сузить — но это уже операция с риском очистки значений «лишних» типов.

Сравнение вариантов

Прямая смена типа

Подходит для совместимых типов и пустых реквизитов. Быстро, но при несовместимости данные очищаются без предупреждения о конкретных записях

Новый реквизит + обработка переноса

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

Составной тип

Подходит, когда нужны значения разных типов одновременно. Данные сохраняются, но усложняются запросы и формы

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

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

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

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

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

Значения в записях
Норма

Данные соответствуют состоянию до изменения, формат корректен

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

Значения пустые, обрезаны или содержат служебные представления

Журнал регистрации
Норма

Нет ошибок преобразования типов при работе пользователей

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

Ошибки «Преобразование значения к типу не может быть выполнено»

Отчёты и запросы
Норма

Отчёты формируются, итоги совпадают с прежними

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

Отчёт падает с ошибкой или показывает пустые колонки

Обмены данными
Норма

Синхронизация проходит без ошибок выгрузки

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

Объекты отклоняются из-за несовпадения типов в базах-участниках

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

Частая ошибка — изменение типа без анализа кода. Если в модуле объекта или внешней обработке реквизит складывается как число, а стал строкой, операция даст конкатенацию вместо суммы, и ошибка проявится только в отчётности. Вторая типичная ситуация — забытые внешние источники: обработки загрузки, веб-сервисы и планы обмена, где тип зашит в формат сообщения.

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

Типичные ошибки
01
Смена типа без резервной копии — при неудачной реструктуризации данные восстановить нечем
02
Уменьшение длины строки без проверки данных — длинные значения безвозвратно обрезаются
03
Игнорирование планов обмена — в базах-корреспондентах возникает рассинхронизация типов
04
Удаление старого реквизита до проверки переноса — значения стираются при обновлении
05
Забытый поиск использований — код, рассчитанный на старый тип, начинает давать сбои в неожиданных местах
Итог

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

Меняйте тип реквизита через свойства в конфигураторе с обновлением базы (F7), всегда начинайте с резервной копии и теста на копии базы. Совместимые типы платформа преобразует сама, для несовместимых используйте новый реквизит и обработку переноса. После обновления проверьте данные, код, отчёты и обмены.

Частые вопросы

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

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

Что произойдёт с данными при смене типа «Число» на «Строка»?

Значения преобразуются автоматически: каждое число станет его строковым представлением. Потерь нет, но учтите, что сортировка и сравнение в запросах станут строковыми — «10» окажется раньше «2». Если реквизит участвует в упорядочивании, проверьте логику отчётов.

Как изменить тип, если конфигурация на поддержке без возможности изменения?

Снимите объект с поддержки через Настройку поддержки (включить возможность изменения), либо не трогайте типовой реквизит и добавьте собственный с нужным типом. Второй вариант предпочтительнее: он меньше осложняет будущие обновления типового решения.

Почему после изменения типа обмен данными стал выдавать ошибки?

В планах обмена формат сообщений фиксирует типы реквизитов. Если тип изменён только в одной базе, приёмник не может сопоставить значение. Нужно синхронно изменить тип во всех базах-участниках и при необходимости перерегистрировать изменения объектов.

Можно ли вернуть старый тип после обновления, если что-то пошло не так?

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

Влияет ли изменение типа реквизита на права доступа?

Сам тип на роли и права не влияет — права назначаются на реквизит как объект метаданных. Но если реквизит удалён и создан заново вместо смены типа, настройки прав и ограничения доступа на уровне записей придётся настроить повторно.