Организация выбора месяца из списка

07.02.17

Разработка - Работа с интерфейсом

Пришлось столкнуться с такой проблемой, как выбор месяца из ниспадающего списка (с элементами вида "НазваниеМесяца Год") с возможностью изменения года. Хочу предложить вариант реализации данного механизма, может кому и пригодится)

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

Наименование Файл Версия Размер
Выбор месяца из списка (модальный режим)
.epf 6,56Kb
122
.epf 6,56Kb 122 Скачать
Выбор месяца из списка (немодальный режим)
.epf 6,96Kb
41
.epf 6,96Kb 41 Скачать

Итак, мы имеем некий объект с реквизитом "Месяц" с типом "Строка", который находится у нас на управляемой форме, куда и будет вписываться название месяца и год. Прежде всего, при открытии формы необходимо сформировать список выбора (например, на текущий год):

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


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


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

Сама процедура формирования будет следующей:

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

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

Далее организуем выбор из списка. Для этого нам понадобится событие нашего элемента "НачалоВыбораИзСписка":

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


    Если Объект.Месяц  "" Тогда

        //реквизит уже заполнен, нужно формировать список для года, соответствующего заполнению
        ВыбрГод = Число(Прав(Объект.Месяц, 4));
        СформироватьСписокВыбораМесяца(ВыбрГод);
    КонецЕсли;
    
    СтандартнаяОбработка = Ложь;
    ВыбранноеЗначение = Строка(ЭтаФорма.ВыбратьИзСписка(Элемент.СписокВыбора, Элемент));
    Если ВыбранноеЗначение  "" Тогда
        Если СтрДлина(ВыбранноеЗначение)=4 Тогда

            //выбрано значение, которое соответствует смене года в списке
            Пока СтрДлина(ВыбранноеЗначение) = 4 Цикл

                //цикл продолжается до тех пор, пока мы не выберем месяц
                ВыбрГод = Число(ВыбранноеЗначение);
                СформироватьСписокВыбораМесяца(ВыбрГод);
                ВыбранноеЗначение = Строка(ЭтаФорма.ВыбратьИзСписка(Элемент.СписокВыбора, Элемент));                    
            КонецЦикла;
        КонецЕсли;
        Если ВыбранноеЗначение  "" Тогда

             //выбрали месяц, а не пустое значение, запишем его

            //если выбрали пустое значение, то в реквизите месяц сохранится значение, которое было до выбора
            Объект.Месяц = ВыбранноеЗначение;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Далее можно делать с этим значением, что угодно. Например, нам нужно в некий реквизит подставить конец выбранного месяца. Тогда мы имеем реквизит объекта "КонецМесяца" с типом дата, создаем реквизит формы "Месяц" с типом строка и помещаем связанный с ним элемент на форму. Далее реализуем вышеописанный механизм с некоторыми изменениями:

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
  
    Если ЗначениеЗаполнено(Объект.КонецМесяца) Тогда
        Месяц = Формат(Объект.КонецМесяца, "ДФ = ММММ");

        //формируем список на год, соответствующий заполненному реквизиту

        СформироватьСписокВыбораМесяца(Год(Объект.КонецМесяца));
    Иначе
        Месяц = ""; 

        //формируем список на текущий год

        СформироватьСписокВыбораМесяца(Год(ТекущаяДата()));
    КонецЕсли;
    

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


