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

07.02.17

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Выбор месяца из списка (модальный режим)
.epf 6,56Kb
122
122 Скачать (1 SM) Купить за 1 850 руб.
Выбор месяца из списка (немодальный режим)
.epf 6,96Kb
41
41 Скачать (1 SM) Купить за 1 850 руб.

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

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


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


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

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

Процедура СформироватьСписокВыбораМесяца(Год)
    
    Элементы.Месяц.СписокВыбора.Очистить();
    Элементы.Месяц.СписокВыбора.Добавить(Формат(Год-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 Платные (руб)

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

5000 руб.

14.01.2016    55311    17    23    

43

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

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

6000 руб.

16.01.2015    63711    44    59    

82

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

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

2400 руб.

29.06.2020    19557    27    6    

42

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

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

1500 руб.

06.10.2020    10778    7    7    

11

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    20889    mrXoxot    44    

128

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    10363    smielka    37    

105

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

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

27.12.2023    17759    1223    elcoan    53    

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

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

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

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