При разработке мобильных решений на платформе 1С:Предприятие 8.3 многие разработчики сталкиваются с ситуацией, когда стандартный выбор даты в мобильном клиенте или мобильном приложении открывается в виде системного барабанного переключателя (колес прокрутки с днем, месяцем и годом). При этом в самом окне выбора день недели отсутствует, что вынуждает пользователей ориентироваться наугад или сверяться со сторонними приложениями календаря. Разберем причины такого поведения платформы и рассмотрим рабочие способы вывода дней недели.
Выясним причину такого ограничения. При активации поля ввода даты на мобильном устройстве платформа 1С не формирует собственный графический интерфейс выбора, а вызывает нативный системный диалог операционной системы Android или iOS. Состав барабанов (день, месяц, год) жестко зашит в системном компоненте мобильной ОС.
Задание формата в свойствах реквизита или элемента формы (например, установка строки формата ДФ='дд.ММ.гггг (ддд)' в свойствах Формат или ФорматРедактирования) влияет исключительно на текстовое представление уже выбранной даты непосредственно в поле на форме. На структуру самого системного выпадающего барабана эти настройки влияния не оказывают.
Рассмотрим самый простой и наименее трудозатратный способ. Если пользователю достаточно сразу после выбора даты видеть, на какой день недели она пришлась, можно разместить рядом со штатным полем даты элемент вида Поле надписи и обновлять его программно.
Разберем по шагам реализацию данного варианта:
ДеньНеделиСтрокой (тип Строка) или разместим декорацию/поле надписи НадписьДеньНедели рядом с полем даты в одной горизонтальной группе.ПриИзменении поля даты добавим вычисление строкового представления дня недели.Посмотрим на пример клиентского кода:
&НаКлиенте
Процедура ДатаДокументаПриИзменении(Элемент)
ОбновитьОтображениеДняНедели();
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьОтображениеДняНедели()
Если ЗначениеЗаполнено(Объект.Дата) Тогда
// Формируем сокращенное наименование дня недели: Пн, Вт, Ср и т.д.
Элементы.НадписьДеньНедели.Заголовок = Формат(Объект.Дата, "ДФ=ддд");
Иначе
Элементы.НадписьДеньНедели.Заголовок = "";
КонецЕсли;
КонецПроцедуры
Если для бизнес-процесса критически важно видеть полноценную сетку месяца с днями недели еще до момента фиксации даты, создадим собственную общую форму выбора.
Проанализируем структуру решения:
ФормаВыбораДаты) и размещаем на ней элемент Поле табличного документа.Дата.Выбор табличного документа перехватываем значение расшифровки и закрываем форму с возвратом выбранного значения.Посмотрим на пример обработки выбора даты из таблицы:
&НаКлиенте
Процедура ПолеКалендаряВыбор(Элемент, Область, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ТипЗнч(Область.Расшифровка) = Тип("Дата") Тогда
Закрыть(Область.Расшифровка);
КонецЕсли;
КонецПроцедуры
На основной форме у поля ввода даты настраиваем кнопку выбора или гиперссылку, открывающую созданную форму календаря в модальном или блокирующем режиме с обработкой оповещения о закрытии.
Рассмотрим вариант реализации интерактивного календаря с помощью веб-технологий. Данный подход позволяет получить современный и отзывчивый интерфейс выбора.
ПолеHTMLДокумента.Когда требуется сохранить именно барабанный тип выбора (колеса прокрутки), но добавить четвертую колонку с днем недели, стандартных средств платформы 1С недостаточно. В таком случае разрабатывается мобильная внешняя компонента на Java/Kotlin (для Android) или Swift/Objective-C (для iOS).
Компонента вызывает кастомный нативный диалог операционной системы, содержащий синхронизированные барабаны даты и дня недели, после чего возвращает выбранную дату обратно в клиентский код 1С.