Смена типа реквизита в базе 1С без потери данных: три рабочих пути
Содержание
Тип реквизита в 1С 8.3 меняют в Конфигураторе: откройте объект, выделите реквизит на вкладке «Данные», в палитре свойств нажмите кнопку выбора у поля «Тип», задайте новый тип и выполните Конфигурация → Обновить конфигурацию базы данных (F7). Платформа перестроит таблицу и попробует привести старые значения к новому типу.
Частое заблуждение — что данные при этом всегда сохраняются. Нет. Строка 50 → строка 100 пройдёт без потерь. А строка → ссылка на справочник оставит поле пустым во всех записях, потому что платформа не знает, какой элемент справочника соответствует тексту «Германия». Поэтому в рабочей базе изменить тип реквизита — почти всегда значит создать новый реквизит и перенести в него данные обработкой.
Всё ниже — про платформу 1С:Предприятие 8.3 и любые конфигурации на ней. Режим «Предприятие» тип реквизита конфигурации не меняет: это делается только в Конфигураторе или через расширение.
Что проверить до смены типа реквизита
Сначала поймите, какой у вас случай. От него зависит способ.
Конфигурация на поддержке или снята с неё. Откройте Конфигурация → Поддержка → Настройка поддержки. Если у объекта стоит «Не редактируется», правка типа потребует включить возможность изменения. После этого каждое обновление типовой придётся сравнивать и объединять вручную.
Есть ли данные. Пустой реквизит в новом объекте меняйте как угодно. Если в нём тысячи заполненных записей — сначала решите, что станет с каждым значением.
Где реквизит используется. Щёлкните по реквизиту правой кнопкой и выберите «Поиск ссылок на объект». Дополнительно запустите глобальный поиск по имени реквизита (Ctrl+Shift+F, «Искать везде»). Так вы увидите формы, модули, запросы, отчёты СКД и правила обмена, которые завязаны на старый тип.
Есть ли обмен. Если база — узел РИБ, конфигурацию меняют только в главном узле. Если идёт обмен с другой программой по правилам, правила тоже придётся поправить.
Способ 1. Изменить тип реквизита прямо в Конфигураторе
Это быстрый путь для собственных объектов и для совместимых изменений.
Пошагово
- Сделайте копию базы:
Администрирование → Выгрузить информационную базув Конфигураторе. Файл.dtсохраните вне каталога базы. - Откройте
Конфигурация → Открыть конфигурацию, найдите объект в дереве. - Двойным щелчком откройте окно объекта, вкладка «Данные», выделите реквизит.
- В палитре свойств (
Alt+Enter) у поля «Тип» нажмите кнопку выбора. - Отметьте новый тип. Для составного типа включите флажок «Составной тип данных» и выберите несколько типов.
- Задайте квалификаторы: длину строки, разрядность и точность числа, состав даты.
- Нажмите 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. Это вариант для типовой конфигурации, которую нельзя снимать с поддержки.
Сразу о границе возможностей. Расширение не меняет тип существующего реквизита основной конфигурации. Таблица с данными остаётся прежней. «Переопределить» тип можно только так: завести в расширении свой реквизит нужного типа и сделать его рабочим вместо старого.
Как это сделать
- Откройте
Конфигурация → Расширения конфигурации, создайте расширение. - В дереве основной конфигурации щёлкните правой кнопкой по объекту → «Добавить в расширение».
- В заимствованном объекте добавьте свой реквизит с нужным типом. Имя расширения добавится префиксом автоматически, если оно задано в свойствах.
- Заимствуйте форму объекта, разместите на ней новое поле, а старое скройте.
- Перенесите данные обработкой из способа 2, только записывайте значение в реквизит расширения.
- Обновите конфигурацию базы данных: реквизит расширения тоже требует изменения структуры.
Чтобы новое значение использовали отчёты и печатные формы, их тоже придётся заимствовать и править. Посчитайте объём заранее: иногда проще один раз снять объект с поддержки.
Плюс способа — обновления типовой ставятся без объединения. Минус — после крупного обновления заимствованные формы и методы нужно проверить: если в типовой их переделали, расширение может перестать применяться.
Ссылочные типы и перечисления: особый случай
С примитивными типами (строка, число, дата, булево) платформа хоть что-то конвертирует сама. Со ссылками — нет. Любой переход «в ссылку» или «из ссылки» требует таблицы соответствий.
Перечисление → справочник
Типичная история: было перечисление «ВидыДоставки» на три значения, а пользователи хотят добавлять свои.
- Создайте справочник с теми же значениями. Удобно завести в нём реквизит
ЗначениеПеречисленияи связать каждый элемент со старым значением. - Добавьте новый реквизит с типом ссылки на справочник.
- Перенесите данные: для каждого объекта найдите элемент справочника по
ЗначениеПеречисления. - Замените в коде проверки вида
= Перечисления.ВидыДоставки.Курьерна сравнение с элементом справочника. Для фиксированных элементов используйте предопределённые элементы.
Строка → справочник
Значения в строке почти всегда «грязные»: Германия, германия, ГЕРМАНИЯ , ФРГ. Перед переносом выгрузите уникальные значения запросом с СГРУППИРОВАТЬ ПО и сведите их к одному справочнику. Не найденные при переносе значения обработка из примера выше выводит сообщением — их правят вручную.
Ссылка → другой справочник
Если меняете один справочник на другой, сопоставляйте по коду или по ИНН/артикулу, а не по наименованию. Наименования совпадают у разных элементов чаще, чем кажется.
Составной тип как временный мост
Можно расширить тип до составного (старый + новый), перенести значения прямо в тот же реквизит и затем убрать старый тип. Имя реквизита не меняется, код почти не трогаете. Но учтите: составной тип хранится в нескольких колонках таблицы, и запросы по такому полю работают медленнее. Как постоянное решение он подходит плохо.
Универсальный обмен данными для смены типа
Обработка «Универсальный обмен данными в формате XML» работает по правилам, созданным в конфигурации «Конвертация данных». В правилах для каждого свойства можно задать конвертацию значения: например, по строке найти элемент справочника.
Когда этот путь оправдан:
- 🔄 данные переносятся в другую базу, где реквизит уже нового типа;
- 🏗 вы переходите на новую конфигурацию, и смена типа — часть общего переноса;
- 📦 нужно повторять перенос много раз, а правила уже есть.
Для смены типа внутри одной базы он избыточен. Разработать правила дольше, чем написать обработку из способа 2. Кроме того, выгрузка и загрузка всей таблицы через XML на больших объёмах идёт часами.
Если всё же выбрали этот путь, загружайте в копию базы и сверяйте количество объектов до и после.
Ошибки после смены типа и как их найти
Отдельно проверьте элементы форм. Флажок привязан к булеву типу, поле ввода с маской — к строке. После смены типа у поля могут остаться неподходящие свойства: маска, формат, связи параметров выбора. Поле не упадёт с ошибкой, но поведёт себя странно.
На больших таблицах в клиент-серверной базе само обновление структуры займёт время: платформа пересоздаёт таблицу и копирует строки. Закладывайте окно работ с запасом и проводите первый прогон на копии, чтобы замерить длительность.
Частые вопросы
Можно ли изменить тип реквизита в режиме «Предприятие»?
Администрирование → Общие настройки → Дополнительные реквизиты и сведения): там проще создать новый реквизит с нужным типом и заполнить его групповой обработкой.Сохранятся ли данные, если сделать тип составным?
Почему после смены длины строки обрезались наименования?
ДЛИНАСТРОКИ.