Событие "НачалоВыбораИзСписка" изменяем так, чтобы заполнялся реквизит "КонецМесяца". Помним, что "Месяц" - реквизит формы, а не объекта, поэтому убираем перед ним "Объект." и заполняем реквизит "КонецМесяца":

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


    Если Месяц  "" Тогда

        //реквизит уже заполнен, нужно формировать список для года, соответствующего заполнению
        ВыбрГод = Число(Прав(Месяц, 4));
        СформироватьСписокВыбораМесяца(ВыбрГод);
    КонецЕсли;
    
    СтандартнаяОбработка = Ложь;
    ВыбранноеЗначение = Строка(ЭтаФорма.ВыбратьИзСписка(Элемент.СписокВыбора, Элемент));
    Если ВыбранноеЗначение  "" Тогда
        Если СтрДлина(ВыбранноеЗначение)=4 Тогда

            //выбрано значение, которое соответствует смене года в списке
            Пока СтрДлина(ВыбранноеЗначение) = 4 Цикл

                //цикл продолжается до тех пор, пока мы не выберем месяц
                ВыбрГод = Число(ВыбранноеЗначение);
                СформироватьСписокВыбораМесяца(ВыбрГод);
                ВыбранноеЗначение = Строка(ЭтаФорма.ВыбратьИзСписка(Элемент.СписокВыбора, Элемент));                    
            КонецЦикла;
        КонецЕсли;
        Если ВыбранноеЗначение  "" Тогда

             //выбрали месяц, а не пустое значение, запишем его

            //если выбрали пустое значение, то в реквизите месяц сохранится значение, которое было до выбора
            Месяц = ВыбранноеЗначение;

            НомМесяца = (Найти("янвфевмарапрмайиюниюлавгсеноктноядек",Нрег(Лев(ВыбранноеЗначение,3)))+2)/3; //получаем номер месяца
            ВыбрГод = Число(Прав(ВыбранноеЗначение, 4));
            Объект.КонецМесяца = КонецМесяца(Дата(ВыбрГод, НомМесяца, 1));


        КонецЕсли;
    КонецЕсли;
КонецПроцедуры


Собственно вот и все) Вы также можете скачать обработку с примером: //infostart.ru/public/download.php?file=167551

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61793    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54401    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

2400 руб.

29.06.2020    16695    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10735    750    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    9610    151    acces969    31    

118

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3665    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12079    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. vipq7 05.02.14 16:00 Сейчас в теме
Спасибо, удобная штука...
2. RocKeR_13 1317 06.02.14 12:42 Сейчас в теме
(1) vipq7, рад, что пригодилось)
3. alexandr851c 27 06.03.14 14:00 Сейчас в теме
Очень выручили. Огромное спасибо !!!
4. RocKeR_13 1317 06.03.14 14:18 Сейчас в теме
(3) alexandr851c, честно говоря, когда публиковал, не думал, что многих заинтересует)) На здоровье)
5. karapuzzzz 63 30.08.14 01:36 Сейчас в теме
Спасибо. Идея с переходом между годами мне понравилась. Реализовал у себя с адаптированием под обычное приложение.

Единственное замечание в том, что обычно за период принимают не конец месяца, а начало.
6. RocKeR_13 1317 31.08.14 21:43 Сейчас в теме
(5) karapuzzzz, пожалуйста) ну как у вас не знаю, сколько ни делал доработок отчетов - везде нужен был именно конец месяца в качестве конца периода
7. nytlenc 03.09.15 08:27 Сейчас в теме
Спасибо! Респект. Очень пригодилось!
8. RocKeR_13 1317 03.09.15 16:57 Сейчас в теме
(7) nytlenc, рад, что пригодилось! Успехов вам)
9. dsitiy 66 17.02.16 17:03 Сейчас в теме
А при нажатии на строчку с годом ничего не должно происходить?
Я думал откроются месяца с предыдущим годом.
10. Anchoret 60 16.03.16 17:10 Сейчас в теме
Спасибо за пример, очень помог.

(9) Orlanxxx, происходит, если сделать все правильно.
Я в условиях сначала поставил равенство (=) и у меня тоже ничего не происходило при выборе года.
Изменил на (<>) и все в порядке стало.
11. Makushimo 160 17.03.16 15:58 Сейчас в теме
Если выбрать год, потом еще раз год
то вылетает с ошибкой
надо в рекурсию заворачивать

