Разработка и Конфигурация · 12 мин
Как перенести реквизиты в расширение 1С
Как перенести реквизиты в расширение 1С: подготовка конфигурации, перенос объектов и данных, обновление без потерь, проверка результата и типичные ошибки.
Когда конфигурация 1С находится на полной поддержке, добавлять реквизиты напрямую в типовые объекты нельзя — это снимает конфигурацию с поддержки и усложняет обновления. Правильное решение — вынести доработку в расширение конфигурации. Но если реквизит уже создан в основной конфигурации, его нужно аккуратно перенести в расширение вместе с данными, иначе значения, введённые пользователями, будут потеряны.
Перенос реквизита в расширение состоит из трёх логических этапов: подготовка (обновление конфигурации и снятие объекта с поддержки либо создание расширения), собственно перенос описания реквизита и миграция данных из старого хранилища в новое. Ключевая сложность в том, что «старый» реквизит и «новый» реквизит в расширении — это разные объекты метаданных, и платформа не переносит данные между ними автоматически.
Ниже разобран полный порядок работ: от создания расширения до проверки результата и типичных ошибок. Инструкция ориентирована на конфигуратор 1С:Предприятия 8.3 и типовые конфигурации на управляемых формах, но общий подход применим и к самописным решениям.
Когда перенос реквизита в расширение действительно нужен
Типичная ситуация: конфигурация была доработана напрямую — в справочник «Номенклатура» или документ «Реализация товаров и услуг» добавили собственные реквизиты. Позже конфигурацию решили вернуть на полную поддержку, чтобы упростить обновления. Для этого все доработки, включая реквизиты, нужно вынести в расширение.
Вторая ситуация — изначально правильная архитектура: новый реквизит сразу создаётся в расширении, и «переносить» ничего не требуется. Третья ситуация — реквизит уже есть в чужом расширении, и его нужно переместить в своё: тогда логика та же, что и при переносе из основной конфигурации.
Важно понимать ограничение: расширения поддерживают не все виды объектов и не все типы реквизитов. Например, в расширении можно добавлять реквизиты к справочникам, документам, регистрам сведений (в ограниченных случаях), но нельзя изменять критичные структуры типовой конфигурации. Перед переносом проверьте, что нужный объект поддерживается расширениями в вашей версии платформы и режиме совместимости.
Подготовка: резервная копия и анализ реквизита
Перед любыми изменениями структуры данных сделайте выгрузку информационной базы через конфигуратор (Администрирование → Выгрузить информационную базу) или полную копию на уровне СУБД, если база клиент-серверная. Это единственная гарантия отката, если миграция пойдёт не по плану.
Далее зафиксируйте характеристики переносимого реквизита: точное имя, тип данных (включая длину строки, точность числа, состав ссылочного типа), значение по умолчанию, признаки обязательности заполнения, индексирование. Также найдите все места использования реквизита: формы, запросы, модули, печатные макеты, отчёты. Проще всего это сделать через поиск ссылок на объект в конфигураторе (правый клик по реквизиту → «Поиск ссылок в объектах»).
Если реквизит участвует в типовых механизмах — например, выведен в дополнительные отборы динамических списков или используется в обменах данными — спланируйте отдельно, как эти механизмы будут работать после переноса. Обмены по правилам конвертации ссылаются на реквизит по имени, и после переноса в расширение имя объекта в метаданных фактически сохранится, но проверить синхронизацию нужно обязательно.
Создание расширения и добавление реквизита
Откройте конфигуратор и перейдите в меню Конфигурация → Расширения конфигурации. Создайте новое расширение: задайте имя (латиницей, без пробелов), префикс (он добавится к именам объектов расширения) и синоним. Свойство «Безопасный режим» для расширений с данными обычно отключают, если расширение доверенное.
Чтобы добавить реквизит к типовому объекту, сначала заимствуйте сам объект в расширение: в дереве конфигурации найдите нужный справочник или документ, вызовите контекстное меню и выберите «Добавить в расширение». Затем в заимствованном объекте создайте новый реквизит. Имя реквизита может совпадать со старым — конфликта не будет, потому что старый реквизит вы позже удалите из основной конфигурации, а до момента удаления платформа различает их по принадлежности.
Тип данных, длина, точность и прочие свойства нового реквизита должны полностью совпадать со старым. Если старый реквизит — строка неограниченной длины, а новый вы создадите строкой фиксированной длины, при копировании данных длинные значения обрежутся. То же касается составных типов: набор типов должен совпадать полностью.
- 1Создайте резервную копию базы и зафиксируйте свойства старого реквизита
- 2Создайте расширение: Конфигурация → Расширения конфигурации → Создать
- 3Заимствуйте объект (справочник или документ) в расширение
- 4Добавьте реквизит с тем же типом, длиной и точностью, что у старого
- 5Обновите конфигурацию базы данных (F7), согласившись с реструктуризацией
- 6Проверьте, что новый реквизит появился в объекте и доступен в режиме предприятия
Миграция данных из старого реквизита в новый
После обновления базы в таблицах существуют оба реквизита: старый (из основной конфигурации) с данными и новый (из расширения), пока пустой. Теперь нужно скопировать значения. Для этого пишется простая сервисная обработка, которая перебирает объекты запросом и переносит значение.
Логика обработки: запросом выбрать все ссылки, у которых старый реквизит заполнен, затем в цикле получить объект, присвоить новому реквизиту значение старого и записать. Запись выполняйте в режиме загрузки данных (Объект.ОбменДанными.Загрузка = Истина), чтобы не запускать бизнес-логику, проверки заполнения и подписки на события — это ускорит перенос и исключит побочные эффекты вроде отправки уведомлений или перепроведения.
Для больших объёмов (сотни тысяч объектов) выполняйте перенос порциями, например по 1000 объектов за транзакцию, чтобы не блокировать таблицу надолго и не переполнить журнал транзакций на СУБД. На рабочей базе миграцию лучше запускать в нерабочее время.
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, СтарыйРеквизит ИЗ Справочник.Номенклатура ГДЕ СтарыйРеквизит <> &Пусто");
Запрос.УстановитьПараметр("Пусто", "");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Преф_НовыйРеквизит = Выборка.СтарыйРеквизит;
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();
КонецЦикла;После выполнения обработки выборочно проверьте результат: откройте несколько объектов в режиме предприятия и убедитесь, что новый реквизит заполнен теми же значениями. Для массовой проверки выполните запрос, сравнивающий количество заполненных значений старого и нового реквизитов — числа должны совпасть.
Удаление старого реквизита и обновление конфигурации
Когда данные перенесены и проверены, старый реквизит удаляется из основной конфигурации. При обновлении конфигурации базы данных платформа покажет окно реструктуризации с предупреждением об удалении данных — это ожидаемо, ведь данные уже скопированы. Внимательно просмотрите список изменений: там не должно быть ничего, кроме удаления целевого реквизита и связанных с ним объектов (например, его отображения на формах).
Если реквизит использовался в модулях основной конфигурации, после удаления код с обращениями к нему перестанет компилироваться. Такие обращения нужно заранее перенести в модули расширения либо заменить обращениями к дополнительным реквизитам/сведениям. Формы, где был выведен старый реквизит, также нужно доработать: заимствовать форму в расширение и добавить на неё новый реквизит.
После успешного обновления убедитесь, что расширение подключено и активно (Администрирование → Печатные формы, отчеты и обработки → Расширения в режиме предприятия), и что функциональность, завязанная на реквизит, работает: открываются формы, строятся отчёты, выполняются обмены.
Как проверить результат
Число объектов с заполненным новым реквизитом равно числу до переноса
Часть значений потеряна — проверяйте отборы в обработке миграции
Формы открываются без ошибок, новый реквизит виден и редактируется
Ошибки вида «Поле не найдено» — форма ссылается на удалённый реквизит
Отчёты строятся, синхронизация проходит без ошибок
Ошибки в запросах или правилах обмена — нужно заменить ссылки на реквизит
Реструктуризация прошла, лишних изменений в списке не было
В списке изменений неожиданные объекты — откатитесь на копию и разберитесь
Альтернатива: дополнительные реквизиты и сведения
Не каждый реквизит стоит переносить в расширение. В типовых конфигурациях на БСП есть штатный механизм дополнительных реквизитов и сведений: пользователь с правами администратора может добавить новое поле к справочнику или документу прямо в режиме предприятия, без конфигуратора. Такие реквизиты хранятся в специальных регистрах и не требуют ни расширения, ни миграции структуры.
Этот вариант подходит, если реквизит нужен для информационных целей: вывести на форму, в список, в отчёт через СКД, в печатную форму. Ограничения: дополнительные реквизиты медленнее в запросах при больших объёмах, их сложнее использовать в сложной бизнес-логике и нельзя проиндексировать так же гибко, как обычный реквизит.
Выбирайте расширение, когда реквизит участвует в алгоритмах, проведении документов, индексируемых отборах или обменах. Выбирайте дополнительные реквизиты, когда нужна простая учётная характеристика без программной обработки.
Сравнение вариантов
Полноценное поле в таблице: работает в запросах, индексах, проведении. Требует конфигуратора и миграции данных при переносе.
Добавляется в режиме предприятия без разработки. Подходит для информационных полей, но медленнее в запросах и ограничен в логике.
Максимальная гибкость, но снимает объект с поддержки и усложняет обновления типовой конфигурации.
Типичные ошибки при переносе
Самая частая ошибка — удаление старого реквизита до копирования данных. После реструктуризации значения уничтожаются, и восстановить их можно только из резервной копии. Вторая ошибка — несовпадение типов: новый реквизит создали строкой(50), а старый был строкой(200), и часть данных обрезалась при переносе молча, без ошибок.
Третья группа ошибок связана с кодом: забыли перенести обращения к реквизиту из модулей основной конфигурации в расширение, и после удаления реквизита конфигурация не обновляется из-за ошибок компиляции. Четвёртая — забытые формы: реквизит перенесён, но на форме его нет, и пользователи не видят поле.
Отдельно стоит упомянуть миграцию на рабочей базе в разгар рабочего дня: массовая запись объектов блокирует таблицы и мешает пользователям. Планируйте перенос на вечер или выходной и предупреждайте пользователей.
FAQ: частые вопросы о переносе реквизитов в расширение
Можно ли перенести реквизит в расширение без потери данных вообще без обработки?
Нет. Платформа рассматривает реквизит расширения как отдельное поле и не копирует в него значения автоматически. Миграция обработкой или запросом обязательна, если в старом реквизите есть данные. Если реквизит пустой, достаточно создать его в расширении и удалить из конфигурации.
Что делать, если конфигурация на полной поддержке и объект нельзя изменить?
Это нормальная ситуация: расширение как раз предназначено для доработки объектов без снятия их с поддержки. Заимствуйте объект в расширение и добавьте реквизит там — основная конфигурация при этом не меняется и остаётся на поддержке.
Сохранятся ли данные при обновлении типовой конфигурации после переноса?
Да. Реквизиты расширения хранятся в базе независимо от типовых метаданных, и штатное обновление конфигурации их не затрагивает. Риск возникает только если в новом релизе типовой объект изменён так, что расширение становится несовместимым — тогда его нужно адаптировать.
Можно ли перенести в расширение табличную часть или измерение регистра?
Добавление табличных частей к заимствованным объектам в расширениях поддерживается, а вот изменение измерений регистров накопления и бухгалтерии через расширения сильно ограничено. Возможности зависят от версии платформы и режима совместимости — проверяйте документацию под вашу версию перед проектированием.
Как перенести реквизит из одного расширения в другое?
Логика та же: создайте реквизит в целевом расширении, скопируйте данные обработкой, затем удалите реквизит из исходного расширения и обновите базу. Учтите, что одновременно оба расширения должны быть подключены, чтобы оба поля существовали в базе на момент миграции.
Что будет, если отключить расширение после переноса реквизита?
Реквизит и его данные останутся в базе, но станут недоступны: поле исчезнет из форм, запросов и отчётов. После повторного подключения расширения данные снова станут видны — удаление данных происходит только при удалении самого расширения с соответствующим подтверждением.
Что важно запомнить
Перенос реквизита в расширение — это всегда три шага: создать реквизит в расширении с идентичным типом, скопировать данные обработкой, удалить старый реквизит. Резервная копия перед началом и проверка количества перенесённых значений после — обязательные контрольные точки. Для простых информационных полей рассмотрите дополнительные реквизиты БСП вместо расширения.