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

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

Как программно изменить тип реквизита в 1С

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

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

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

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

Что именно вы хотите изменить: три разные задачи

Под формулировкой «изменить тип реквизита» скрываются три различных сценария, и от правильной постановки зависит выбор инструмента. Первая задача — изменить тип существующего реквизита в метаданных: например, увеличить длину строки с 50 до 150 символов или сменить тип «Строка» на «СправочникСсылка». Это делается в конфигураторе, а при обновлении базы платформа сама выполнит реструктуризацию таблиц.

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

Третья задача — работать с составным типом или ограничением типа в запросах и коде без изменения метаданных. Функции ВЫРАЗИТЬ в запросах и методы проверки типа позволяют приводить значения к нужному типу «на лету», не трогая структуру базы. Это подходит, когда требуется только корректное отображение или сравнение данных.

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

Как выбрать подход

Нужно просто увеличить длину строки или точность числаМеняйте тип в конфигураторе — реструктуризация пройдёт без потери данных
Тип меняется несовместимо (строка → ссылка на справочник)Создайте новый реквизит и напишите обработку переноса данных
Конфигурация типовая и на поддержкеДобавляйте реквизит через расширение, типовой не трогайте
Нужно только привести тип в запросе или отчётеИспользуйте ВЫРАЗИТЬ без изменения метаданных

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

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

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

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

Перенос данных в новый реквизит: обработка преобразования

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

Шаблон такой обработки на встроенном языке выглядит следующим образом:

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

Запрос.Текст =

"ВЫБРАТЬ

| Док.Ссылка КАК Ссылка,

| Док.КонтрагентСтрока КАК СтароеЗначение

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Док

|ГДЕ

| Док.КонтрагентСтрока <> """"

| И Док.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)";

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

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

Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(Выборка.СтароеЗначение, Истина);

Если Не ЗначениеЗаполнено(Контрагент) Тогда

НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();

НовыйЭлемент.Наименование = Выборка.СтароеЗначение;

НовыйЭлемент.Записать();

Контрагент = НовыйЭлемент.Ссылка;

КонецЕсли;

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

ДокОбъект.Контрагент = Контрагент;

ДокОбъект.ОбменДанными.Загрузка = Истина;

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

КонецЦикла;

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

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

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

Изменение типа через расширение конфигурации

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

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

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

Приведение типов без изменения метаданных

Не всякая задача требует менять структуру базы. Если проблема только в том, как значение интерпретируется в запросе или отчёте, используйте функцию ВЫРАЗИТЬ. Она приводит значение к указанному типу на лету: например, обрезает строку неограниченной длины для корректного соединения таблиц или приводит составной тип к конкретной ссылке.

Запрос.Текст =

"ВЫБРАТЬ

| ВЫРАЗИТЬ(Таб.Комментарий КАК СТРОКА(100)) КАК КраткийКомментарий,

| ВЫРАЗИТЬ(Таб.Получатель КАК Справочник.Контрагенты) КАК Контрагент

|ИЗ

| Документ.ПеремещениеТоваров КАК Таб";

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

Ограничение подхода очевидно: ВЫРАЗИТЬ не меняет хранимые данные, а проверки типа в коде не делают строку ссылкой. Если бизнес-логика требует именно ссылочного типа (для отборов, связей по типу, стандартных механизмов платформы) — без изменения метаданных не обойтись.

Особые случаи: табличные части, регистры и составные типы

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

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

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

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

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

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

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

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

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

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

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

Совпадает с количеством в старом (или отличается на известные необработанные случаи)

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

Массовые пустые значения при заполненном старом реквизите

Выборочная сверка значений
Норма

Ссылки соответствуют исходным строковым данным

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

Значения перепутаны или не соответствуют смыслу

Работа отчётов и печатных форм
Норма

Все формы и отчёты открываются без ошибок

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

Ошибки «Поле не найдено» в модулях и СКД

Права пользователей
Норма

Пользователи видят и редактируют новый реквизит

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

Поле недоступно при корректных данных

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

Можно ли изменить тип реквизита непосредственно из кода встроенного языка?

Нет. Тип реквизита — свойство метаданных, а встроенный язык работает в рамках уже существующей структуры. Программно можно только преобразовывать значения (ВЫРАЗИТЬ в запросах, создание объектов нужного типа в коде) и переносить данные между реквизитами обработками.

Что произойдёт с данными, если уменьшить длину строкового реквизита?

При реструктуризации значения, превышающие новую длину, будут обрезаны без возможности восстановления. Платформа покажет изменение в окне реструктуризации, но не предупредит о конкретных обрезанных значениях. Предварительно выполните запрос с ДЛИНАСТРОКИ или СтрДлина, чтобы найти затронутые записи.

Как заменить строковый реквизит на ссылочный в типовой конфигурации на поддержке?

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

Почему обработка переноса работает медленно на большой базе?

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

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

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

Можно ли откатить изменение типа после реструктуризации?

Только восстановлением базы из резервной копии. Обратное изменение типа не вернёт очищенные или обрезанные данные. Поэтому выгрузка dt перед реструктуризацией — обязательный шаг, а не рекомендация.

Итог

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

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