Итак, мы имеем некий объект с реквизитом «Месяц» с типом «Строка», который находится у нас на управляемой форме, куда и будет вписываться название месяца и год. Прежде всего, при открытии формы необходимо сформировать список выбора (например, на текущий год):
&НаКлиенте Процедура ПриОткрытии(Отказ) СформироватьСписокВыбораМесяца(Год(ТекущаяДата())); КонецПроцедуры
Сама процедура формирования будет следующей:
Процедура СформироватьСписокВыбораМесяца(Год) Элементы.Месяц.СписокВыбора.Очистить(); Элементы.Месяц.СписокВыбора.Добавить(Формат(Год-1, "ЧГ=0")); //для смены года Для к = 1 По 12 Цикл СформДата = Дата(Год, к, 1); Наим = Формат(СформДата, "ДФ = ММММ_гггг"); Наим = СтрЗаменить(Наим, "_", " "); Элементы.Месяц.СписокВыбора.Добавить(Наим); КонецЦикла; Элементы.Месяц.СписокВыбора.Добавить(Формат(Год+1, "ЧГ=0")); //для смены года КонецПроцедуры
Далее организуем выбор из списка. Для этого нам понадобится событие нашего элемента «НачалоВыбораИзСписка»:
&НаКлиенте Процедура МесяцНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка) Если Объект.Месяц "" Тогда //реквизит уже заполнен, нужно формировать список для года, соответствующего заполнению ВыбрГод = Число(Прав(Объект.Месяц, 4)); СформироватьСписокВыбораМесяца(ВыбрГод); КонецЕсли; СтандартнаяОбработка = Ложь; ВыбранноеЗначение = Строка(ЭтаФорма.ВыбратьИзСписка(Элемент.СписокВыбора, Элемент)); Если ВыбранноеЗначение "" Тогда Если СтрДлина(ВыбранноеЗначение)=4 Тогда //выбрано значение, которое соответствует смене года в списке Пока СтрДлина(ВыбранноеЗначение) = 4 Цикл //цикл продолжается до тех пор, пока мы не выберем месяц ВыбрГод = Число(ВыбранноеЗначение); СформироватьСписокВыбораМесяца(ВыбрГод); ВыбранноеЗначение = Строка(ЭтаФорма.ВыбратьИзСписка(Элемент.СписокВыбора, Элемент)); КонецЦикла; КонецЕсли; Если ВыбранноеЗначение "" Тогда //выбрали месяц, а не пустое значение, запишем его //если выбрали пустое значение, то в реквизите месяц сохранится значение, которое было до выбора Объект.Месяц = ВыбранноеЗначение; КонецЕсли; КонецЕсли; КонецПроцедуры
Далее можно делать с этим значением, что угодно. Например, нам нужно в некий реквизит подставить конец выбранного месяца. Тогда мы имеем реквизит объекта «КонецМесяца» с типом дата, создаем реквизит формы «Месяц» с типом строка и помещаем связанный с ним элемент на форму. Далее реализуем вышеописанный механизм с некоторыми изменениями:
&НаКлиенте Процедура ПриОткрытии(Отказ) Если ЗначениеЗаполнено(Объект.КонецМесяца) Тогда Месяц = Формат(Объект.КонецМесяца, "ДФ = ММММ"); //формируем список на год, соответствующий заполненному реквизиту СформироватьСписокВыбораМесяца(Год(Объект.КонецМесяца)); Иначе Месяц = ""; //формируем список на текущий год СформироватьСписокВыбораМесяца(Год(ТекущаяДата())); КонецЕсли; КонецПроцедуры
Событие «НачалоВыбораИзСписка» изменяем так, чтобы заполнялся реквизит «КонецМесяца». Помним, что «Месяц» — реквизит формы, а не объекта, поэтому убираем перед ним «Объект.» и заполняем реквизит «КонецМесяца»:
&НаКлиенте Процедура МесяцНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка) Если Месяц "" Тогда //реквизит уже заполнен, нужно формировать список для года, соответствующего заполнению ВыбрГод = Число(Прав(Месяц, 4)); СформироватьСписокВыбораМесяца(ВыбрГод); КонецЕсли; СтандартнаяОбработка = Ложь; ВыбранноеЗначение = Строка(ЭтаФорма.ВыбратьИзСписка(Элемент.СписокВыбора, Элемент)); Если ВыбранноеЗначение "" Тогда Если СтрДлина(ВыбранноеЗначение)=4 Тогда //выбрано значение, которое соответствует смене года в списке Пока СтрДлина(ВыбранноеЗначение) = 4 Цикл //цикл продолжается до тех пор, пока мы не выберем месяц ВыбрГод = Число(ВыбранноеЗначение); СформироватьСписокВыбораМесяца(ВыбрГод); ВыбранноеЗначение = Строка(ЭтаФорма.ВыбратьИзСписка(Элемент.СписокВыбора, Элемент)); КонецЦикла; КонецЕсли; Если ВыбранноеЗначение "" Тогда //выбрали месяц, а не пустое значение, запишем его //если выбрали пустое значение, то в реквизите месяц сохранится значение, которое было до выбора Месяц = ВыбранноеЗначение; НомМесяца = (Найти("янвфевмарапрмайиюниюлавгсеноктноядек",Нрег(Лев(ВыбранноеЗначение,3)))+2)/3; //получаем номер месяца ВыбрГод = Число(Прав(ВыбранноеЗначение, 4)); Объект.КонецМесяца = КонецМесяца(Дата(ВыбрГод, НомМесяца, 1)); КонецЕсли; КонецЕсли; КонецПроцедуры
Собственно вот и все) Вы также можете скачать обработку с примером: //infostart.ru/public/download.php?file=167551
Спасибо, удобная штука…
(1) vipq7, рад, что пригодилось)
Очень выручили. Огромное спасибо !!!
(3) alexandr851c, честно говоря, когда публиковал, не думал, что многих заинтересует)) На здоровье)
Спасибо. Идея с переходом между годами мне понравилась. Реализовал у себя с адаптированием под обычное приложение.
Единственное замечание в том, что обычно за период принимают не конец месяца, а начало.
(5) karapuzzzz, пожалуйста) ну как у вас не знаю, сколько ни делал доработок отчетов — везде нужен был именно конец месяца в качестве конца периода
Спасибо! Респект. Очень пригодилось!
(7) nytlenc, рад, что пригодилось! Успехов вам)
А при нажатии на строчку с годом ничего не должно происходить?
Я думал откроются месяца с предыдущим годом.
Спасибо за пример, очень помог.
(9) Orlanxxx, происходит, если сделать все правильно.
Я в условиях сначала поставил равенство (=) и у меня тоже ничего не происходило при выборе года.
Изменил на (<>) и все в порядке стало.
Если выбрать год, потом еще раз год
то вылетает с ошибкой
надо в рекурсию заворачивать
однозначно плюс
Чуток подкорректировал процедуры.
Месяц — строка, реквизит формы
ПериодРегистрации — Дата, реквизит объекта
Показать
УТ11.3 не работает что-то! ((
Я думаю, что так еще проще
Показать
Пропущен, знак..