Как вывести диаграмму оплат игрока на форму элемента справочника в 1С?

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

Довольно часто при разработке интерфейсов возникает задача визуализировать данные непосредственно в карточке объекта. Например, открывая карточку игрока в справочнике Участники, администратор хочет сразу видеть график его платежей за текущий месяц. Это позволяет быстро оценить активность клиента, не прибегая к формированию отдельных тяжелых отчетов. В данной статье мы разберем, как правильно реализовать такой функционал в управляемых формах 1С 8.3, избежав типичных ошибок начинающих разработчиков.

Шаг 1. Подготовка формы элемента

Прежде чем приступать к написанию кода, нам необходимо подготовить саму форму. Разберем этот процесс по шагам:

  1. Откроем форму элемента справочника в конфигураторе.
  2. В окне Реквизиты создадим новый реквизит формы. Назовем его ДиаграммаОплат. В поле Тип выберем Диаграмма (или ГрафическаяСхема, но для нашей задачи лучше подходит именно Диаграмма).
  3. Перетащим этот реквизит в дерево элементов формы. Система предложит создать Поле диаграммы.
  4. В свойствах элемента формы можно сразу задать желаемый вид (например, гистограмма или график) и настроить его заголовок.

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

Шаг 2. Создание запроса для получения данных

Для того чтобы диаграмма была информативной, нам нужно выгрузить данные из регистра накопления (например, ПриобритениеУслугПоМафии). Мы должны получить суммы оплат конкретного игрока за определенный период.

Проанализируем ситуацию: использование основной таблицы регистра (как это делает конструктор запроса по умолчанию) — не самое оптимальное решение. Лучше использовать виртуальную таблицу оборотов. Это значительно ускорит работу системы.

Рассмотрим пример правильного текста запроса с использованием параметров:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Обороты.Период КАК ДатаОплаты,
    |	Обороты.СуммаОборот КАК Сумма
    |ИЗ
    |	РегистрНакопления.ПриобритениеУслугПоМафии.Обороты(&НачалоПериода, &КонецПериода, День, Приходы = &ТекущийИгрок) КАК Обороты";

Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("ТекущийИгрок", Объект.Ссылка);

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

Шаг 3. Программное заполнение диаграммы на сервере

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

Разберем процедуру формирования диаграммы:


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

Шаг 4. Автоматизация вызова

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

Пример кода для переключения вкладок:


&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
    Если ТекущаяСтраница = Элементы.СтраницаСтатистика Тогда
        СформироватьДиаграммуНаСервере();
    КонецЕсли;
КонецПроцедуры

Шаг 5. Оптимизация структуры данных

Проанализируем структуру регистра. Если в вашем регистре измерение называется Приходы, а не Игрок или Контрагент, это может затруднить понимание кода другими разработчиками. Рекомендуем придерживаться стандартов разработки 1С. Также убедитесь, что тип данных в измерении — это СправочникСсылка.Участники, а не обычная строка. Поиск по строке (наименованию) крайне неэффективен и может привести к ошибкам, если в базе появятся полные тезки.

Дополнительные настройки визуализации

Чтобы сделать отчет более профессиональным, воспользуемся дополнительными методами объекта Диаграмма:

1. Отображение легенды: ДиаграммаОплат.ОбластьЛегенды.Видимость = Истина; поможет пользователю понять, что означают цвета на графике.

2. Подписи значений: Если столбиков много, полезно включить отображение конкретных цифр над ними. Это настраивается через свойство серии или самой диаграммы.

3. Цветовая гамма: Можно программно задать цвета для разных типов операций (например, зеленый для оплат, красный для возвратов), что значительно повышает читаемость данных.

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

← На главную