Смена типа реквизита в базе 1С без потери данных: три рабочих пути

· 9 мин

Содержание

Тип реквизита в 1С 8.3 меняют в Конфигураторе: откройте объект, выделите реквизит на вкладке «Данные», в палитре свойств нажмите кнопку выбора у поля «Тип», задайте новый тип и выполните Конфигурация → Обновить конфигурацию базы данных (F7). Платформа перестроит таблицу и попробует привести старые значения к новому типу.

Частое заблуждение — что данные при этом всегда сохраняются. Нет. Строка 50 → строка 100 пройдёт без потерь. А строка → ссылка на справочник оставит поле пустым во всех записях, потому что платформа не знает, какой элемент справочника соответствует тексту «Германия». Поэтому в рабочей базе изменить тип реквизита — почти всегда значит создать новый реквизит и перенести в него данные обработкой.

Всё ниже — про платформу 1С:Предприятие 8.3 и любые конфигурации на ней. Режим «Предприятие» тип реквизита конфигурации не меняет: это делается только в Конфигураторе или через расширение.

Что проверить до смены типа реквизита

Сначала поймите, какой у вас случай. От него зависит способ.

Конфигурация на поддержке или снята с неё. Откройте Конфигурация → Поддержка → Настройка поддержки. Если у объекта стоит «Не редактируется», правка типа потребует включить возможность изменения. После этого каждое обновление типовой придётся сравнивать и объединять вручную.

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

Где реквизит используется. Щёлкните по реквизиту правой кнопкой и выберите «Поиск ссылок на объект». Дополнительно запустите глобальный поиск по имени реквизита (Ctrl+Shift+F, «Искать везде»). Так вы увидите формы, модули, запросы, отчёты СКД и правила обмена, которые завязаны на старый тип.

Есть ли обмен. Если база — узел РИБ, конфигурацию меняют только в главном узле. Если идёт обмен с другой программой по правилам, правила тоже придётся поправить.

Какой у вас случай?

Способ 1. Изменить тип реквизита прямо в Конфигураторе

Это быстрый путь для собственных объектов и для совместимых изменений.

Пошагово

  1. Сделайте копию базы: Администрирование → Выгрузить информационную базу в Конфигураторе. Файл .dt сохраните вне каталога базы.
  2. Откройте Конфигурация → Открыть конфигурацию, найдите объект в дереве.
  3. Двойным щелчком откройте окно объекта, вкладка «Данные», выделите реквизит.
  4. В палитре свойств (Alt+Enter) у поля «Тип» нажмите кнопку выбора.
  5. Отметьте новый тип. Для составного типа включите флажок «Составной тип данных» и выберите несколько типов.
  6. Задайте квалификаторы: длину строки, разрядность и точность числа, состав даты.
  7. Нажмите F7. Платформа покажет окно «Реорганизация информации» со списком изменений. Прочитайте его и нажмите «Принять».

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

Что произойдёт с данными

ИзменениеЧто будет со значениями
Строка 50 → строка 150Сохранятся полностью
Строка 150 → строка 50Обрежутся до 50 символов
Число 10.2 → число 15.2Сохранятся
Тип A → составной тип A + BСохранятся
Составной A + B → только AЗначения типа B пропадут
Строка → ссылка на справочникПоле станет пустым
Перечисление → справочникПоле станет пустым

Платформа не спрашивает, какое значение во что превратить. Если таблица выше говорит «пропадут» или «станет пустым», используйте способ 2.

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

Способ 2. Новый реквизит и перенос данных

Классический и самый надёжный способ сменить тип реквизита в рабочей базе. Логика простая: два реквизита живут рядом, пока данные не переедут.

Шаг 1. Добавьте новый реквизит

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

Шаг 2. Перенесите значения обработкой

Создайте внешнюю обработку и выполните перенос на сервере. Пример для перехода от строки к ссылке на справочник стран:

