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