Как растянуть поле дополнительного реквизита на форме в 1С:Документооборот?

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

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

Почему поле не растягивается автоматически?

Разберем ситуацию: вы создали дополнительный реквизит, указали для него тип Строка, задали длину в 600 символов и установили МногострочныйРежим = 4. Казалось бы, этого достаточно, но на форме поле остается узким. Рассмотрим основные причины такого поведения:

  1. Автомаксимальная ширина: По умолчанию для строковых полей в БСП часто устанавливается свойство АвтоМаксимальнаяШирина = Истина. Это ограничивает визуальную длину поля, исходя из среднестатистической ширины символов.
  2. Настройки родительской группы: Дополнительные реквизиты помещаются в специальную группу (обычно с именем ГруппаДополнительныеРеквизиты). Если у этой группы или её вышестоящих контейнеров стоит ограничение по ширине или выбран вид «Группа колонок», внутренние элементы не смогут растянуться больше, чем позволяет контейнер.
  3. Программное формирование БСП: Механизм УправлениеСвойствами создает элементы формы «на лету». Все изменения, внесенные в конфигураторе для обычных реквизитов, здесь неприменимы, так как самого элемента формы в дереве объектов конфигурации просто не существует.

Способ 1. Программное изменение свойств элемента

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

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


&НаСервере
Процедура НастроитьРастягиваниеДопРеквизита(ИмяРеквизита)
    
    // Получаем ссылку на дополнительный реквизит (ПВХ ДополнительныеРеквизитыИСведения)
    // ИмяРеквизита — это наименование вашего допа
    СсылкаНаДопник = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяРеквизита);
    
    Если СсылкаНаДопник.Пустая() Тогда
        Возврат;
    КонецЕсли;

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

КонецПроцедуры

Способ 2. Использование расширения (рекомендуется)

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

В расширении для формы документа создаем метод:


&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // В БСП параметры созданных свойств часто хранятся в служебной структуре
    // Это более производительный поиск, чем перебор всех элементов формы
    Если ЭтотОбъект.СвойстваУправлениеСвойствами.Свойство("ПараметрыСвойств") Тогда
        Для Каждого ОписаниеСвойства Из ЭтотОбъект.СвойстваУправлениеСвойствами.ПараметрыСвойств Цикл
            
            // Проверяем, наш ли это реквизит по имени метаданных
            Если ОписаниеСвойства.Наименование = "ВашеНазваниеРеквизита" Тогда
                Элемент = Элементы.Найти(ОписаниеСвойства.ИмяЭлемента);
                Если Элемент <> Неопределено Тогда
                    Элемент.АвтоМаксимальнаяШирина = Ложь;
                    Элемент.РастягиватьПоГоризонтали = Истина;
                КонецЕсли;
            КонецЕсли;
            
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

Важные нюансы настройки групп

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

Практические рекомендации по настройке групп:

Использование «грязных хаков» и внешних инструментов

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

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

  1. Обязательно устанавливайте АвтоМаксимальнаяШирина = Ложь. Без этого флаг РастягиватьПоГоризонтали может игнорироваться.
  2. Если поле строковое и многострочное, убедитесь, что Высота установлена больше 1, иначе визуально оно не будет похоже на поле для ввода текста в 600 символов.
  3. В веб-клиенте растягивание может зависеть от выбранной темы оформления. Протестируйте отображение в тонком клиенте — если там всё работает, значит проблема в CSS-стилях веб-интерфейса, на которые программно повлиять сложнее.

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

← На главную