однозначно плюс
12. Yuriy.MW 27 02.02.17 16:07 Сейчас в теме
Чуток подкорректировал процедуры.
Месяц - строка, реквизит формы
ПериодРегистрации - Дата, реквизит объекта

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	 Месяц = Формат(Объект.ПериодРегистрации, "ДФ='MMMM yyyy'");
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура МесяцНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	
	Если ЗначениеЗаполнено(Объект.ПериодРегистрации) Тогда
		текМесяц = Объект.ПериодРегистрации;
	Иначе
		текМесяц = ТекущаяДата();
	КонецЕсли;
	СформироватьСписокВыбораМесяца(Год(текМесяц));
	
	СтандартнаяОбработка = Ложь;
	ВыбранноеЗначение = ЭтаФорма.ВыбратьИзСписка(Элемент.СписокВыбора, Элемент, Элемент.СписокВыбора.НайтиПоЗначению(текМесяц));
	Пока ВыбранноеЗначение <> Неопределено И СтрДлина(ВыбранноеЗначение.Представление) = 4 Цикл
		//цикл продолжается до тех пор, пока мы не выберем месяц
		СформироватьСписокВыбораМесяца(Год(ВыбранноеЗначение.Значение));
		ВыбранноеЗначение = ЭтаФорма.ВыбратьИзСписка(Элемент.СписокВыбора, Элемент);                    
	КонецЦикла;
	
	Если ВыбранноеЗначение <> Неопределено Тогда
		Месяц = ВыбранноеЗначение.Представление;
		Объект.ПериодРегистрации = ВыбранноеЗначение.Значение;
	КонецЕсли;
	
