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



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

Возможно, о данном "приеме" известно многим, хотя сам случайно увидел его у коллеги при том, что уже 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 не будет опубликован. Обязательные поля помечены *