Раздельный вывод частей даты на форму без программирования



Небольшой лайфхак для повышения удобства редактирования пользователем полей с типом «Дата».

Возможно, о данном "приеме" известно многим, хотя сам случайно увидел его у коллеги при том, что уже 7 лет работаю 1С-программистом.

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

Самым очевидным и простым решением проблемы, как лично я считал до недавнего времени, является создание отдельных реквизитов формы для каждого реквизита объекта с типом "Дата" с форматами редактирования под необходимую часть даты. То есть при наличии у документа стандартного реквизита "Дата" на форме объекта можно создать реквизиты формы "ДатаДата" и "ДатаВремя", например, с форматами дат "dd.mm.yyyy" и "HH:mm" соответственно, причем у времени убрать кнопку выбора и добавить кнопку регулировки. Но при таком варианте помимо создания реквизитов форм под каждую нужную дату объекта необходимо ещё в модуле формы описать заполнение реквизитов формы при создании формы на сервере и заполнение реквизита объекта при изменении каждого элемента-части даты.

Как оказалось, проще всего вспомнить тот факт, что элемент формы отображает данные, указанные в свойстве "ПутьКДанным", но эта связь может иметь вид "Один ко многим" — одни и те же данные могут отображаться несколькими угодно элементами формы! Поэтому для решения задачи отдельного отображения и редактирования даты и времени достаточно создать два элемента формы, которые будут ссылаться на одну и ту же дату, установить для них различные форматы редактирования, а также установить свойства "КнопкаВыбора" в "Нет" и "КнопкаРегулирования" в "Да" для элементов отображения времени. Это даст возможность удобно для пользователя редактировать на форме дату и время раздельно без строчки кода для разработчика. Важно также, что необязательно разделять дату всего лишь на две части — можно, к примеру, выводить отдельно часы и минуты друг от друга и так далее.

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

Icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY

20 Comments

  1. acanta

    Супер. Давно такую искала. Спасибо.

    Reply
  2. drmaxart

    (1)Спасибо, приятно слышать!

    Reply
  3. ltfriend

    Это самый очевидный и простой способ, а не создавать лишние реквизиты. Применимо и к обычным формам.

    Reply
  4. motorsoft

    Отлично, взял на заметку

    Reply
  5. rozer

    норм 1слайфхак )

    Reply
  6. MCV

    Да, супер!

    Reply
  7. drmaxart

    (3) согласен! По этой причине я и уточнил, что именно лично я считал так до осознания описанного варианта

    Reply
  8. acanta

    Вопрос: как должен выглядеть обработчик, чтобы при регулировании минут минуты были кратны, например 10?

    Reply
  9. drmaxart

    (8)Нужно реализовать обработчик события Регулирования у поля минут, в нём параметр Направление позволяет определить, какая из кнопок регулирования была нажата. При нажатии на увеличение (вверх) параметр равен 1, при нажатии на уменьшение (вниз) — равен -1. То есть ставим СтандартнаяОбработка в ЛОЖЬ и пишем Дата = Дата + 600 * Направление

    Reply
  10. kolosof

    Спасибо!)

    Reply
  11. kembrik

    Способ кстати прекрасно работает и на обычных формах, именно там я его и подсмотрел у предшественника, отлично мигрировал в управляемые. От кнопок выбора даты и переметки времени совсем отказались в итоге, данный функционал используется при таксировке путевых листов, там операторы обрабатывали путевые с клавиатуры с дикой скоростью, лишние контролы и мышка только замедляли процесс. Мы еще цветом подсвечиваем и шрифтами выделяем, совсем глазасто получается

    Reply
  12. dock
    Как оказалось, проще всего вспомнить тот факт, что элемент формы отображает данные, указанные в свойстве «ПутьКДанным», но эта связь может иметь вид «Один ко многим» — одни и те же данные могут отображаться несколькими угодно элементами формы!

    Если такие вещи приходят «сам случайно увидел его у коллеги «, то как же у нас всё плохо с обучением…

    Или в 1С-ники приходят совсем не программисты…

    З.Ы. автору благодарность за наставление юных подаванов на пусть истины 😉

    Reply
  13. drmaxart

    (12)Ну за чем так критично — этот факт все знают, просто лично я вот просто не задумывался о таком варианте применения, в голову не приходило. Бывает)

    Reply
  14. dock

    (13) 🙂 вот в этом и есть отличие в образовании. Я открыл статью, думал реально «что-то»… Посмотрел свой код, вспомнил как писал: у меня просто даже мысли не было, что можно сделать как-то по другому 🙂 Скорее были тесты на правильное поведение системы.

    Лирика:

    Когда ты ещё студент, очень многие принципы/методы/подходы просто закладываются чуть ли не на уровень подсознания.

    Закладывается базис, который в дальнейшем вырабатывается в стиль — почерк. Одно дело, когда ты в 20 лет на курсе по базам данных выполняешь лабораторные работы по приведению БД к 6-й нормальной форме и к окончанию курса ты просто не можешь сделать базу менее чем в 3-й НФ (что и обещал преподаватель)… И совсем другое дело, когда ты в 30 лет узнаешь вообще о том, что БД оказывается-то реляционная…

    С опытом только по коду начинаешь определять, из какой сферы пришёл человек в программисты 1С.

    Reply
  15. Danilov

    Отлично, взял на заметку

    Reply
  16. suepifanov

    дополнительно к этому можно сделать список быстрого выбора времени как, например, сделано в УНФ.

    Кнопка выпадающего списка = да, и ПриСозданииНаСервере заполнить список нужными интервалами.

    // Процедура заполняет список выбора времени.
    // Параметры:
    //  ПолеВводаФормы  — элемент-владелец списка,
    //  Интервал        — интервал, с которым необходимо заполнить список, по умолчанию час.
    Процедура ЗаполнитьСписокВыбораВремени(ПолеВводаФормы, Интервал = 3600, Начало = ‘00010101080000’, Окончание = ‘00010101200000’) Экспорт
    
    СписокВремен = ПолеВводаФормы.СписокВыбора;
    СписокВремен.Очистить();
    
    ВремяСписка = НачалоЧаса(Начало);
    
    Пока НачалоЧаса(ВремяСписка) <= НачалоЧаса(Окончание) Цикл
    
    Если НЕ ЗначениеЗаполнено(ВремяСписка) Тогда
    ПредставлениеВремени = «00:00″;
    Иначе
    ПредставлениеВремени = Формат(ВремяСписка,»ДФ=ЧЧ:мм»);
    КонецЕсли;
    
    СписокВремен.Добавить(ВремяСписка, ПредставлениеВремени);
    
    ВремяСписка = ВремяСписка + Интервал;
    
    КонецЦикла;
    
    КонецПроцедуры
    

    Показать

    Reply
  17. androgin

    я конечно извиняюсь, но это не лайфхак, а тупость, при чем всем известная еще стотыщ лет назад

    Reply
  18. drmaxart

    (17)ну не для всех. Я смотрю, у Вас ко всем публикациям есть претензии. На Инфостарте много статей о вещах, которые кто-то знает, а кто-то — нет. Им поможет, для такого обмена информацией ресурс и создан

    Reply
  19. ZOMI

    Автору пора уже готовить доклад для Infostart Event. Так лаконично разжевал такую сложную тему.

    Reply
  20. androgin

    (18) то есть по факту вам сказать нечего. поперлись копаться и искать к чему бы в ответ прицепиться?

    Это вас характеризует явно не в положительном ключе))))

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

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *