Почему в динамическом списке отображается только один символ и как это исправить?

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

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

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

Выясним причину обрезки строк

В основе механизма динамического списка лежит система компоновки данных (СКД). Поведение элементов формы формируется следующим образом:

  1. Определение типа литералов в СКД: если в конфигураторе динамическому списку задан запрос вида ВЫБРАТЬ "" КАК Наименование, платформа автоматически типизирует строковый литерал как строку фиксированной длины (в зависимости от релиза платформы — 0 или 1 символ).
  2. Фиксация метаданных элементов: на этапе инициализации формы визуальные элементы (колонки таблицы) связываются с типами полей исходной схемы компоновки и жестко фиксируют ограничения на формат вывода.
  3. Отсутствие автоматической перерисовки: при программной перезаписи свойств ОсновнаяТаблица и ТекстЗапроса в контексте формы сам механизм выборки данных обновляется, однако уже созданные визуальные элементы таблицы не выполняют автоматический перерасчет метаданных и продолжают обрезать строковые значения до минимальной длины.
  4. Проблемы с отборами и поиском: помимо визуальной обрезки, поля с некорректно определенным типом вызывают сбои при глобальном поиске по списку, а также при наложении пользовательских фильтров и сортировок.

Способ 1. Принудительное обновление дерева элементов формы через фиктивный элемент

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

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Устанавливаем реальный запрос
    Список.ОсновнаяТаблица = "Справочник.Номенклатура";
    Список.ТекстЗапроса = 
        "ВЫБРАТЬ
        |	Номенклатура.Ссылка КАК Ссылка,
        |	Номенклатура.Код КАК Код,
        |	Номенклатура.Наименование КАК Наименование,
        |	Номенклатура.Артикул КАК Артикул
        |ИЗ
        |	Справочник.Номенклатура КАК Номенклатура";
    
    // Инициируем обновление метаданных колонок
    ВременныйЭлемент = Элементы.Добавить("ФиктивноеПолеДляСброса", Тип("ПолеФормы"), Элементы.Список);
    Элементы.Удалить(ВременныйЭлемент);
    
КонецПроцедуры

Факт добавления элемента в коллекцию Элементы помечает структуру формы как модифицированную. При отправке формы клиенту платформа заново рассчитывает ширину и типы данных для всех полей динамического списка.

Способ 2. Корректный запрос-заглушка с условием ГДЕ ЛОЖЬ

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

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


ВЫБРАТЬ
	Номенклатура.Ссылка КАК Ссылка,
	Номенклатура.Код КАК Код,
	Номенклатура.Наименование КАК Наименование,
	Номенклатура.Артикул КАК Артикул
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	ЛОЖЬ

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

Способ 3. Явная типизация полей через ВЫРАЗИТЬ

Если запрос-заглушка не привязан к конкретной таблице метаданных, строковые поля в тексте запроса в конфигураторе можно явно привести к нужной длине с помощью функции ВЫРАЗИТЬ:


ВЫБРАТЬ
	"" КАК Ссылка,
	ВЫРАЗИТЬ("" КАК СТРОКА(150)) КАК Наименование,
	ВЫРАЗИТЬ("" КАК СТРОКА(25)) КАК Артикул

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

Способ 4. Использование процедур Библиотеки стандартных подсистем (БСП)

Если конфигурация разработана с применением БСП, для изменения параметров списка рекомендуется применять специализированную процедуру ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка. Она комплексно обновляет свойства списка за один вызов, предотвращая рассинхронизацию между структурой запроса и формой:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    НастройкиСписка = Новый Структура;
    НастройкиСписка.Вставить("ОсновнаяТаблица", "Справочник.Номенклатура");
    НастройкиСписка.Вставить("ТекстЗапроса", 
        "ВЫБРАТЬ
        |	Номенклатура.Ссылка КАК Ссылка,
        |	Номенклатура.Наименование КАК Наименование
        |ИЗ
        |	Справочник.Номенклатура КАК Номенклатура");
    
    ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(ЭтотОбъект, "Список", НастройкиСписка);
    
КонецПроцедуры

Способ 5. Полностью динамическое создание колонок

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


&НаСервере
Процедура СоздатьКолонкуСписка(ИмяПоля, Заголовок)
    
    НоваяКолонка = Элементы.Добавить(ИмяПоля, Тип("ПолеФормы"), Элементы.Список);
    НоваяКолонка.Вид = ВидПоляФормы.ПолеНадписи;
    НоваяКолонка.ПутьКДанным = "Список." + ИмяПоля;
    НоваяКолонка.Заголовок = Заголовок;
    
КонецПроцедуры

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

← На главную