При разработке интерфейсов на обычных формах (например, в УПП или старых редакциях УТ) программисты часто сталкиваются с тем, что стандартное поле с типом Дата в таблице или дереве значений ведет себя «капризно». Вместо привычного календаря при двойном клике ячейка либо просто выделяется синим, либо переходит в режим текстового редактирования, заставляя пользователя вводить цифры вручную или искать «шаманские» способы вызвать кнопку выбора. Рассмотрим подробно, как настроить систему так, чтобы календарь открывался предсказуемо и удобно.
Прежде чем приступать к написанию кода, проанализируем настройки свойств колонки в конфигураторе. В 1С (особенно в обычных формах) поведение ячейки напрямую зависит от комбинации свойств элемента управления. Если кнопка календаря (пиктограмма с тремя точками или календариком) не появляется, проверьте следующие параметры:
ДереваЗначений или ТаблицыЗначений строго задан тип Дата. Если тип составной или Произвольный, платформа не знает, какой редактор вызвать по умолчанию.Рассмотрим ситуацию, когда разработчики пытаются использовать событие ПриАктивизацииСтроки или ПриАктивизацииЯчейки. Как справедливо отмечено в обсуждении, это плохая практика для вызова модальных окон (календаря). Эти события срабатывают при любом «тыке» мышкой или перемещении курсора клавиатурой. Если сразу открывать календарь, пользователь не сможет просто перемещаться по таблице — его постоянно будет прерывать всплывающее окно.
Для реализации открытия по двойному клику в табличных полях предназначено специальное событие — Выбор (Choice).
Проанализируем алгоритм работы в обработчике события Выбор. Это событие срабатывает именно тогда, когда пользователь дважды кликает по ячейке или нажимает клавишу Enter. Это идеальный момент для программного вызова календаря.
Рассмотрим пример кода для обычных форм:
Процедура ТабличноеПолеВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
// Проверяем, что клик был именно по нашей колонке с датой
Если Колонка.Имя = "ДатаИсполнения" Тогда
// Отключаем стандартное поведение платформы, чтобы не было конфликтов
СтандартнаяОбработка = Ложь;
// Подготавливаем переменную для ввода
ТекущаяДатаЗначение = ВыбраннаяСтрока.ДатаИсполнения;
// Вызываем стандартное диалоговое окно ввода даты
Если ВвестиДату(ТекущаяДатаЗначение, "Выберите дату выполнения", ЧастиДаты.Дата) Тогда
// Если пользователь нажал ОК, записываем значение обратно в строку
ВыбраннаяСтрока.ДатаИсполнения = ТекущаяДатаЗначение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В данном примере мы используем метод ВвестиДату. Он открывает стандартный календарь. Обратите внимание на параметр СтандартнаяОбработка = Ложь — это критически важный момент, который сообщает системе, что мы берем управление на себя и не нужно запускать встроенные механизмы редактирования ячейки.
Существует еще один изящный способ заставить ячейку вести себя так, будто пользователь нажал на маленькую кнопку выбора (с тремя точками). Рассмотрим метод ВыполнитьВыбор(). Этот метод программно имитирует нажатие кнопки выбора в текущей ячейке.
Это бывает полезно, если вы хотите оставить стандартный механизм выбора (со всеми его настройками), но просто инициировать его двойным кликом. В этом случае код будет выглядеть так:
Процедура ТабличноеПолеВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
Если Колонка.Имя = "ДатаИ" Тогда
СтандартнаяОбработка = Ложь;
// Элемент в данном контексте — это само ТабличноеПоле (контрол на форме)
Элемент.ВыполнитьВыбор();
КонецЕсли;
КонецПроцедуры
Этот подход хорош тем, что он вызывает событие НачалоВыбора, где уже могут быть прописаны дополнительные проверки или специфическая логика открытия формы.
Если вы работаете с ДеревомЗначений, помните, что событие Выбор назначается не отдельной колонке, а всему элементу управления ТабличноеПоле, которое отображает это дерево. Выясним причину, по которой иногда событие кажется «недоступным»: часто разработчики ищут его в свойствах конкретной колонки в конфигураторе, в то время как нужно открыть свойства самого объекта дерева на форме и перейти на закладку «События».
Также проверьте свойство РедактированиеПриВходе (EditOnEnter). Если оно включено, то первый же клик переводит ячейку в режим правки текста, что может «поглощать» второй клик. Для реализации четкого двойного клика иногда лучше установить это свойство в значение Ложь.
Чтобы настроить корректное открытие календаря:
Дата.СтандартнаяОбработка = Ложь, чтобы избежать дублирования действий или странного поведения интерфейса.ВвестиДату, а для имитации нажатия кнопки выбора — ВыполнитьВыбор().Применяя эти шаги, вы создадите профессиональный и удобный интерфейс, который будет интуитивно понятен пользователям и избавит их от необходимости совершать лишние клики для выполнения простых операций.