КонецПроцедуры
Показать
13. Ганс 07.02.17 12:57 Сейчас в теме
УТ11.3 не работает что-то! ((
14. RocKeR_13 1317 07.02.17 13:27 Сейчас в теме
(13) да теперь модальные окна запрещены, выложу позже исправленный вариант.
Примерный код реализации теперь будет такой:

&НаКлиенте
Процедура МесяцНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	
    СтандартнаяОбработка = Ложь;
	Если Месяц <> "" Тогда

        //реквизит уже заполнен, нужно формировать список для года, соответствующего заполнению
        ВыбрГод = Число(Прав(Месяц, 4));
        СформироватьСписокВыбораМесяца(ВыбрГод);
    КонецЕсли;
    
    СтандартнаяОбработка = Ложь;
    ВыбранноеЗначение = Строка(ЭтаФорма.ВыбратьИзСписка(Элемент.СписокВыбора, Элемент));
    Если ВыбранноеЗначение <> "" Тогда
        Если СтрДлина(ВыбранноеЗначение)=4 Тогда

            //выбрано значение, которое соответствует смене года в списке
            Пока СтрДлина(ВыбранноеЗначение) = 4 Цикл

                //цикл продолжается до тех пор, пока мы не выберем месяц
                ВыбрГод = Число(ВыбранноеЗначение);
                СформироватьСписокВыбораМесяца(ВыбрГод);
                ВыбранноеЗначение = Строка(ЭтаФорма.ВыбратьИзСписка(Элемент.СписокВыбора, Элемент));                    
            КонецЦикла;
        КонецЕсли;
        Если ВыбранноеЗначение <> "" Тогда

             //выбрали месяц, а не пустое значение, запишем его

            //если выбрали пустое значение, то в реквизите месяц сохранится значение, которое было до выбора
            Месяц = ВыбранноеЗначение;

            НомМесяца = (Найти("янвфевмарапрмайиюниюлавгсеноктноядек",Нрег(Лев(ВыбранноеЗначение,3)))+2)/3; //получаем номер месяца
            ВыбрГод = Число(Прав(ВыбранноеЗначение, 4));
            Объект.КонецМесяца = КонецМесяца(Дата(ВыбрГод, НомМесяца, 1));


        КонецЕсли;
    КонецЕсли;	
КонецПроцедуры

&НаКлиенте
Процедура МесяцНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
    СтандартнаяОбработка = Ложь;
	Если Месяц <> "" Тогда

        //реквизит уже заполнен, нужно формировать список для года, соответствующего заполнению
        ВыбрГод = Число(Прав(Месяц, 4));
        СформироватьСписокВыбораМесяца(ВыбрГод);
    КонецЕсли;
    
	Оповещение = Новый ОписаниеОповещения("ПослеВыбораМесяцаИзСписка", ЭтотОбъект);
	ПоказатьВыборИзСписка(Оповещение, Элементы.Месяц.СписокВыбора, Элементы.Месяц);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораМесяцаИзСписка(Результат, ДП) Экспорт
	
	ВыбранноеЗначение = Результат.Значение;
	
    Если ВыбранноеЗначение <> "" Тогда
        Если СтрДлина(ВыбранноеЗначение)=4 Тогда

            //выбрано значение, которое соответствует смене года в списке
			//Пока СтрДлина(ВыбранноеЗначение) = 4 Цикл

                //цикл продолжается до тех пор, пока мы не выберем месяц
                ВыбрГод = Число(ВыбранноеЗначение);
                СформироватьСписокВыбораМесяца(ВыбрГод);
				Оповещение = Новый ОписаниеОповещения("ПослеВыбораМесяцаИзСписка", ЭтотОбъект);
				ПоказатьВыборИзСписка(Оповещение, Элементы.Месяц.СписокВыбора, Элементы.Месяц);
				Возврат;
			//КонецЦикла;
        ИначеЕсли ВыбранноеЗначение <> "" Тогда

             //выбрали месяц, а не пустое значение, запишем его

            //если выбрали пустое значение, то в реквизите месяц сохранится значение, которое было до выбора
            Месяц = ВыбранноеЗначение;

            НомМесяца = (Найти("янвфевмарапрмайиюниюлавгсеноктноядек",Нрег(Лев(ВыбранноеЗначение,3)))+2)/3; //получаем номер месяца
            ВыбрГод = Число(Прав(ВыбранноеЗначение, 4));
            Объект.КонецМесяца = КонецМесяца(Дата(ВыбрГод, НомМесяца, 1));


        КонецЕсли;
    КонецЕсли;		
	
КонецПроцедуры

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

КонецПроцедуры
Показать


И при открытии:
    Если ЗначениеЗаполнено(Объект.КонецМесяца) Тогда
        Месяц = Формат(Объект.КонецМесяца, "ДФ = ММММ");

        //формируем список на год, соответствующий заполненному реквизиту

        СформироватьСписокВыбораМесяца(Год(Объект.КонецМесяца));
    Иначе
        Месяц = ""; 

        //формируем список на текущий год

        СформироватьСписокВыбораМесяца(Год(ТекущаяДата()));
    КонецЕсли;
Показать
15. vnagapov 28.06.17 10:38 Сейчас в теме
Я думаю, что так еще проще

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Месяц = Формат(Объект.ПериодРегистрации, "ДФ='MMMM yyyy'");
	СформироватьСписокВыбораМесяца(Год(Объект.ПериодРегистрации));
КонецПроцедуры

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


&НаКлиенте
Процедура МесяцПриИзменении(Элемент)
	Если Месяц <> "" Тогда
		Если СтрДлина(Месяц)=4 Тогда 
			СформироватьСписокВыбораМесяца(Число(Месяц));
			Объект.ПериодРегистрации = НачалоМесяца(Дата(Число(Месяц), 1, 1));
			Месяц = Формат(Объект.ПериодРегистрации, "ДФ='MMMM yyyy'");
		Иначе
			НомМесяца = (Найти("янвфевмарапрмайиюниюлавгсеноктноядек",Нрег(Лев(Месяц,3)))+2)/3; //получаем номер месяца
			ВыбрГод = Число(Прав(Месяц, 4));
			Объект.ПериодРегистрации = НачалоМесяца(Дата(ВыбрГод, НомМесяца, 1));
		КонецЕсли;	
	КонецЕсли;
КонецПроцедуры
Показать
P1rate; ашот; Lapitskiy; anuar_medeup; +4 Ответить
16. user805602 07.09.18 09:16 Сейчас в теме
Если Месяц "" Тогда

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

Пропущен, знак..
Оставьте свое сообщение