Как убрать сокращение наименований в поле ввода со списком значений в обычных формах 1С?

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

При разработке и сопровождении конфигураций на обычных (неуправляемых) формах разработчики часто сталкиваются с ситуацией, когда в элементе управления ПолеВвода, привязанном к реквизиту с типом СписокЗначений, длинные наименования выбранных элементов автоматически обрезаются платформой с добавлением многоточия. Рассмотрим подробно, почему так происходит и какими способами можно обойти данное ограничение платформы.

Выясним причину: встроенный механизм отрисовки платформы

Проанализируем поведение элемента формы: если связать реквизит типа СписокЗначений с элементом управления ПолеВвода, платформа берет на себя автоматическое формирование сводной строки через запятую. Однако во внутренний движок отрисовки обычного приложения зашит жесткий лимит длины строкового представления одного элемента — примерно 25–26 символов. Если представление элемента превышает этот порог, платформа принудительно обрезает строку и дописывает троеточие.

Важно понимать: в палитре свойств элемента управления ПолеВвода нет штатных настроек (формата, маски или длины строки), которые могли бы отключить это поведение. Включение свойства МногострочныйРежим = Истина также не решает задачу — платформа лишь начинает переносить текст на новые строки, продолжая сокращать сами элементы до 25 символов. Обойти эту особенность стандартными галочками в конфигураторе невозможно, поэтому разберем практические способы доработки формы.

Способ 1. Динамическая всплывающая подсказка без изменения типа поля

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

Разберем по шагам, как это реализовать:

  1. Оставляем элемент управления ПолеВвода и его связь с реквизитом СписокЗначений без изменений.
  2. В модуле формы создаем функцию, которая преобразует элементы списка в единую строку без сокращений.
  3. Вызываем обновление подсказки при открытии формы и в событии ПриИзменении поля ввода.

Посмотрим на пример реализации кода:


Функция ПолучитьПолныйТекстСписка(Список)
    
    Результат = "";
    Для Каждого ЭлементСписка Из Список Цикл
        Если Не ПустаяСтрока(Результат) Тогда
            Результат = Результат + ", ";
        КонецЕсли;
        Результат = Результат + СокрЛП(ЭлементСписка.Представление);
    КонецЦикла;
    
    Возврат Результат;

КонецФункции

Процедура СписокОрганизацийПриИзменении(Элемент)
    
    ЭлементыФормы.СписокОрганизаций.Подсказка = ПолучитьПолныйТекстСписка(СписокОрганизаций);

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

Способ 2. Замена поля ввода на строку неограниченной длины

Если требования пользователей категоричны и обрезанные строки не должны отображаться вовсе, применим схему разделения интерфейсного представления и данных. В качестве отображаемого реквизита на форме используем обычную строку, а сам СписокЗначений будем хранить в памяти модуля или отдельном невидимом реквизите формы.

Разберем алгоритм решения:

  1. Создаем строковый реквизит формы (длина 0 или неограниченная) и связываем его с полем ввода.
  2. Для поля ввода устанавливаем свойство КнопкаВыбора = Истина.
  3. В обработчике события НачалоВыбора отключаем стандартную обработку и вызываем форму редактирования исходного списка значений с помощью метода ОтметитьЭлементы().
  4. После завершения выбора переформировываем строковое представление всех отмеченных элементов без каких-либо сокращений.

Посмотрим, как выглядит программная обработка такого поля:


Процедура ПолеВводаСтрокаНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // М_СписокЗначений - список с реальными объектами, хранящийся в модуле
    Если М_СписокЗначений.ОтметитьЭлементы("Выберите элементы") Тогда
        СтроковоеПредставление = "";
        Для Каждого ТекЭлемент Из М_СписокЗначений Цикл
            Если ТекЭлемент.Пометка Тогда
                Если Не ПустаяСтрока(СтроковоеПредставление) Тогда
                    СтроковоеПредставление = СтроковоеПредставление + ", ";
                КонецЕсли;
                СтроковоеПредставление = СтроковоеПредставление + СокрЛП(ТекЭлемент.Представление);
            КонецЕсли;
        КонецЦикла;
        
        Элемент.Значение = СтроковоеПредставление;
    КонецЕсли;

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

Способ 3. Использование компактного табличного поля

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

Табличное поле связывается напрямую с объектом СписокЗначений. В отличие от поля ввода, табличное поле отображает значения построчно в колонке, где ширина текста не ограничивается искусственным лимитом ядра платформы, а полностью адаптируется под размер колонки или формы. Пользователь получает возможность просматривать полные наименования и управлять флажками выбора элементов непосредственно на форме документа или отчета.

← На главную