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