При разработке интерфейсов в «1С:Предприятие 8.3» часто возникает задача сделать форму максимально информативной и удобной для пользователя. Одним из таких приемов является вынос подробной информации о текущем товаре из табличной части в отдельную область формы (например, в шапку или специальную панель). Это позволяет пользователю сразу видеть все ключевые характеристики строки (номенклатуру, цену, остатки, скидки), не прокручивая таблицу вправо. Рассмотрим подробно, как это реализовать технически правильно, используя механизмы управляемых форм.
Первым делом проанализируем, как именно мы хотим отображать данные. Пользователь в исходном сообщении просил выводить «простой текст без поля». Если использовать стандартный реквизит формы с типом «Строка» и разместить его на форме, по умолчанию 1С создаст Поле ввода. Это не совсем то, что нужно, так как поле ввода имеет рамки и фон.
Разберем два варианта создания области вывода:
ТекстИнформации с типом «Строка»), у которого в свойстве «Вид» установлено значение «Поле надписи». Этот вариант удобнее, так как поле напрямую связано с данными.Для нашей задачи создадим реквизит формы ИнфоТекст (тип: Строка, длина: неограниченная) и перетащим его на форму, установив вид Поле надписи. Расположим его над табличной частью Товары.
Выясним причину, по которой код автора из сообщения №10 не работал корректно. Автор пытался использовать событие ПриИзменении, которое срабатывает только тогда, когда данные в поле уже изменены и зафиксированы. Для отслеживания перемещения курсора по строкам таблицы платформа предоставляет специальное событие — ПриАктивизацииСтроки.
Важное замечание: Событие ПриАктивизацииСтроки срабатывает очень часто: при открытии формы, при каждом клике на новую строку, при использовании стрелок на клавиатуре и даже при некоторых программных обновлениях таблицы. Поэтому код внутри этого обработчика должен быть максимально легким и выполняться только на клиенте.
Рассмотрим по шагам код, который позволит нам «вытащить» данные из активной строки и собрать их в красивую строку. Нам нужно обратиться к свойству ТекущиеДанные элемента формы, который отображает нашу таблицу.
Проанализируем пример кода:
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
// 1. Получаем данные текущей строки
ДанныеСтроки = Элементы.Товары.ТекущиеДанные;
// 2. Обязательно проверяем на Неопределено
// Это спасет от ошибки, если таблица пустая
Если ДанныеСтроки = Неопределено Тогда
ИнфоТекст = "Выберите товар в списке...";
Возврат;
КонецЕсли;
// 3. Формируем строку для вывода
// Используем значения из колонок табличной части
ТекстНоменклатура = Строка(ДанныеСтроки.Номенклатура);
ТекстЦена = Формат(ДанныеСтроки.Цена, "ЧЦ=15; ЧДЦ=2");
ТекстКолво = ДанныеСтроки.Количество;
ТекстСумма = Формат(ДанныеСтроки.Сумма, "ЧЦ=15; ЧДЦ=2");
// 4. Собираем итоговую строку
ИнфоТекст = ТекстНоменклатура + " | Цена: " + ТекстЦена + " | Кол-во: " + ТекстКолво + " | Итого: " + ТекстСумма;
КонецПроцедуры
В этом примере мы обращаемся напрямую к колонкам ДанныеСтроки.Номенклатура и другим. Обратите внимание, что мы используем функцию Строка() и Формат() для того, чтобы числа и ссылки выглядели в текстовом поле презентабельно.
Чтобы код выглядел чище, а формирование сложных строк не превращалось в «склеивание плюсиками», в современных версиях 8.3 рекомендуется использовать функцию СтрШаблон. Разберем, как это упрощает жизнь программисту.
Посмотрим на обновленный вариант формирования строки:
ШаблонТекста = "%1 (Кол-во: %2, Цена: %3, Сумма: %4)";
ИнфоТекст = СтрШаблон(ШаблонТекста,
ДанныеСтроки.Номенклатура,
ДанныеСтроки.Количество,
ДанныеСтроки.Цена,
ДанныеСтроки.Сумма);
Использование СтрШаблон позволяет легко менять порядок данных или добавлять пояснительный текст, не запутываясь в кавычках и операторах сложения.
Иногда данных в самой табличной части недостаточно. Например, нам нужно вывести артикул или страну происхождения товара, которых нет в колонках таблицы. Здесь кроется главная ловушка производительности: нельзя делать серверные вызовы в событии ПриАктивизацииСтроки напрямую. Если пользователь будет быстро пролистывать список стрелками, интерфейс начнет «заикаться» из-за постоянных обращений к базе данных.
Как правильно поступить в такой ситуации?
ТекущиеДанные мгновенно и без вызова сервера.ПодключитьОбработчикОжидания. При активации строки запускайте таймер (например, на 0.3 секунды). Если за это время пользователь не перешел на другую строку, только тогда выполняйте серверный вызов.Если ваша задача — не просто показать текст сверху, а акцентировать внимание на строке, проанализируем возможности Условного оформления. В свойствах формы на закладке «Условное оформление» можно настроить правила так, чтобы текущая строка подсвечивалась особым цветом или шрифтом.
Хотя это не заменяет вывод информации в отдельное поле, это отличное дополнение к интерфейсу. Для этого в условии оформления можно использовать параметр ТекущаяСтрока, сравнивая его с ключевым полем таблицы.
Мы разобрали, что для корректного отображения данных активной строки необходимо использовать событие ПриАктивизацииСтроки. Мы выяснили, что безопасность кода обеспечивается проверкой на Неопределено, а скорость работы — отказом от серверных вызовов в пользу использования данных, уже загруженных в таблицу. Используя СтрШаблон и декорации формы, вы получите профессиональный и отзывчивый интерфейс, который будет помогать пользователю в работе с документами.