При переходе с обычных форм на управляемые разработчики часто сталкиваются с ситуацией, когда привычный объект НастройкаПериода перестает работать. В управляемом приложении (тонкий клиент и веб-клиент) доступ к этому объекту отсутствует, а его использование приводит к ошибкам компиляции.
В этой статье мы разберем, как правильно организовать выбор периода на управляемой форме, какие объекты платформы 1С для этого предназначены и как избежать распространенных ошибок при вызове диалоговых окон.
Проанализируем частую ошибку, когда при создании объекта выборки периода возникает сбой. Объект НастройкаПериода работал в обычных формах и в толстом клиенте. Однако в режиме тонкого клиента и веб-клиента используется другой механизм — СтандартныйПериод и ДиалогРедактированияСтандартногоПериода.
Если попытаться обратиться к объекту ДиалогРедактированияСтандартногоПериода в серверном контексте (например, в процедуре с директивой &НаСервере), платформа выдаст ошибку, что тип не определен. Это связано с тем, что диалоговые окна предназначены исключительно для взаимодействия с пользователем и доступны только на клиенте (&НаКлиенте). На сервере нет пользовательского интерфейса, поэтому создавать диалоги там бессмысленно.
Кроме того, помните: у объекта ДиалогРедактированияСтандартногоПериода нет устаревших методов вроде УстановитьПериод() или ПолучитьДатуНачала(). Все границы устанавливаются через свойство Период.
Рассмотрим самый простой и штатный способ, не требующий написания сложного программного кода для вызова диалогов.
ПериодОтчета) и укажем ему тип СтандартныйПериод.При необходимости получить конкретные границы дат (например, для использования в запросе) обратимся к свойствам реквизита на клиенте или сервере:
ДатаНачала = ПериодОтчета.ДатаНачала;
ДатаОкончания = ПериодОтчета.ДатаОкончания;
Если выбор периода требуется привязать к отдельной кнопке или команде формы, разберем программный способ открытия диалога редактирования периода.
Посмотрим на пример клиентского кода, использующего объект ДиалогРедактированияСтандартногоПериода:
&НаКлиенте
Процедура КомандаНастройкаПериода(Команда)
Диалог = Новый ДиалогРедактированияСтандартногоПериода;
// Передаем текущий период в диалог
Диалог.Период = ПеременнаяТипаСтандартныйПериод;
// Открываем диалог редактирования периода
Если Диалог.Редактировать() Тогда
// Сохраняем выбранное значение
ПеременнаяТипаСтандартныйПериод = Диалог.Период;
// Извлекаем конкретные даты
НачПериода = ПеременнаяТипаСтандартныйПериод.ДатаНачала;
КонПериода = ПеременнаяТипаСтандартныйПериод.ДатаОкончания;
КонецЕсли;
КонецПроцедуры
Если в конфигурации включен режим работы без использования модальных окон, рекомендуется использовать асинхронный вызов методом Показать() с обработчиком оповещения:
&НаКлиенте
Процедура КомандаВыбратьПериод(Команда)
Диалог = Новый ДиалогРедактированияСтандартногоПериода;
Диалог.Период = ИсходныйПериод;
Оповещение = Новый ОписаниеОповещения("ПослеВыбораПериода", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораПериода(ВыбранныйПериод, ДополнительныеПараметры) Экспорт
Если ВыбранныйПериод <> Неопределено Тогда
ИсходныйПериод = ВыбранныйПериод;
ДатаНачала = ВыбранныйПериод.ДатаНачала;
ДатаОкончания = ВыбранныйПериод.ДатаОкончания;
КонецЕсли;
КонецПроцедуры
После того как пользователь определил интервал, полученные даты передаются в параметры запроса на сервере. В языке запросов 1С проверка вхождения даты в интервал выполняется следующим образом:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка,
| Дата
|ИЗ
| Документ.Продажи
|ГДЕ
| Дата МЕЖДУ &Дата1 И &Дата2";
Запрос.УстановитьПараметр("Дата1", НачПериода);
Запрос.УстановитьПараметр("Дата2", КонПериода);
Таким образом, для работы с интервалами дат в управляемых формах следует использовать объекты СтандартныйПериод и ДиалогРедактированияСтандартногоПериода, соблюдая контекст исполнения кода на клиенте.