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





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

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

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

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

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

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

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

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

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

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

Процедура СформироватьСписокВыбораМесяца(Знач Год)

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

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

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

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

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

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

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

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

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

ВыбранноеЗначение = ?(ТипЗнч(ВыбранноеЗначение) = Тип("ЭлементСпискаЗначений"),ВыбранноеЗначение.Значение,ВыбранноеЗначение);

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

Не нужно больше ничего выдумывать, в реквизите — «Месяц» у нас уже хранится дата начала выбранного месяца 🙂

Ну в общем-то и всё 🙂 Надеюсь не сильно утомил.. Может, кому-нибудь, да помогу #k8SjZc9Dxk_______#k8SjZc9Dxk

8 Comments

  1. molodoi1sneg

    Нужно было заглянуть в типовые конфигурации(ЗУП,УПП1.3), поискать реквизит «ПериодРегистрации».

    Велосипед знатный.

    Reply
  2. CepeLLlka

    А как заглянуть? Они денег стоят так-то..

    Reply
  3. LuxVeritatis

    В ЗУПе 2.5 раздел «процедуры и функции для обеспечения ввода даты как месяца» модуля «работа с диалогами». На других конфигурацих скорее всего примерно также, как написали выше ищите ПериодРегистрации)

    Реквизит ПериодРегистрации — тип Дата. Поле ввода — тип Строка

    Если коротко и вырезать лишнее будет примерно:

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

    Показать

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

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

    PS. Халявы не будет! Ваш покорный слуга Тёмный 🙂

    Reply
  4. petrov_al

    А мне нравится, даже если и «велосипед». Типовые решения хороши, но иногда полезно написать что то и самому оригинальное.

    Reply
  5. DAnry

    Есть варианты и получше. В том числе и на infostart’е

    Reply
  6. bluntschi

    Добрый день,

    вы пишите

    Не нужно больше ничего выдумывать, в реквизите — «Месяц» у нас уже хранится дата начала выбранного месяца 🙂

    а как получить эту дату начала?

    разобралась спасибо.

    Reply
  7. user603532_fan_club_chelsea

    спасибо. пригодился Ваш «Велосипед» 🙂

    Reply
  8. CepeLLlka

    (7)Ой спасибо 🙂 Приятно слышать 🙂

    Надо будет ещё заняться.. а то делаешь порой по работе велосипедов много разных и мопедов, а выкладывать лень 🙂

    Reply

Leave a Comment

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