При разработке интерфейсов в «1С:Предприятие» часто возникает задача выбора периода, ограниченного одним месяцем. Казалось бы, задача тривиальная, но стандартный календарь платформы не всегда удобен для быстрого переключения между месяцами, а самописные решения часто оказываются перегруженными, «глючными» и медленными. Разберем, как реализовать этот функционал максимально эффективно, используя лучшие практики из типовых конфигураций и Библиотеки стандартных подсистем (БСП).
Проанализируем наиболее стабильный и современный вариант. В составе БСП (Библиотека стандартных подсистем) существует общая форма ВыборПериода. Если ваша конфигурация построена на базе БСП (как большинство современных решений: ERP, КА, БП 3.0, ЗУП 3.1), это решение будет самым удачным.
Рассмотрим преимущества этого подхода:
Для программного вызова такой формы мы можем использовать следующий подход:
Оповещение = Новый ОписаниеОповещения("ВыборПериодаЗавершение", ЭтотОбъект);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Период", ТекущийПериод);
ПараметрыФормы.Вставить("ВариантВыбора", "Месяц");
ОткрытьФорму("ОбщаяФорма.ВыборПериода", ПараметрыФормы, ЭтотОбъект, , , , Оповещение);
Выясним, почему опытные разработчики советуют заглянуть в ЗУП (Зарплата и управление персоналом). В этой конфигурации выбор месяца — ключевая операция. Чаще всего там используется поле ввода с кнопкой выбора, при нажатии на которую открывается лаконичное окно с сеткой месяцев на текущий год.
Если нам нужно реализовать нечто подобное в собственной обработке, проанализируем механику ОСВ (Оборотно-сальдовой ведомости) в Бухгалтерии предприятия. Там используется поле с типом СтандартныйПериод. Рассмотрим, как настроить его для работы именно с месяцами:
СтандартныйПериод.Посмотрим на ситуацию со стороны производительности. Если форма автора «тормозит», возможно, проблема в избыточной графике. Самый быстрый вариант — использование обычного Поля выбора, заполненного списком значений.
Разберем по шагам, как это реализовать:
Дата.Пример кода для заполнения списка месяцев текущего года:
&НаСервере
Процедура ЗаполнитьСписокМесяцев()
ТекущийГод = Год(ТекущаяДата());
Для Ном = 1 По 12 Цикл
НачалоМесяца = Дата(ТекущийГод, Ном, 1);
Элементы.МесяцВыбора.СписокВыбора.Добавить(НачалоМесяца, Формат(НачалоМесяца, "ДФ='MMMM yyyy'"));
КонецЦикла;
КонецПроцедуры
Важный момент: использование такого подхода исключает открытие дополнительных окон и сложные серверные вызовы при отрисовке, что решает проблему «глючности» интерфейса.
Проанализируем причины, по которым интерфейс выбора периода может работать медленно. Часто разработчики допускают следующие ошибки:
ПриИзменении месяца стоит немедленное обновление огромного динамического списка или расчет итогов, интерфейс будет «подвисать». Используйте ПодключитьОбработчикОжидания, чтобы дать пользователю возможность выбрать месяц, и только через небольшую паузу (например, 0.5 - 1 сек) запускать тяжелые расчеты.Для максимально удобного UX (пользовательского опыта) можно создать небольшую вспомогательную форму-сетку 3х4. Разберем этот вариант подробнее:
Мы создаем форму, на которой размещаем 12 кнопок. Каждая кнопка соответствует месяцу. Сверху добавляем поле выбора года. При нажатии на кнопку мы просто передаем выбранную дату (начало месяца) обратно в основную форму. Чтобы такая форма не выглядела громоздкой, ее следует открывать в режиме БлокироватьВесьИнтерфейс или как выпадающее окно, привязанное к элементу основной формы.
Такой подход позволяет пользователю видеть весь контекст года целиком, что гораздо удобнее, чем пролистывание стандартного календаря.
Подводя итог, можно сказать: если вам нужно быстрое и надежное решение — используйте стандартную форму БСП или платформенный объект СтандартныйПериод. Если же требуется специфический дизайн в один клик — реализуйте фиксированную сетку кнопок или список выбора, предварительно оптимизировав серверные вызовы.