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

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

Как перенести реквизиты в расширение 1С

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

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

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

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

Когда перенос реквизита в расширение действительно нужен

Типичная ситуация: конфигурация была доработана напрямую — в справочник «Номенклатура» или документ «Реализация товаров и услуг» добавили собственные реквизиты. Позже конфигурацию решили вернуть на полную поддержку, чтобы упростить обновления. Для этого все доработки, включая реквизиты, нужно вынести в расширение.

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

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

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

Перед любыми изменениями структуры данных сделайте выгрузку информационной базы через конфигуратор (Администрирование → Выгрузить информационную базу) или полную копию на уровне СУБД, если база клиент-серверная. Это единственная гарантия отката, если миграция пойдёт не по плану.

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

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

Создание расширения и добавление реквизита

Откройте конфигуратор и перейдите в меню Конфигурация → Расширения конфигурации. Создайте новое расширение: задайте имя (латиницей, без пробелов), префикс (он добавится к именам объектов расширения) и синоним. Свойство «Безопасный режим» для расширений с данными обычно отключают, если расширение доверенное.

Чтобы добавить реквизит к типовому объекту, сначала заимствуйте сам объект в расширение: в дереве конфигурации найдите нужный справочник или документ, вызовите контекстное меню и выберите «Добавить в расширение». Затем в заимствованном объекте создайте новый реквизит. Имя реквизита может совпадать со старым — конфликта не будет, потому что старый реквизит вы позже удалите из основной конфигурации, а до момента удаления платформа различает их по принадлежности.

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

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

Миграция данных из старого реквизита в новый

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

Логика обработки: запросом выбрать все ссылки, у которых старый реквизит заполнен, затем в цикле получить объект, присвоить новому реквизиту значение старого и записать. Запись выполняйте в режиме загрузки данных (Объект.ОбменДанными.Загрузка = Истина), чтобы не запускать бизнес-логику, проверки заполнения и подписки на события — это ускорит перенос и исключит побочные эффекты вроде отправки уведомлений или перепроведения.

Для больших объёмов (сотни тысяч объектов) выполняйте перенос порциями, например по 1000 объектов за транзакцию, чтобы не блокировать таблицу надолго и не переполнить журнал транзакций на СУБД. На рабочей базе миграцию лучше запускать в нерабочее время.

bsl
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, СтарыйРеквизит ИЗ Справочник.Номенклатура ГДЕ СтарыйРеквизит <> &Пусто");
Запрос.УстановитьПараметр("Пусто", "");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Преф_НовыйРеквизит = Выборка.СтарыйРеквизит;
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();
КонецЦикла;

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

Удаление старого реквизита и обновление конфигурации

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

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

После успешного обновления убедитесь, что расширение подключено и активно (Администрирование → Печатные формы, отчеты и обработки → Расширения в режиме предприятия), и что функциональность, завязанная на реквизит, работает: открываются формы, строятся отчёты, выполняются обмены.

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

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

Количество заполненных значений
Норма

Число объектов с заполненным новым реквизитом равно числу до переноса

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

Часть значений потеряна — проверяйте отборы в обработке миграции

Открытие форм объектов
Норма

Формы открываются без ошибок, новый реквизит виден и редактируется

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

Ошибки вида «Поле не найдено» — форма ссылается на удалённый реквизит

Отчёты и обмены
Норма

Отчёты строятся, синхронизация проходит без ошибок

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

Ошибки в запросах или правилах обмена — нужно заменить ссылки на реквизит

Обновление конфигурации
Норма

Реструктуризация прошла, лишних изменений в списке не было

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

В списке изменений неожиданные объекты — откатитесь на копию и разберитесь

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

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

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

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

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

Реквизит в расширении

Полноценное поле в таблице: работает в запросах, индексах, проведении. Требует конфигуратора и миграции данных при переносе.

Дополнительный реквизит (БСП)

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

Реквизит в основной конфигурации

Максимальная гибкость, но снимает объект с поддержки и усложняет обновления типовой конфигурации.

Типичные ошибки при переносе

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

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

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

Типичные ошибки
01
Удаление старого реквизита до миграции данных — значения теряются безвозвратно
02
Несовпадение длины или типа нового реквизита со старым — данные обрезаются или не записываются
03
Запись объектов без режима ОбменДанными.Загрузка — срабатывают подписки, проверки и бизнес-логика
04
Забытые обращения к реквизиту в модулях и формах — конфигурация не обновляется или формы падают с ошибкой
05
Миграция в рабочее время — блокировки таблиц и жалобы пользователей

FAQ: частые вопросы о переносе реквизитов в расширение

Можно ли перенести реквизит в расширение без потери данных вообще без обработки?

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

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

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

Сохранятся ли данные при обновлении типовой конфигурации после переноса?

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

Можно ли перенести в расширение табличную часть или измерение регистра?

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

Как перенести реквизит из одного расширения в другое?

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

Что будет, если отключить расширение после переноса реквизита?

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

Итог

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

Перенос реквизита в расширение — это всегда три шага: создать реквизит в расширении с идентичным типом, скопировать данные обработкой, удалить старый реквизит. Резервная копия перед началом и проверка количества перенесённых значений после — обязательные контрольные точки. Для простых информационных полей рассмотрите дополнительные реквизиты БСП вместо расширения.