gifts2017

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

Опубликовал Igor KOStenko (igorkosmos) в раздел Программирование - Работа с интерфейсом

Пришлось столкнуться с такой проблемой, как выбор месяца из ниспадающего списка (с элементами вида "НазваниеМесяца Год") с возможностью изменения года. Хочу предложить универсальный вариант реализации данного механизма на основе механизма 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);
			
		КонецЕсли;
		
	Иначе 
		
		Объект[Элемент_Имя] = Неопределено;
		
	КонецЕсли;
	
КонецПроцедуры

Скачать файлы

Наименование Файл Версия Размер
Выбора месяца из списка
.epf 6,69Kb
15.11.16
0
.epf 1.0 6,69Kb Скачать
ВыборМесяца_1.1(БезМодальности)
.epf 6,80Kb
15.11.16
0
.epf 1.1 6,80Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Evgeniy T. (hashpnd) 14.11.16 13:27
Для универсальности рекомендую переписать и отказаться от ВыбратьИзСписка в пользу ПоказатьВыборИзСписка, так как в современных конфигурациях идет отказ от модальности.
igorkosmos; +1 Ответить 1
2. Igor KOStenko (igorkosmos) 15.11.16 10:59
(1) hashpnd, Большое человеческое сп =) Изучил вопрос, переписал под новые веяния =)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа