В практике разработки интерфейсов на платформе 1С:Предприятие мы часто сталкиваемся с задачей компактного отображения данных. Одна из типичных ситуаций: необходимо дать пользователю возможность выбрать несколько значений (например, виды питания: Завтрак, Обед, Ужин), но не загромождать форму таблицами, а отобразить выбор в одной строке. Для эффективного решения подобных задач разработчикам часто помогает программное изменение форм, которое позволяет стандартизировать добавление элементов и команд. Рассмотрим подробно, почему возникают типичные ошибки привязке данных к элементам формы при реализации этой задачи и какие существуют паттерны решения для версий платформы 8.3.22 и ниже.
Разберем ситуацию, описанную автором. Разработчик добавил на форму элемент с видом ПолеВвода и в свойстве ПутьКДанным указал табличную часть объекта (Объект.ТаблЧасть). После запуска в пользовательском режиме поле просто исчезло.
Давайте выясним причину этого поведения:
Поле (вид Поле ввода) предназначен для отображения простых типов данных (Строка, Число, Дата, Булево) или ссылочных типов. Табличная часть — это коллекция строк, сложный объект. Платформа не знает, как "свернуть" целую таблицу в одну строку ввода автоматически.Если ваша версия платформы 8.3.23 и выше, 1С представила штатный механизм множественного выбора в поле ввода. Стоит также учитывать, что в более ранних версиях, таких как 8.3.21, уже начал появляться перечень множественных значений в ячейке динамического списка, что упростило отображение данных в списках. Однако для обычных полей ввода в версиях 8.3.22 и ниже нам необходимо применять программные обходные пути.
Проанализируем задачу: нужно выбрать комбинацию из трех вариантов (Завтрак, Обед, Ужин). Список закрытый и вряд ли будет расширяться до сотен позиций.
В этом случае создание табличной части может быть избыточным. Самым простым и быстрым решением будет создание отдельных реквизитов. К слову, аналогичный подход визуализации часто применяется в списках, например, когда реализуется флажок в динамическом списке в 1С 8.3.
Как это реализовать на форме объекта:
Булево.ВключенЗавтрак, ВключенОбед, ВключенУжин.Поле флажка.Группа - Обычная группа и группировкой Горизонтальная.Если же вариантов выбора много или мы обязаны сохранять данные именно в Табличной Части, применим классический паттерн имитации. В некоторых сложных случаях для управления такими данными может потребоваться даже программное создание колонок в табличной части документа с сохранением значений.
Суть метода заключается в разделении хранения и представления.
Шаг 1: Подготовка реквизитов
В объекте оставляем табличную часть (например, ТаблицаПитания) с реквизитом ВидПитания. На форме создаем строковый реквизит формы ПредставлениеВыбранногоПитания.
Шаг 2: Настройка элемента формы
Размещаем ПредставлениеВыбранногоПитания на форме как поле ввода. В свойствах устанавливаем КнопкаВыбора = Да и РедактированиеТекста = Нет.
Шаг 3: Программная логика (Синхронизация при открытии)
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
МассивСтрок = Новый Массив;
Для Каждого Стр Из Объект.ТаблицаПитания Цикл
МассивСтрок.Добавить(Строка(Стр.ВидПитания));
КонецЦикла;
ПредставлениеВыбранногоПитания = СтрСоединить(МассивСтрок, ", ");
КонецПроцедуры
Шаг 4: Обработка выбора
В событии НачалоВыбора отменяем стандартную обработку и открываем форму подбора. После закрытия формы обновляем ТЧ и строковое представление.
Еще один способ — использование реквизита формы с типом СписокЗначений. Если выбрать вид Поле ввода, 1С предоставит стандартный интерфейс для работы с этим типом данных. Подобный разбор задачи с собеседования показывает раскрытие потенциала Списка значений как очень гибкого инструмента для подобных интерфейсных решений.
При нажатии на кнопку выбора откроется диалоговое окно редактирования списка. Это решение "дешевое" в разработке, хотя и требует от пользователя на один-два клика больше.
Чтобы интерфейс и код были качественными, рекомендуем придерживаться профессиональных правил:
ТаблЧасть или Поле1 плохи тем, что не несут смысла.Товары, СоставБлюд.ЕстьДоставка, ЯвляетсяУслугой.Используя эти подходы, вы сможете создать интуитивно понятный интерфейс даже на старых версиях платформы, обойдя технические ограничения элемента Поле ввода.