При работе с расширениями конфигурации программисты часто сталкиваются с ситуацией, когда платформа визуально позволяет редактировать свойства заимствованных объектов, но после сохранения или перезапуска Конфигуратора внесенные изменения бесследно исчезают. Особенно остро эта проблема проявляется при попытке изменить длину стандартных реквизитов, таких как Код или Наименование. Рассмотрим подробнее, почему это происходит и какими способами можно обойти данное ограничение, сохранив основную конфигурацию на замке.
Выясним причину, по которой платформа 1С блокирует изменение длины кода в расширении. Это не программная ошибка, а фундаментальное ограничение архитектуры. Свойство Длина кода определяет физическую структуру таблиц в базе данных (SQL). Расширения проектировались как «надстройки», которые могут добавлять новые данные, но не должны необратимо перекраивать структуру таблиц основной конфигурации.
Основные причины блокировки:
ALTER TABLE на уровне СУБД. Если бы платформа позволяла это делать через расширение, то при его отключении возникла бы критическая ошибка: данные в базе имели бы длину, например, 20 символов, а метаданные основной базы ожидали бы 10. Это привело бы к потере данных или невозможности запуска системы.8.3.14) возможности расширений значительно скромнее. Платформа в этом режиме жестко контролирует «целостность» заимствованных объектов и игнорирует любые попытки изменения их физических параметров.Проанализируем самый простой и безопасный способ — создание собственного реквизита вместо изменения стандартного. В отличие от редактирования заимствованного поля Код, добавление нового реквизита в расширении разрешено и не вызывает конфликтов с основной базой.
Разберем этот процесс по шагам:
ДополнительныйКод с нужным типом (Строка) и длиной (например, 25 символов).Важно помнить, что стандартная автонумерация 1С для этого поля работать не будет. Нам придется реализовать ее самостоятельно в модуле объекта расширения:
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
Если ЭтоНовый() И ЗначениеЗаполнено(ЭтотОбъект.ДополнительныйКод) = Ложь Тогда
// Здесь можно реализовать логику генерации своего номера
ЭтотОбъект.ДополнительныйКод = СгенерироватьНовыйУникальныйНомер();
КонецЕсли;
КонецПроцедуры
Если требования заказчика запрещают любое изменение структуры самого справочника (даже через расширение), мы можем использовать механизм внешнего хранения. Создание регистра сведений в расширении — отличный способ связать объект с дополнительными данными.
Посмотрим на алгоритм реализации:
СоответствиеКодов).СправочникСсылка.[ИмяСправочника] (заимствованную ссылку).ДлинныйКод нужной длины.Преимущество этого метода в том, что данные регистра хранятся в отдельной таблице СУБД, что полностью исключает риски повреждения основной базы при обновлении или удалении расширения.
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), рассмотрим наиболее «цивилизованный» путь — использование механизма дополнительных сведений.
Для этого не нужно писать код или менять метаданные в Конфигураторе. Достаточно:
1С:Предприятие.Строка.Этот способ позволяет пользователям хранить значения любой длины, однако стоит учесть, что поиск и индексация по таким полям в запросах будут работать медленнее, чем по индексированным реквизитам.
Проанализируем ситуацию, упомянутую в обсуждении: влияние на обмен данными (XDTO). Если ваша база данных участвует в обмене (например, с Бухгалтерией предприятия), увеличение длины кода может привести к фатальным ошибкам.
Посмотрим на пример: в вашей базе код стал 15 символов, а в принимающей базе он остался 10. При выгрузке через формат EnterpriseData или XDTO-пакеты система выдаст ошибку несоответствия типов. Даже если данные будут переданы, принимающая сторона «обрежет» лишние символы, что приведет к появлению дублей или невозможности сопоставить объекты. Всегда проверяйте структуры всех баз, участвующих в обмене, перед принятием решения об увеличении длины ключевых полей.
Мы выяснили, что напрямую изменить Длину кода в расширении невозможно из-за ограничений ядра платформы 1С. Для решения задачи следует использовать один из альтернативных методов:
Выбор конкретного метода зависит от архитектуры вашей системы и необходимости соблюдения строгих правил обновления основной конфигурации.