При разработке интерфейсов на управляемых формах часто возникает задача сделать отчет или список более компактным. Одной из частых просьб пользователей является визуальное объединение числового значения суммы и строкового наименования валюты в одной ячейке (например, «15 000 руб.» вместо двух отдельных колонок). Давайте разберем, как реализовать такую задачу в динамическом списке, какие инструменты для этого доступны и с какими ограничениями можно столкнуться.
Основная сложность заключается в том, что динамический список в 1С базируется на запросе к базе данных. Когда мы пытаемся объединить число и строку в запросе, результат автоматически приводится к типу Строка. Это лишает нас двух важных преимуществ: стандартного отбора по сумме (сравнение «больше», «меньше») и возможности автоматического вывода итогов в подвале списка. Тем не менее, если визуальная составляющая приоритетнее, мы можем применить несколько подходов.
Одним из самых простых способов «обмануть» интерфейс без изменения структуры запроса является настройка Условное оформление. Этот метод позволяет изменять визуальное представление данных, не затрагивая их тип в базе.
Условное оформление.Оформление найдите параметр Формат.ЧФ='Ч руб.'.Важное примечание: Этот метод имеет ограничение. Если в вашем списке используются разные валюты, универсальная настройка формата не подойдет, так как для каждой валюты потребуется создавать отдельное правило в условном оформлении, что может привести к избыточности настроек.
Если требуется высокая гибкость (например, валюта берется из текущей строки и должна отображаться динамически), эффективным методом будет использование события ПриПолученииДанных. Это событие вызывается при формировании каждой строки списка, что позволяет нам «на лету» подменять отображаемый текст ячейки.
Разберем пример реализации. Предположим, у нас есть колонки Сумма и Валюта, которые мы хотим скрыть или просто дополнить текстом в основной колонке:
&НаСервере
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого Оформление Из ОформленияСтрок Цикл
ДанныеСтроки = Оформление.ДанныеСтроки;
Сумма = ДанныеСтроки.Сумма;
Валюта = ДанныеСтроки.Валюта;
// Форматируем сумму, убирая лишние разделители, если это необходимо
СтрокаСуммы = Формат(Сумма, "ЧГ=0");
// Объединяем значения
Оформление.Ячейки.Сумма.Текст = СтрокаСуммы + " " + Валюта;
КонецЦикла;
КонецПроцедуры
При использовании этого метода важно помнить о функции Формат(). Если вы просто сложите число и строку, система может добавить нежелательный разделитель групп разрядов или точку. Используя ЧГ=0, мы принудительно отключаем группировку разрядов, что позволяет получить «чистую» строку для отображения.
Работая над этой задачей, важно учитывать следующие аспекты:
Рассчитать итоги в подвале списка. 1С не умеет суммировать строки, содержащие символы валют.Настроить список, используя скрытые поля, а визуально видеть объединенную строку.ПриПолученииДанных является достаточно затратной операцией при большом количестве строк на экране, поэтому старайтесь минимизировать сложные вычисления внутри цикла.Подводя итог, можно сказать, что выбор способа зависит от ваших целей. Если валюта одна — используйте Условное оформление. Если валют много и они меняются — используйте программную доработку в ПриПолученииДанных. Если же вам жизненно необходимы итоги и сложная фильтрация, лучше оставить сумму и валюту в разных колонках, так как это идеологически более правильный подход для платформы 1С.