Как сделать настройку и выбор периода на управляемой форме в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При переходе с обычных форм на управляемые разработчики часто сталкиваются с ситуацией, когда привычный объект НастройкаПериода перестает работать. В управляемом приложении (тонкий клиент и веб-клиент) доступ к этому объекту отсутствует, а его использование приводит к ошибкам компиляции.

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

Выясним причину ошибки «Тип не определен»

Проанализируем частую ошибку, когда при создании объекта выборки периода возникает сбой. Объект НастройкаПериода работал в обычных формах и в толстом клиенте. Однако в режиме тонкого клиента и веб-клиента используется другой механизм — СтандартныйПериод и ДиалогРедактированияСтандартногоПериода.

Если попытаться обратиться к объекту ДиалогРедактированияСтандартногоПериода в серверном контексте (например, в процедуре с директивой &НаСервере), платформа выдаст ошибку, что тип не определен. Это связано с тем, что диалоговые окна предназначены исключительно для взаимодействия с пользователем и доступны только на клиенте (&НаКлиенте). На сервере нет пользовательского интерфейса, поэтому создавать диалоги там бессмысленно.

Кроме того, помните: у объекта ДиалогРедактированияСтандартногоПериода нет устаревших методов вроде УстановитьПериод() или ПолучитьДатуНачала(). Все границы устанавливаются через свойство Период.

Способ 1. Использование реквизита формы с типом СтандартныйПериод

Рассмотрим самый простой и штатный способ, не требующий написания сложного программного кода для вызова диалогов.

  1. Добавим в реквизиты управляемой формы новый реквизит (например, ПериодОтчета) и укажем ему тип СтандартныйПериод.
  2. Перетащим созданный реквизит в элементы формы. Платформа автоматически создаст поле ввода с кнопкой выбора.
  3. При нажатии на кнопку выбора пользователь увидит стандартный диалог 1С для установки интервала дат.

При необходимости получить конкретные границы дат (например, для использования в запросе) обратимся к свойствам реквизита на клиенте или сервере:


ДатаНачала = ПериодОтчета.ДатаНачала;
ДатаОкончания = ПериодОтчета.ДатаОкончания;

Способ 2. Программный вызов диалога на клиенте

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

Посмотрим на пример клиентского кода, использующего объект ДиалогРедактированияСтандартногоПериода:


&НаКлиенте
Процедура КомандаНастройкаПериода(Команда)
	
	Диалог = Новый ДиалогРедактированияСтандартногоПериода;
	
	// Передаем текущий период в диалог
	Диалог.Период = ПеременнаяТипаСтандартныйПериод;
	
	// Открываем диалог редактирования периода
	Если Диалог.Редактировать() Тогда
		// Сохраняем выбранное значение
		ПеременнаяТипаСтандартныйПериод = Диалог.Период;
		
		// Извлекаем конкретные даты
		НачПериода = ПеременнаяТипаСтандартныйПериод.ДатаНачала;
		КонПериода = ПеременнаяТипаСтандартныйПериод.ДатаОкончания;
	КонецЕсли;
	
КонецПроцедуры

Если в конфигурации включен режим работы без использования модальных окон, рекомендуется использовать асинхронный вызов методом Показать() с обработчиком оповещения:


&НаКлиенте
Процедура КомандаВыбратьПериод(Команда)
	
	Диалог = Новый ДиалогРедактированияСтандартногоПериода;
	Диалог.Период = ИсходныйПериод;
	
	Оповещение = Новый ОписаниеОповещения("ПослеВыбораПериода", ЭтотОбъект);
	Диалог.Показать(Оповещение);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораПериода(ВыбранныйПериод, ДополнительныеПараметры) Экспорт
	
	Если ВыбранныйПериод <> Неопределено Тогда
		ИсходныйПериод = ВыбранныйПериод;
		ДатаНачала = ВыбранныйПериод.ДатаНачала;
		ДатаОкончания = ВыбранныйПериод.ДатаОкончания;
	КонецЕсли;
	
КонецПроцедуры

Использование выбранного периода в запросах

После того как пользователь определил интервал, полученные даты передаются в параметры запроса на сервере. В языке запросов 1С проверка вхождения даты в интервал выполняется следующим образом:


Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ
	|	Ссылка,
	|	Дата
	|ИЗ
	|	Документ.Продажи
	|ГДЕ
	|	Дата МЕЖДУ &Дата1 И &Дата2";

Запрос.УстановитьПараметр("Дата1", НачПериода);
Запрос.УстановитьПараметр("Дата2", КонПериода);

Таким образом, для работы с интервалами дат в управляемых формах следует использовать объекты СтандартныйПериод и ДиалогРедактированияСтандартногоПериода, соблюдая контекст исполнения кода на клиенте.

← На главную