Итак, мы имеем некий объект с реквизитом "Месяц" с типом "Строка", который находится у нас на управляемой форме, куда и будет вписываться название месяца и год. Прежде всего, при открытии формы необходимо сформировать список выбора (например, на текущий год):
&НаКлиенте Процедура ПриОткрытии(Отказ) СформироватьСписокВыбораМесяца(Год(ТекущаяДата())); КонецПроцедуры
Сама процедура формирования будет следующей:
Процедура СформироватьСписокВыбораМесяца(Год) Элементы.Месяц.СписокВыбора.Очистить(); Элементы.Месяц.СписокВыбора.Добавить(Формат(Год-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