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