&НаСервере
Процедура ПеренестиНаСервере()

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Т.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Номенклатура КАК Т
    |ГДЕ
    |    Т.Страна <> """"";

    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Объект = Выборка.Ссылка.ПолучитьОбъект();
        Наименование = СокрЛП(Объект.Страна);
        Страна = Справочники.СтраныМира.НайтиПоНаименованию(Наименование, Истина);
        Если Страна.Пустая() Тогда
            Сообщить("Не найдено: " + Наименование + " (" + Объект.Код + ")");
            Продолжить;
        КонецЕсли;
        Объект.СтранаПроисхождения = Страна;
        Объект.ОбменДанными.Загрузка = Истина;
        Объект.Записать();
    КонецЦикла;

КонецПроцедуры

Режим ОбменДанными.Загрузка = Истина отключает проверки и обработчики записи. Документы при такой записи не перепроводятся, движения остаются прежними. Для переноса значения реквизита этого достаточно.

Если реквизит участвует в движениях документа (например, попадает в измерение регистра), одной перезаписи реквизита мало. Документы нужно перепровести, и это уже изменит регистры.

Для числа в строку используйте Формат(Число, "ЧГ=0"), иначе получите пробелы-разделители разрядов. Для строки в число — Число(Строка) внутри Попытка … Исключение, а значения с ошибкой выводите в список для ручной правки.

Шаг 3. Переключите формы, код и отчёты

По списку из поиска ссылок замените старое имя на новое: элементы форм, запросы, схемы компоновки, печатные формы, правила обмена. После правок запустите Конфигурация → Проверка конфигурации с синтаксическим контролем модулей.

Шаг 4. Уберите старый реквизит

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

Способ 3. Расширение конфигурации вместо правки типовой

Расширения появились в 8.3.6, а добавлять свои реквизиты к заимствованным объектам можно с версии 8.3.11. Это вариант для типовой конфигурации, которую нельзя снимать с поддержки.

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

Как это сделать

  1. Откройте Конфигурация → Расширения конфигурации, создайте расширение.
  2. В дереве основной конфигурации щёлкните правой кнопкой по объекту → «Добавить в расширение».
  3. В заимствованном объекте добавьте свой реквизит с нужным типом. Имя расширения добавится префиксом автоматически, если оно задано в свойствах.
  4. Заимствуйте форму объекта, разместите на ней новое поле, а старое скройте.
  5. Перенесите данные обработкой из способа 2, только записывайте значение в реквизит расширения.
  6. Обновите конфигурацию базы данных: реквизит расширения тоже требует изменения структуры.

Чтобы новое значение использовали отчёты и печатные формы, их тоже придётся заимствовать и править. Посчитайте объём заранее: иногда проще один раз снять объект с поддержки.

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

Ссылочные типы и перечисления: особый случай

С примитивными типами (строка, число, дата, булево) платформа хоть что-то конвертирует сама. Со ссылками — нет. Любой переход «в ссылку» или «из ссылки» требует таблицы соответствий.

Перечисление → справочник

Типичная история: было перечисление «ВидыДоставки» на три значения, а пользователи хотят добавлять свои.

  1. Создайте справочник с теми же значениями. Удобно завести в нём реквизит ЗначениеПеречисления и связать каждый элемент со старым значением.
  2. Добавьте новый реквизит с типом ссылки на справочник.
  3. Перенесите данные: для каждого объекта найдите элемент справочника по ЗначениеПеречисления.
  4. Замените в коде проверки вида = Перечисления.ВидыДоставки.Курьер на сравнение с элементом справочника. Для фиксированных элементов используйте предопределённые элементы.

Строка → справочник

Значения в строке почти всегда «грязные»: Германия, германия, ГЕРМАНИЯ , ФРГ. Перед переносом выгрузите уникальные значения запросом с СГРУППИРОВАТЬ ПО и сведите их к одному справочнику. Не найденные при переносе значения обработка из примера выше выводит сообщением — их правят вручную.

Ссылка → другой справочник

Если меняете один справочник на другой, сопоставляйте по коду или по ИНН/артикулу, а не по наименованию. Наименования совпадают у разных элементов чаще, чем кажется.

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

Можно расширить тип до составного (старый + новый), перенести значения прямо в тот же реквизит и затем убрать старый тип. Имя реквизита не меняется, код почти не трогаете. Но учтите: составной тип хранится в нескольких колонках таблицы, и запросы по такому полю работают медленнее. Как постоянное решение он подходит плохо.

Универсальный обмен данными для смены типа

Обработка «Универсальный обмен данными в формате XML» работает по правилам, созданным в конфигурации «Конвертация данных». В правилах для каждого свойства можно задать конвертацию значения: например, по строке найти элемент справочника.

Когда этот путь оправдан:

  • 🔄 данные переносятся в другую базу, где реквизит уже нового типа;
  • 🏗 вы переходите на новую конфигурацию, и смена типа — часть общего переноса;
  • 📦 нужно повторять перенос много раз, а правила уже есть.

Для смены типа внутри одной базы он избыточен. Разработать правила дольше, чем написать обработку из способа 2. Кроме того, выгрузка и загрузка всей таблицы через XML на больших объёмах идёт часами.

Если всё же выбрали этот путь, загружайте в копию базы и сверяйте количество объектов до и после.

Перед обновлением структуры
Выполнено: 0 / 5

Ошибки после смены типа и как их найти

Диагностика: выберите симптом

Отдельно проверьте элементы форм. Флажок привязан к булеву типу, поле ввода с маской — к строке. После смены типа у поля могут остаться неподходящие свойства: маска, формат, связи параметров выбора. Поле не упадёт с ошибкой, но поведёт себя странно.

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

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

Можно ли изменить тип реквизита в режиме «Предприятие»?
Реквизиты конфигурации — нет, только в Конфигураторе или расширением. Исключение — дополнительные реквизиты БСП (Администрирование → Общие настройки → Дополнительные реквизиты и сведения): там проще создать новый реквизит с нужным типом и заполнить его групповой обработкой.
Сохранятся ли данные, если сделать тип составным?
Да. Добавление типа к существующему не удаляет значения. Потери начинаются, когда тип из состава убирают.
Почему после смены длины строки обрезались наименования?
При уменьшении длины платформа отрезает всё, что не помещается. Восстановите данные из копии и выберите длину по самому длинному значению — его можно найти запросом с функцией ДЛИНАСТРОКИ.
Нужно ли перепроводить документы после смены типа реквизита?
Только если реквизит попадает в движения регистров. Если он лишь хранится в шапке или табличной части, перепроведение не требуется.
Сломает ли смена типа обновление типовой конфигурации?
Правка типа в самой типовой — да, при каждом обновлении придётся объединять изменения. Реквизит в расширении обновлению не мешает, но после обновления расширение надо проверить.