Многие разработчики сталкиваются с ситуацией, когда в типовой конфигурации, находящейся на поддержке, необходимо изменить длину строкового реквизита (например, увеличить её с 13 до 30 символов). Использование расширений кажется логичным и простым выходом, однако на практике стандартное изменение свойств заимствованного реквизита не дает желаемого результата. Разберем подробно, почему так происходит и как правильно решить эту задачу.
Рассмотрим ситуацию, с которой столкнулся автор темы: реквизит заимствован в расширение, флаг «Проверять значение при подключении расширения» снят, длина в расширении увеличена, но в режиме «1С:Предприятие» поле все равно обрезает строку. Проанализируем причину этого поведения платформы.
Основная проблема заключается в архитектуре работы расширений. Когда мы заимствуем объект метаданных (например, документ или справочник) и его реквизит, платформа 1С использует физическую структуру таблицы основной конфигурации в базе данных (SQL или файловой). Изменение длины реквизита в расширении — это изменение логического описания типа внутри самого расширения, но оно не инициирует реструктуризацию таблиц базы данных для заимствованных полей.
Простыми словами: база данных «знает», что в колонке может храниться только 13 символов. Даже если расширение «думает», что там 30, при попытке записи или отображения данных платформа будет принудительно обрезать их согласно физическому ограничению основной конфигурации. Именно поэтому снятие флага проверки типа лишь позволяет расширению «согласиться» с несоответствием, но не дает возможности расширить физическое хранилище.
Выясним, на что на самом деле влияет этот флаг. Он предназначен для валидации метаданных в момент старта системы:
Поскольку напрямую изменить длину заимствованного реквизита нельзя, рассмотрим эффективные способы решения этой задачи без снятия конфигурации с поддержки.
Это самый надежный и правильный метод с точки зрения архитектуры 1С. Вместо того чтобы пытаться «растянуть» существующее поле, мы создадим новое, которое будет полностью принадлежать расширению.
Рассмотрим алгоритм действий по шагам:
ИмяРеквизита_Расширение и установите длину 30 символов.Ложь) стандартное поле ввода и добавьте на форму поле, связанное с вашим новым реквизитом ИмяРеквизита_Расширение.Посмотрим на пример кода в модуле объекта расширения для синхронизации данных при записи:
&Перед("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Если новый реквизит заполнен, копируем часть данных в старый для совместимости
// (только если это необходимо для работы типовых механизмов)
ЭтотОбъект.СтарыйРеквизит = Лев(ЭтотОбъект.ИмяРеквизита_Расширение, 13);
КонецПроцедуры
Проанализируем ситуацию с существующими данными. Чтобы пользователь увидел старые данные в новом поле при первом открытии, можно использовать обработчик ПриЧтенииНаСервере в модуле формы:
&НаСервере
&После("ПриЧтенииНаСервере")
Процедура Расш_ПриЧтенииНаСервере(ТекущийОбъект)
// Если новое поле пустое, а старое заполнено — инициализируем новое поле
Если ПустаяСтрока(Объект.ИмяРеквизита_Расширение) И Не ПустаяСтрока(Объект.СтарыйРеквизит) Тогда
Объект.ИмяРеквизита_Расширение = Объект.СтарыйРеквизит;
КонецЕсли;
КонецПроцедуры
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), вы можете вообще не вносить изменения в структуру метаданных через расширение, а воспользоваться механизмом дополнительных сведений.
Рассмотрим преимущества этого подхода:
Иногда ограничение ввода накладывается не только на уровне метаданных, но и в свойствах самого элемента формы (поле ввода). Если в основной конфигурации длина реквизита позволяет хранить больше данных (например, тип ЛюбаяСсылка или составной тип), но на форме стоит ограничение, это можно исправить программно.
Выясним, как это сделать в расширении формы:
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Убираем ограничение на ввод символов, если тип данных позволяет
ЭлементФормы = ЭтаФорма.Элементы.НужноеПолеВвода;
ЭлементФормы.АвтоОтметкаНезаполненного = Ложь;
// Установка максимальной длины для элемента управления
ЭлементФормы.ОграничениеТипа = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(30));
КонецПроцедуры
Важно: Этот метод сработает только если ограничение типа в базе данных (в основной конфигурации) шире или совпадает с тем, что вы пытаетесь установить. В случае с физическим ограничением колонки таблицы (как в исходной задаче — 13 символов), этот метод бесполезен для сохранения данных, так как запись в базу все равно обрежет строку.
Мы выяснили, что расширения в 1С на текущий момент (включая платформу 8.3.12 и старше) не позволяют изменять физическую длину заимствованных реквизитов из-за особенностей работы с базой данных.
Рекомендация: Для качественного решения задачи используйте создание нового реквизита в расширении. Это обеспечит стабильную работу системы, корректное хранение данных и отсутствие проблем при обновлении основной конфигурации. Не забывайте прописывать логику синхронизации данных между старым и новым реквизитом, если на старый реквизит завязаны типовые отчеты или запросы в коде основной конфигурации.