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

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

При разработке на платформе 1С 8.3 программисты часто сталкиваются с задачей, когда в конкретной колонке табличной части необходимо предоставить пользователю выбор из определенного набора значений. Начинающие разработчики часто пытаются вызвать метод Добавить() напрямую у элемента формы, что приводит к ошибкам типа «Метод не обнаружен». В этой статье мы разберем, как правильно обращаться к спискам в табличных частях, проанализируем типичные ошибки и рассмотрим несколько эффективных способов решения этой задачи.

Понимание разницы между данными и элементами формы

Для начала разберем фундаментальную причину возникновения ошибок, упомянутых в обсуждении. В управляемом приложении 1С существует четкое разделение между данными (то, что хранится в базе или реквизитах формы) и элементами формы (то, как эти данные отображаются на экране). Рассмотрим ситуацию, когда у нас есть табличная часть Содержание и колонка Test.

Если мы пытаемся написать Элементы.СодержаниеTest.Добавить(), платформа выдает ошибку, потому что Элементы.СодержаниеTest — это объект типа ПолеФормы. У этого объекта нет метода Добавить(), так как он предназначен для визуализации, а не для хранения коллекции. Чтобы программно управлять списком, который увидит пользователь, нам нужно работать либо со свойством СписокВыбора этого элемента, либо напрямую с данными текущей строки.

Способ 1. Использование свойства СписокВыбора для всей колонки

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


&НаСервере
Процедура ЗаполнитьСписокВыбораНаСервере()
    // Получаем элемент формы, отвечающий за колонку
    ПолеСписка = Элементы.СодержаниеОбслуживанияTest;
    
    // Очищаем старые значения, если они были
    ПолеСписка.СписокВыбора.Очистить();
    
    // Заполняем новыми данными
    Выборка = Справочники.Должности.Выбрать();
    Пока Выборка.Следующий() Цикл
        ПолеСписка.СписокВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование);
    КонецЦикла;
    
    // Важно: устанавливаем режим выбора из списка
    ПолеСписка.РежимВыбораИзСписка = Истина;
КонецПроцедуры

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

Способ 2. Обработка события НачалоВыбора (динамическое заполнение)

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

Алгоритм действий будет следующим:

  1. Перехватываем событие нажатия на кнопку выбора.
  2. Отключаем стандартную обработку 1С, чтобы не открывалась форма справочника.
  3. Формируем список значений программно.
  4. Вызываем метод ПоказатьВыборИзСписка().

&НаКлиенте
Процедура СодержаниеОбслуживанияTestНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    // 1. Отменяем стандартное поведение платформы
    СтандартнаяОбработка = Ложь;
    
    // 2. Получаем текущие данные строки, если это необходимо для логики
    ТекущаяСтрока = Элементы.Содержание.ТекущиеДанные;
    
    // 3. Формируем список (в реальной задаче лучше получить его с сервера)
    СписокДляВыбора = Новый СписокЗначений;
    // Здесь может быть вызов серверной функции для получения массива данных
    МассивДанных = ПолучитьСписокДолжностейНаСервере(ТекущаяСтрока.Подразделение);
    СписокДляВыбора.ЗагрузитьЗначения(МассивДанных);
    
    // 4. Описываем обработчик завершения выбора
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораИзСписка", ЭтотОбъект, ТекущаяСтрока);
    
    // 5. Показываем список пользователю
    ПоказатьВыборИзСписка(ОписаниеОповещения, СписокДляВыбора, Элемент);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораИзСписка(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
    Если ВыбранныйЭлемент <> Неопределено Тогда
        // Присваиваем выбранное значение в текущую строку ТЧ
        ДополнительныеПараметры.Test = ВыбранныйЭлемент.Значение;
    КонецЕсли;
КонецПроцедуры

Этот метод является наиболее правильным для современных управляемых форм. Он работает асинхронно, не блокирует интерфейс и позволяет реализовать любую логику фильтрации «на лету».

Способ 3. Работа с типом данных СписокЗначений в ячейке

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

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


&НаКлиенте
Процедура ДобавитьВСписокПрограммно()
    ТекущаяСтрока = Элементы.Содержание.ТекущиеДанные;
    
    Если ТекущаяСтрока <> Неопределено Тогда
        // Обращаемся к реквизиту строки, который имеет тип СписокЗначений
        // ВНИМАНИЕ: это работа с данными, а не с элементами формы!
        ТекущаяСтрока.ИмяРеквизитаСписка.Добавить(ПредопределенноеЗначение("Справочник.Должности.Директор"));
    КонецЕсли;
КонецПроцедуры

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

Типичные ошибки и советы по отладке

Проанализируем основные моменты, на которых спотыкаются разработчики:

Заключение

Программное обращение к списку значений в табличной части требует понимания того, что именно вы хотите сделать: либо ограничить выбор пользователя (использовать СписокВыбора или ПоказатьВыборИзСписка), либо изменить само содержимое ячейки (работать через ТекущиеДанные). Использование метода ПоказатьВыборИзСписка с обратным вызовом (Callback) является «золотым стандартом» разработки на управляемых формах 1С 8.3, обеспечивая гибкость и стабильность работы приложения.

← На главную