Как реализовать множественный выбор в одном поле на форме и почему исчезает элемент при привязке к табличной части?

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

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

Анализ проблемы: Почему поле не отображается?

Разберем ситуацию, описанную автором. Разработчик добавил на форму элемент с видом ПолеВвода и в свойстве ПутьКДанным указал табличную часть объекта (Объект.ТаблЧасть). После запуска в пользовательском режиме поле просто исчезло.

Давайте выясним причину этого поведения:

  1. Несоответствие типов данных. Элемент формы Поле (вид Поле ввода) предназначен для отображения простых типов данных (Строка, Число, Дата, Булево) или ссылочных типов. Табличная часть — это коллекция строк, сложный объект. Платформа не знает, как "свернуть" целую таблицу в одну строку ввода автоматически.
  2. Механизм отрисовки. Когда платформа видит несоответствие между типом элемента управления и типом данных, она часто скрывает элемент. Чтобы лучше понять поведение элементов и их свойств "на лету", можно использовать редактор форм в режиме предприятия, позволяющий анализировать свойства открытых форм.

Если ваша версия платформы 8.3.23 и выше, 1С представила штатный механизм множественного выбора в поле ввода. Стоит также учитывать, что в более ранних версиях, таких как 8.3.21, уже начал появляться перечень множественных значений в ячейке динамического списка, что упростило отображение данных в списках. Однако для обычных полей ввода в версиях 8.3.22 и ниже нам необходимо применять программные обходные пути.

Решение №1: Использование булевых реквизитов (Оптимально для фиксированного списка)

Проанализируем задачу: нужно выбрать комбинацию из трех вариантов (Завтрак, Обед, Ужин). Список закрытый и вряд ли будет расширяться до сотен позиций.

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

Как это реализовать на форме объекта:

  1. В объекте создаем три реквизита типа Булево.
  2. Называем их понятными именами: ВключенЗавтрак, ВключенОбед, ВключенУжин.
  3. Выносим эти реквизиты на форму.
  4. В свойствах элементов формы устанавливаем вид Поле флажка.
  5. Для компактности группируем их в группу с видом Группа - Обычная группа и группировкой Горизонтальная.

Решение №2: Имитация поля с множественным выбором (Паттерн "Строка + Коллекция")

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

Суть метода заключается в разделении хранения и представления.

Шаг 1: Подготовка реквизитов

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

Шаг 2: Настройка элемента формы

Размещаем ПредставлениеВыбранногоПитания на форме как поле ввода. В свойствах устанавливаем КнопкаВыбора = Да и РедактированиеТекста = Нет.

Шаг 3: Программная логика (Синхронизация при открытии)


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    МассивСтрок = Новый Массив;
    Для Каждого Стр Из Объект.ТаблицаПитания Цикл
        МассивСтрок.Добавить(Строка(Стр.ВидПитания));
    КонецЦикла;
    ПредставлениеВыбранногоПитания = СтрСоединить(МассивСтрок, ", ");
КонецПроцедуры

Шаг 4: Обработка выбора

В событии НачалоВыбора отменяем стандартную обработку и открываем форму подбора. После закрытия формы обновляем ТЧ и строковое представление.

Решение №3: Использование списка значений на форме

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

При нажатии на кнопку выбора откроется диалоговое окно редактирования списка. Это решение "дешевое" в разработке, хотя и требует от пользователя на один-два клика больше.

Рекомендации по именованию (Best Practices)

Чтобы интерфейс и код были качественными, рекомендуем придерживаться профессиональных правил:

  1. Избегайте абстракций. Имена ТаблЧасть или Поле1 плохи тем, что не несут смысла.
  2. Венгерская нотация не нужна. Контекст использования в 1С v8 обычно понятен без префиксов.
  3. Смысловая нагрузка.
    • Для табличных частей используйте множественное число: Товары, СоставБлюд.
    • Для булевых переменных используйте утверждения: ЕстьДоставка, ЯвляетсяУслугой.

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

← На главную