gifts2017

Реализация выбора месяца из выпадающего списка выбора на форме

Опубликовал Серёжка Шеянов (CepeLLlka) в раздел Программирование - Работа с интерфейсом

Рисовал отчёт за период - "Месяц", и решил сделать выборку из ниспадающего списка на форме.
Нагуглил решение на этом сайте, но оно было под УФ, и получение именно даты из поля выбора на форме реализовано было как-то не по мне, слишком много кода. Я так и не разобрался :)
Переделал по своему и выкладываю сюда вам, в надежде заработать немного поинтов :)
Не знаю, нужно в таком случае тут указывать ссылку или нет, но укажу.. http://infostart.ru/public/167549/

Чтобы сделать такой выпадающий список, нужно добавить реквизит с типом значения - "Дата"

Добавление реквизита

Но на форму не добавляйте его при помощи визарда, так как он добавит вам "Поле ввода", а просто сами вручную добавьте на форму элемент - "Поле выбора".

Добавление поля выбора

...и привяжите его к вашему реквизиту.

Привязка поля выбора к реквизиту

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

Добавление события в модуль формы

Итак, событие мы привязали к процедуре в модуле формы. Сам список формируется следующей процедурой:

Процедура СформироватьСписокВыбораМесяца(Знач Год)
	
	Год = Число(Год);
	СписокВыбора = ЭлементыФормы.Месяц.СписокВыбора;
    СписокВыбора.Очистить();
	//Формирование СЗ
	СписокВыбора.Добавить(Формат(Год-1, "ЧГ=0"), Формат(Год-1, "ЧГ=0"));
    Для М = 1 По 12 Цикл
        СформДата = Дата(Год, М, 1);
        Наим = Формат(СформДата, "ДФ='ММММ гггг""г.""'");
        СписокВыбора.Добавить(СформДата, Наим);    
    КонецЦикла;
    СписокВыбора.Добавить(Формат(Год+1, "ЧГ=0"), Формат(Год+1, "ЧГ=0"));
	
КонецПроцедуры

Формирование списка мы будем вызывать из процедуры "При открытии", чтобы список сразу был заполнен, и текущий месяц был уже выбран..

Процедура ПриОткрытии()

	СформироватьСписокВыбораМесяца(Год(ТекущаяДата()));
	Месяц = ЭлементыФормы.Месяц.СписокВыбора[Месяц(ТекущаяДата())].Значение;
	
КонецПроцедуры

И так-же будем формировать список заного каждый раз, когда переходим на другой год в момент выбора

Процедура МесяцОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Пока СтрДлина(ВыбранноеЗначение) = 4 Цикл
		СформироватьСписокВыбораМесяца(?(ТипЗнч(ВыбранноеЗначение) = Тип("ЭлементСпискаЗначений"),ВыбранноеЗначение.Представление,ВыбранноеЗначение));
		ВыбранноеЗначение = ЭтаФорма.ВыбратьИзСписка(Элемент.СписокВыбора, Элемент);
	КонецЦикла;
	
	ВыбранноеЗначение = ?(ТипЗнч(ВыбранноеЗначение) = Тип("ЭлементСпискаЗначений"),ВыбранноеЗначение.Значение,ВыбранноеЗначение);
	
КонецПроцедуры

Не нужно больше ничего выдумывать, в реквизите - "Месяц" у нас уже хранится дата начала выбранного месяца :)

Ну в общем-то и всё :) Надеюсь не сильно утомил.. Может, кому-нибудь, да помогу ^_______^

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Илья Коротков (molodoi1sneg) 10.12.14 08:01
Нужно было заглянуть в типовые конфигурации(ЗУП,УПП1.3), поискать реквизит "ПериодРегистрации".

Велосипед знатный.
2. Серёжка Шеянов (CepeLLlka) 10.12.14 08:33
А как заглянуть? Они денег стоят так-то..
3. М Б (Obscurus) 10.12.14 09:24
В ЗУПе 2.5 раздел "процедуры и функции для обеспечения ввода даты как месяца" модуля "работа с диалогами". На других конфигурацих скорее всего примерно также, как написали выше ищите ПериодРегистрации)

Реквизит ПериодРегистрации - тип Дата. Поле ввода - тип Строка
Если коротко и вырезать лишнее будет примерно:
Процедура ПериодРегистрацииПриИзменении(Элемент)
	РаботаСДиалогами.ДатаКакМесяцПодобратьДатуПоТексту(Элемент.Значение, ПериодРегистрации);
	Элемент.Значение = РаботаСДиалогами.ДатаКакМесяцПредставление(ПериодРегистрации);
КонецПроцедуры

Процедура ПериодРегистрацииНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	РаботаСДиалогами.НачалоВыбораИзСпискаПредставленияПериодаРегистрации(Элемент, СтандартнаяОбработка, ПериодРегистрации, ЭтаФорма);
КонецПроцедуры

Процедура ПериодРегистрацииОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

Процедура ПериодРегистрацииРегулирование(Элемент, Направление, СтандартнаяОбработка)
	ПериодРегистрации = ДобавитьМесяц(ПериодРегистрации, Направление);
	Элемент.Значение = РаботаСДиалогами.ДатаКакМесяцПредставление(ПериодРегистрации);
КонецПроцедуры

Процедура ПериодРегистрацииАвтоПодборТекста(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)
	РаботаСДиалогами.ДатаКакМесяцАвтоПодборТекста(Текст, ТекстАвтоПодбора, СтандартнаяОбработка);
КонецПроцедуры

Процедура ПериодРегистрацииОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
	РаботаСДиалогами.ДатаКакМесяцОкончаниеВводаТекста(Текст, Значение, СтандартнаяОбработка);
КонецПроцедуры
...Показать Скрыть


Тут реализовано изменение стрелочками, а не списком, да и вручную можно ввести. Как по мне весьма удобней, чем крутить длинный список.

в надежде заработать немного поинтов :)

PS. Халявы не будет! Ваш покорный слуга Тёмный :)
RodinMax; Nelli_A86; +2 Ответить
4. al petrov (petrov_al) 10.12.14 09:49
А мне нравится, даже если и "велосипед". Типовые решения хороши, но иногда полезно написать что то и самому оригинальное.
5. DAnry (DAnry) 17.12.14 15:19
Есть варианты и получше. В том числе и на infostart'е
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа