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