Организация выбора месяца из списка (универсально + НЕ модально )

Пришлось столкнуться с такой проблемой, как выбор месяца из ниспадающего списка (с элементами вида «НазваниеМесяца Год») с возможностью изменения года. Хочу предложить универсальный вариант реализации данного механизма на основе механизма http://infostart.ru/public/167549/
ЗЫ: основные отличия:
— вместо «НачалоВыбораИзСписка» работаем с «ОбработкаВыбора» без модальности
— Обратное преобразование в дату не только на русском
— Универсальность процедур. Одна функция выбирается в нескольких полях.

В обработке у нас  реквизит формы (УФ) «Дата1» с типом «Строка» (установлено «РежимВыбораИзСписка»), куда и будет вписываться название месяца и год, и реквизит обработки с таким же именем, но с типом «Дата», где собствено и будет храниться дата для использования…

При открытии формы необходимо сформировать список выбора (по умолчанию, на текущий год) и запольнить реквизит текущим месяцем:

&НаКлиенте
Процедура ПриОткрытии(Отказ)

СформироватьСписокВыбораМесяца(Год(ТекущаяДата()),"Дата1");
СформироватьСписокВыбораМесяца(Год(ТекущаяДата()),"Дата2");

Объект.Дата1     = НачалоМесяца(ТекущаяДата());
Объект.Дата2     = ДобавитьМесяц(Объект.Дата1,1);

Дата1           = СтрЗаменить(Формат(Объект.Дата1, "ДФ = ММММ_гггг"), "_", " ");
Дата2           = СтрЗаменить(Формат(Объект.Дата2, "ДФ = ММММ_гггг"), "_", " ");

КонецПроцедуры

Собственно процедура «СформироватьСписокВыбораМесяца»:

&НаКлиенте
Процедура СформироватьСписокВыбораМесяца(Год, Элемент)

Элементы[Элемент].СписокВыбора.Очистить();
Элементы[Элемент].СписокВыбора.Добавить(Формат(Год-1, "ЧГ=0")); //для смены года -

Для М = 1 По 12  Цикл
Элементы[Элемент].СписокВыбора.Добавить(СтрЗаменить(Формат(Дата(Год, М, 1), "ДФ = ММММ_гггг"), "_", " "));
КонецЦикла;

Элементы[Элемент].СписокВыбора.Добавить(Формат(Год+1, "ЧГ=0")); //для смены года +

КонецПроцедуры

Ну и собственно сама процедура выбора (процедура универсальная, подключать можно к нескольким реквизитам):

&НаКлиенте
Процедура МесяцОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

Если ВыбранноеЗначение <>  "" Тогда

Если СтрДлина(ВыбранноеЗначение) = 4 Тогда

ВыбрГод = Число(ВыбранноеЗначение);
СформироватьСписокВыбораМесяца(ВыбрГод, Элемент.Имя);

ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Элемент_Имя", Элемент.Имя);

Оповещение = Новый ОписаниеОповещения("Обработчик_ВыборГода", ЭтаФорма, ДополнительныеПараметры);
ЭтаФорма.ПоказатьВыборИзСписка(Оповещение, Элемент.СписокВыбора, Элемент);

Иначе

ЭтаФорма[Элемент.Имя] = ВыбранноеЗначение;
НомМесяца = Элемент.СписокВыбора.Индекс(Элемент.СписокВыбора.НайтиПоЗначению(ВыбранноеЗначение));
ВыбрГод = Число(Прав(ВыбранноеЗначение, 4));
Объект[Элемент.Имя] = Дата(ВыбрГод, НомМесяца, 1);

КонецЕсли;

Иначе

Объект[Элемент.Имя] = Неопределено;

КонецЕсли;

КонецПроцедуры

Для ухода от модальности вызываем процедуру «Обработчик_ВыборГода»:

&НаКлиенте
Процедура Обработчик_ВыборГода(Результат, ДополнительныеПараметры) Экспорт

Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;

ВыбранноеЗначение = Результат.Значение;
Элемент_Имя = ДополнительныеПараметры.Элемент_Имя;;
Элемент_Поле = Элементы[Элемент_Имя];

Если ВыбранноеЗначение <>  "" Тогда

Если СтрДлина(ВыбранноеЗначение) = 4 Тогда

ВыбрГод = Число(ВыбранноеЗначение);
СформироватьСписокВыбораМесяца(ВыбрГод, Элемент_Имя);

Оповещение = Новый ОписаниеОповещения("Обработчик_ВыборГода", ЭтаФорма, ДополнительныеПараметры);
ЭтаФорма.ПоказатьВыборИзСписка(Оповещение, Элемент_Поле.СписокВыбора, Элемент_Поле);

Иначе

ЭтаФорма[Элемент_Имя] = ВыбранноеЗначение;
НомМесяца = Элемент_Поле.СписокВыбора.Индекс(Элемент_Поле.СписокВыбора.НайтиПоЗначению(ВыбранноеЗначение));
ВыбрГод = Число(Прав(ВыбранноеЗначение, 4));
Объект[Элемент_Имя] = Дата(ВыбрГод, НомМесяца, 1);

КонецЕсли;

Иначе

Объект[Элемент_Имя] = Неопределено;

КонецЕсли;

КонецПроцедуры

4 Comments

  1. trntv

    Для универсальности рекомендую переписать и отказаться от ВыбратьИзСписка в пользу ПоказатьВыборИзСписка, так как в современных конфигурациях идет отказ от модальности.

    Reply
  2. igorkosmos

    (1) hashpnd, Большое человеческое сп =) Изучил вопрос, переписал под новые веяния =)

    Reply
  3. agent00mouse

    Хо — хо, Камрад, Сам запилил, аналог. по этому же источнику в основе. Только с привязкой к конкретному элементу.

    Reply
  4. agent00mouse

    Отучим от пустых значений

      Если СтрДлина(ВыбранноеЗначение) = 4 Тогда
    
    ВыбрГод = Число(ВыбранноеЗначение);
    СформироватьСписокВыбораМесяца(ВыбрГод, Элемент.Имя);
    //Добавлено
    ЭтаФорма[Элемент.Имя] = Элементы[Элемент.Имя].СписокВыбора[1].Значение;
    Объект[Элемент.Имя] = НачалоМесяца(Дата(ВыбрГод, 1, 1));

    и далее

      Если СтрДлина(ВыбранноеЗначение) = 4 Тогда
    
    ВыбрГод     = Число(ВыбранноеЗначение);
    СформироватьСписокВыбораМесяца(ВыбрГод, Элемент_Имя);
    //Добавлено
    ЭтаФорма[Элемент_Имя] = Элементы[Элемент_Имя].СписокВыбора[1].Значение;
    Объект[Элемент_Имя]  = НачалоМесяца(Дата(ВыбрГод, 1, 1));
    Reply

Leave a Comment

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