Иногда, например в вопросах расчетов с персоналом, требуется организовать выбор не конкретной даты документа или отчета, а месяца. То есть, пользователь должен выбрать не 01.01.2020, а просто Январь 2020. При этом, выбранный пользователем месяц должен быть преобразован в нормальную дату, т.к. период регистров указывается датой — началом выбранного месяца.
Организовать выбор месяца можно с помощью создания поля с выпадающим меню. Основу процедуры формирования такого меню мы взяли на сайте oparin.info и внесли некоторые дополнения, которые, на наш взгляд, должны сделать меню удобнее.
Итак, для организации выпадающего меню с выбором месяца нам понадобятся два реквизита:
- Реквизит объекта Период с типом Дата. В него будет записываться дата, преобразованная из месяца, выбранного пользователем. Этот реквизит будет скрыт от пользователя.
- Реквизит формы Месяц с типом Строка. Здесь будет отображаться выбранный месяц и само меню.
С свойствах элемента формы Месяц, связанного с одноименным реквизитом, нужно установить флаг Режим выбора из списка.
Теперь создадим процедуру, которая будет формировать выпадающее меню.
1 2 3 4 5 6 7 8 9 10 11 12 |
&НаКлиенте Процедура СформироватьСписокВыбораМесяца(Год) Элементы.Месяц.СписокВыбора.Очистить(); Элементы.Месяц.СписокВыбора.Добавить(Формат(Год-1, "ЧГ=0")); Для к = 1 По 12 Цикл СформДата = Дата(Год, к, 1); Наим = Формат(СформДата, "ДФ = ""ММММ гггг"""); Элементы.Месяц.СписокВыбора.Добавить(Наим); КонецЦикла; Элементы.Месяц.СписокВыбора.Добавить(Формат(Год+1, "ЧГ=0")); КонецПроцедуры |
В эту процедуру мы должны передать год в виде числа. Затем, начинаем формировать список выбора в следующем виде:
- 2019 — номер предыдущего года. Он нужен, если понадобится выбрать месяц более раннего года.
- Январь 2020
- ………………………. — месяцы года, переданного в процедуру.
- Декабрь 2020
- 2021 — номер следующего года. Он нужен, если понадобится выбрать месяц более позднего года.
Далее, эту процедуру нужно вызывать в двух случаях:
- При открытии формы:
123456789&НаКлиентеПроцедура ПриОткрытии(Отказ)Месяц = Формат(Объект.Период, "ДФ = ""ММММ гггг""");Если Год(Объект.Период) = 1 ТогдаСформироватьСписокВыбораМесяца(Год(ТекущаяДата()));ИначеСформироватьСписокВыбораМесяца(Год(Объект.Период));КонецЕсли;КонецПроцедурыЗдесь мы устанавливаем значение реквизита формы Месяц и формируем список выбора, передав туда либо год из реквизита объекта Период, либо, если он не заполнен, текущую дату.
- При изменении реквизита формы Месяц
12345678910111213141516171819202122232425262728293031323334353637383940&НаКлиентеПроцедура МесяцПриИзменении(Элемент)Если Месяц <> "" ТогдаЕсли СтрДлина(Месяц)=4 ТогдаСформироватьСписокВыбораМесяца(Число(Месяц));Оповещение = новый ОписаниеОповещения("ПослеВыбораГода", ЭтаФорма);ЭтаФорма.ПоказатьВыборИзМеню(Оповещение, Элементы.Месяц.СписокВыбора, Элементы.Месяц);ИначеНомМесяца = (Найти("янвфевмарапрмайиюниюлавгсеноктноядек",Нрег(Лев(Месяц,3)))+2)/3; //получаем номер месяцаВыбрГод = Число(Прав(Месяц, 4));Объект.Период = НачалоМесяца(Дата(ВыбрГод, НомМесяца, 1));КонецЕсли;КонецЕсли;КонецПроцедуры&НаКлиентеПроцедура ПослеВыбораГода (Результат, Параметры) ЭкспортЕсли Результат = Неопределено ТОгдаВозврат;ИначеМесяц = Результат.Значение;КонецЕсли;Если Месяц <> "" ТогдаЕсли СтрДлина(Месяц)=4 ТогдаСформироватьСписокВыбораМесяца(Число(Месяц));Оповещение = новый ОписаниеОповещения("ПослеВыбораГода", ЭтаФорма);ЭтаФорма.ПоказатьВыборИзМеню(Оповещение, Элементы.Месяц.СписокВыбора, Элементы.Месяц);ИначеНомМесяца = (Найти("янвфевмарапрмайиюниюлавгсеноктноядек",Нрег(Лев(Месяц,3)))+2)/3; //получаем номер месяцаВыбрГод = Число(Прав(Месяц, 4));Объект.Период = НачалоМесяца(Дата(ВыбрГод, НомМесяца, 1));КонецЕсли;КонецЕсли;КонецПроцедуры
Итак, при изменении реквизита формы Месяц мы прежде всего проверяем, заполнен ли он. Если да, то проверяем, какой пункт списка выбран. Если пользователь выбрал месяц (длина строки больше 4 символов), то вычисляем номер месяца и формируем дату. Сформированную дату записываем в реквизит объекта Период.
Если же выбран год, переформировываем список выбора и снова показываем выпадающее меню. После того как пользователь сделает выбор из нового списка, проверка повторяется.
Пасиб братюнь, сэкономил мне пол часика.
Лучи добра тебе.
Благодарю, все работает.