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

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

При разработке интерфейсов на платформе «1С:Предприятие 8» программисты часто сталкиваются с необходимостью вывести пользователю список данных, который содержит не только наименование, но и дополнительные сведения, например, артикул, код или остаток. Начинающие разработчики логично пытаются использовать для этого стандартный тип СписокЗначений, однако быстро обнаруживают, что добавить в него произвольную колонку стандартными средствами невозможно.

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

Почему нельзя расширить СписокЗначений?

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

  1. Значение — сам объект (ссылка, число, строка и т.д.).
  2. Представление — текст, который видит пользователь.
  3. Пометка — логическое значение для выбора нескольких элементов.
  4. Картинка — индекс или сама картинка для визуализации.

Попытка программно добавить новую колонку в этот объект не предусмотрена синтаксисом встроенного языка. Если нам нужно отобразить дополнительные данные (например, КодЭлемента), нам придется использовать альтернативные механизмы.

Решение №1: Использование Таблицы Значений (Рекомендуемый способ)

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

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

  1. Создадим на форме новый реквизит (например, с именем ТаблицаВыбора).
  2. Установим ему тип ТаблицаЗначений.
  3. Добавим внутрь этого реквизита необходимые колонки: Значение, Представление и вашу специфическую колонку — КодЭлемента.
  4. Перетащим этот реквизит на элементы формы. Платформа создаст элемент типа Таблица.

Чтобы эта таблица выглядела для пользователя как обычный список, мы можем настроить свойства элемента формы (таблицы):

— Отключим отображение заголовков, если это необходимо.
— Настроим режим выделения строки.
— Уберем командную панель или оставим только нужные кнопки.

Пример программного заполнения такой таблицы:


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

Решение №2: Формирование составного Представления

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

Выясним, как это реализовать программно. Мы можем объединить код и наименование в одну строку, используя специальные разделители или форматирование. Посмотрим на пример кода:


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

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

Решение №3: Динамический список

Если ваша задача — отобразить данные из базы данных с возможностью поиска, отбора и сортировки по коду, то лучшим решением будет ДинамическийСписок. Рассмотрим, чем он удобнее в данном контексте:

Проанализируем настройку: в свойствах динамического списка установим флаг "Произвольный запрос" и добавим поле Код. После этого на форме появится возможность вытащить это поле как отдельную колонку. Это именно тот метод, который чаще всего используется в типовых решениях (УТ 11, ERP, БП 3.0) для подбора товаров или выбора контрагентов.

Что выбрать в итоге?

Подведем итоги нашего исследования. Выбор метода зависит от контекста вашей задачи:

  1. Если вам нужно хранить временный набор данных, не связанных напрямую с одной таблицей базы данных, и отображать его в нескольких колонках — выбирайте Таблицу Значений.
  2. Если вам нужно быстро показать код рядом с названием в уже существующем СпискеЗначений — используйте конкатенацию строк в Представлении.
  3. Если данные берутся из справочника или документа и их много — используйте Динамический Список.

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

← На главную