ЗЫ: основные отличия:
— вместо «НачалоВыбораИзСписка» работаем с «ОбработкаВыбора» без модальности
— Обратное преобразование в дату не только на русском
— Универсальность процедур. Одна функция выбирается в нескольких полях.
В обработке у нас реквизит формы (УФ) «Дата1» с типом «Строка» (установлено «РежимВыбораИзСписка»), куда и будет вписываться название месяца и год, и реквизит обработки с таким же именем, но с типом «Дата», где собствено и будет храниться дата для использования…
При открытии формы необходимо сформировать список выбора (по умолчанию, на текущий год) и запольнить реквизит текущим месяцем:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
СформироватьСписокВыбораМесяца(Год(ТекущаяДата()),"Дата1");
СформироватьСписокВыбораМесяца(Год(ТекущаяДата()),"Дата2");
Объект.Дата1 = НачалоМесяца(ТекущаяДата());
Объект.Дата2 = ДобавитьМесяц(Объект.Дата1,1);
Дата1 = СтрЗаменить(Формат(Объект.Дата1, "ДФ = ММММ_гггг"), "_", " ");
Дата2 = СтрЗаменить(Формат(Объект.Дата2, "ДФ = ММММ_гггг"), "_", " ");
КонецПроцедуры
Собственно процедура «СформироватьСписокВыбораМесяца»:
&НаКлиенте
Процедура СформироватьСписокВыбораМесяца(Год, Элемент)
Элементы[Элемент].СписокВыбора.Очистить();
Элементы[Элемент].СписокВыбора.Добавить(Формат(Год-1, "ЧГ=0")); //для смены года -
Для М = 1 По 12 Цикл
Элементы[Элемент].СписокВыбора.Добавить(СтрЗаменить(Формат(Дата(Год, М, 1), "ДФ = ММММ_гггг"), "_", " "));
КонецЦикла;
Элементы[Элемент].СписокВыбора.Добавить(Формат(Год+1, "ЧГ=0")); //для смены года +
КонецПроцедуры
Ну и собственно сама процедура выбора (процедура универсальная, подключать можно к нескольким реквизитам):
&НаКлиенте
Процедура МесяцОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ВыбранноеЗначение <> "" Тогда
Если СтрДлина(ВыбранноеЗначение) = 4 Тогда
ВыбрГод = Число(ВыбранноеЗначение);
СформироватьСписокВыбораМесяца(ВыбрГод, Элемент.Имя);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Элемент_Имя", Элемент.Имя);
Оповещение = Новый ОписаниеОповещения("Обработчик_ВыборГода", ЭтаФорма, ДополнительныеПараметры);
ЭтаФорма.ПоказатьВыборИзСписка(Оповещение, Элемент.СписокВыбора, Элемент);
Иначе
ЭтаФорма[Элемент.Имя] = ВыбранноеЗначение;
НомМесяца = Элемент.СписокВыбора.Индекс(Элемент.СписокВыбора.НайтиПоЗначению(ВыбранноеЗначение));
ВыбрГод = Число(Прав(ВыбранноеЗначение, 4));
Объект[Элемент.Имя] = Дата(ВыбрГод, НомМесяца, 1);
КонецЕсли;
Иначе
Объект[Элемент.Имя] = Неопределено;
КонецЕсли;
КонецПроцедуры
Для ухода от модальности вызываем процедуру «Обработчик_ВыборГода»:
&НаКлиенте
Процедура Обработчик_ВыборГода(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
ВыбранноеЗначение = Результат.Значение;
Элемент_Имя = ДополнительныеПараметры.Элемент_Имя;;
Элемент_Поле = Элементы[Элемент_Имя];
Если ВыбранноеЗначение <> "" Тогда
Если СтрДлина(ВыбранноеЗначение) = 4 Тогда
ВыбрГод = Число(ВыбранноеЗначение);
СформироватьСписокВыбораМесяца(ВыбрГод, Элемент_Имя);
Оповещение = Новый ОписаниеОповещения("Обработчик_ВыборГода", ЭтаФорма, ДополнительныеПараметры);
ЭтаФорма.ПоказатьВыборИзСписка(Оповещение, Элемент_Поле.СписокВыбора, Элемент_Поле);
Иначе
ЭтаФорма[Элемент_Имя] = ВыбранноеЗначение;
НомМесяца = Элемент_Поле.СписокВыбора.Индекс(Элемент_Поле.СписокВыбора.НайтиПоЗначению(ВыбранноеЗначение));
ВыбрГод = Число(Прав(ВыбранноеЗначение, 4));
Объект[Элемент_Имя] = Дата(ВыбрГод, НомМесяца, 1);
КонецЕсли;
Иначе
Объект[Элемент_Имя] = Неопределено;
КонецЕсли;
КонецПроцедуры
Для универсальности рекомендую переписать и отказаться от ВыбратьИзСписка в пользу ПоказатьВыборИзСписка, так как в современных конфигурациях идет отказ от модальности.
(1) hashpnd, Большое человеческое сп =) Изучил вопрос, переписал под новые веяния =)
Хо — хо, Камрад, Сам запилил, аналог. по этому же источнику в основе. Только с привязкой к конкретному элементу.
Отучим от пустых значений
и далее