Почему не сохраняется длина кода справочника в расширении 1С и как это исправить

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Анализ проблемы: почему изменения «сбрасываются»?

Выясним причину, по которой платформа 1С блокирует изменение длины кода в расширении. Это не программная ошибка, а фундаментальное ограничение архитектуры. Свойство Длина кода определяет физическую структуру таблиц в базе данных (SQL). Расширения проектировались как «надстройки», которые могут добавлять новые данные, но не должны необратимо перекраивать структуру таблиц основной конфигурации.

Основные причины блокировки:

Вариант 1. Добавление нового реквизита в расширении

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

Разберем этот процесс по шагам:

  1. Заимствуем нужный справочник в расширение (без захвата всех свойств).
  2. Создаем в расширении новый реквизит, например, ДополнительныйКод с нужным типом (Строка) и длиной (например, 25 символов).
  3. Выносим этот реквизит на форму справочника. Поскольку мы работаем в режиме Обычных форм, нам потребуется заимствовать форму и программно или визуально добавить на нее новое поле ввода.

Важно помнить, что стандартная автонумерация 1С для этого поля работать не будет. Нам придется реализовать ее самостоятельно в модуле объекта расширения:


&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
    Если ЭтоНовый() И ЗначениеЗаполнено(ЭтотОбъект.ДополнительныйКод) = Ложь Тогда
        // Здесь можно реализовать логику генерации своего номера
        ЭтотОбъект.ДополнительныйКод = СгенерироватьНовыйУникальныйНомер();
    КонецЕсли;
КонецПроцедуры

Вариант 2. Использование регистра сведений для хранения длинных кодов

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

Посмотрим на алгоритм реализации:

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

Вариант 3. Использование Дополнительных сведений (БСП)

Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), рассмотрим наиболее «цивилизованный» путь — использование механизма дополнительных сведений.

Для этого не нужно писать код или менять метаданные в Конфигураторе. Достаточно:

  1. Перейти в режим 1С:Предприятие.
  2. Открыть раздел «Администрирование» — «Общие настройки» — «Дополнительные реквизиты и сведения».
  3. Добавить для нужного справочника новое «Сведение» с типом Строка.

Этот способ позволяет пользователям хранить значения любой длины, однако стоит учесть, что поиск и индексация по таким полям в запросах будут работать медленнее, чем по индексированным реквизитам.

Риски и подводные камни при работе с обменами данными

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

Посмотрим на пример: в вашей базе код стал 15 символов, а в принимающей базе он остался 10. При выгрузке через формат EnterpriseData или XDTO-пакеты система выдаст ошибку несоответствия типов. Даже если данные будут переданы, принимающая сторона «обрежет» лишние символы, что приведет к появлению дублей или невозможности сопоставить объекты. Всегда проверяйте структуры всех баз, участвующих в обмене, перед принятием решения об увеличении длины ключевых полей.

Выводы и рекомендации

Мы выяснили, что напрямую изменить Длину кода в расширении невозможно из-за ограничений ядра платформы 1С. Для решения задачи следует использовать один из альтернативных методов:

  1. Дополнительный реквизит в расширении: лучший баланс между трудозатратами и удобством использования.
  2. Регистр сведений: максимальная безопасность и чистота метаданных.
  3. Дополнительные сведения БСП: решение в пользовательском режиме без программирования.

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

← На главную