При разработке интерфейсов на платформе 1С:Предприятие 8.3 часто возникает задача визуализации планов или событий в удобном для пользователя виде. Это может быть календарь налоговых платежей, график дней рождения сотрудников или расписание задач менеджера. В рамках данной статьи мы разберем несколько способов реализации этой задачи, начиная от простых настроек стандартных полей и заканчивая использованием профессионального объекта Планировщик.
Самый быстрый способ вывести сетку календаря на форму — это использование типа данных Дата с определенным визуальным представлением. Давайте разберем по шагам, как это настроить.
Дата (состав даты — только дата).Теперь на форме отображается стандартный календарь. Однако автор темы столкнулся с вопросом: как же вывести в него события? Важно понимать, что стандартное Поле календаря не предназначено для вывода произвольного текста прямо в ячейки дат. Тем не менее, мы можем программно выделить даты, на которые приходятся события. Для этого проанализируем возможности программного управления этим элементом.
Для визуального выделения определенных дней (например, жирным шрифтом) используется метод УстановитьВыделение(). Рассмотрим пример кода, который можно разместить в процедуре ПриСозданииНаСервере или вызвать при обновлении данных:
&НаСервере
Процедура ВыделитьДатыССобытиями()
// Массив дат, которые нужно выделить
МассивДат = Новый Массив;
МассивДат.Добавить(Дата("20181001")); // Налоги
МассивДат.Добавить(Дата("20181002")); // ДР завхоза
// Элементы.Календарь - это имя вашего элемента на форме
Элементы.Календарь.ВыделенныеДаты = Новый СписокЗначений;
Для Каждого ТекДата Из МассивДат Цикл
Элементы.Календарь.ВыделенныеДаты.Добавить(ТекДата);
КонецЦикла;
КонецПроцедуры
Основной минус этого метода заключается в том, что пользователь не видит описание события, пока не нажмет на дату или не посмотрит в связанный список под календарем. Чтобы сделать интерфейс более информативным, рекомендуется размещать рядом с календарем Таблицу (динамический список или таблицу значений), которая будет фильтроваться при выборе даты в календаре.
Если ваша задача требует полноценного отображения событий с текстом, временем и возможностью редактирования «мышкой», то лучшим выбором будет использование специального типа данных — Планировщик. Это мощный инструмент, специально созданный для задач планирования.
Рассмотрим подробнее, как работать с планировщиком. Сначала необходимо добавить реквизит формы с типом Планировщик и перетащить его в элементы формы. В отличие от обычного календаря, планировщик требует программного заполнения коллекции его элементов.
Разберем пример программного заполнения планировщика событиями:
&НаСервере
Процедура ЗаполнитьПланировщикСобытиями()
// Очищаем текущие элементы
Планировщик.Элементы.Очистить();
// Добавляем событие "Налоги"
НовоеСобытие = Планировщик.Элементы.Добавить(Дата("20181001090000"), Дата("20181001180000"));
НовоеСобытие.Текст = "Налоги";
НовоеСобытие.Содержимое = "Необходимо оплатить НДС";
// Добавляем событие "День рождения"
ДР = Планировщик.Элементы.Добавить(Дата("20181002000000"), Дата("20181002235959"));
ДР.Текст = "ДР у завхоза";
ДР.ЦветФона = ЦветаСтиля.ЦветТекстаВыделения;
КонецПроцедуры
Проанализируем преимущества этого подхода. Планировщик позволяет настраивать шкалы времени (день, неделя, месяц), управлять измерениями (например, выводить графики в разрезе сотрудников) и поддерживать интерактивность. Вы можете обрабатывать события ПриИзмененииСоставаЭлементов или ПриНачалеРедактированияЭлемента, чтобы сохранять изменения напрямую в базу данных.
Как справедливо отмечено в обсуждении, для того чтобы «не изобретать велосипед», полезно заглянуть в код типовых решений от фирмы «1С». В частности, конфигурация «Зарплата и управление персоналом» (ЗУП 3.1) содержит отличные примеры работы с графиками и календарями. Проанализируем общую форму ПроизводственныйКалендарь или рабочие места кадровика.
В конфигурации «Управление торговлей 11» также реализованы механизмы взаимодействия с календарями в модулях CRM. Посмотрим на основные приемы, которые там используются:
Регистре сведений. Это позволяет быстро выбирать данные за нужный период (месяц или квартал) с помощью запроса.Если штатные средства Планировщик и Поле календаря кажутся слишком ограниченными в плане дизайна, существует «продвинутый» путь — использование Поля HTML-документа. Этот метод позволяет встроить в 1С полноценный веб-календарь (например, на базе JavaScript-библиотек).
Рассмотрим, как это работает концептуально:
Поле HTML-документа.Документ.событие() или через запись в текст документа.ПриНажатии или обработку события onclick с передачей управления платформе.Этот способ требует навыков веб-разработки, но дает неограниченные возможности по оформлению: градиенты, иконки, всплывающие подсказки любой сложности и плавную анимацию.
Выясним причину, почему календари могут работать медленно. Если у вас сотни событий, отрисовка их всех сразу на Планировщике может замедлить интерфейс. Выясним, как этого избежать:
Во-первых, всегда ограничивайте выборку данных текущим видимым периодом. Если пользователь смотрит октябрь, не нужно выбирать события за весь год. Используйте функции НачалоМесяца и КонецМесяца в запросах к базе данных.
Во-вторых, используйте кэширование на стороне сервера. Если данные событий меняются редко, их можно подготовить один раз при открытии формы и хранить в реквизите формы типа ТаблицаЗначений, обновляя только при необходимости.
Подводя итог, можно сказать: для простых задач достаточно Поля календаря с выделением дат. Для серьезных интерфейсов управления временем идеальным выбором станет Планировщик. А если важна максимальная визуальная эстетика — смотрите в сторону HTML-полей.