При настройке обмена данными в конфигурации «Конвертация данных 2.x» нередко возникает необходимость отобрать данные не по стандартным правилам и отборам, а с помощью собственного запроса в обработчике правила выгрузки данных (ПВД). Однако данные должны отбираться строго за тот период, который интерактивно задал пользователь на форме обработки «Универсальный обмен данными в формате XML». Разберем, как получить значения начала и окончания периода внутри кода обработчиков, какие нюансы важно учитывать при работе с датами и чем различается поведение на управляемых и обычных формах.
Обработка «Универсальный обмен данными в формате XML» выполняет код встроенных алгоритмов и обработчиков правил с помощью оператора Выполнить() непосредственно в контексте модуля своего объекта. Это означает, что все реквизиты объекта обработки доступны напрямую в любом обработчике выгрузки без необходимости обращения через вспомогательные объекты или свойства формы.
Для обращения к периоду выгрузки служат переменные:
ДатаНачала — содержит начало выбранного интервала.ДатаОкончания — содержит конец выбранного интервала.Обращаться к ним нужно напрямую по имени переменной, как к локальным переменным обработчика. Использование конструкций вида ЭтотОбъект.ДатаНачала или попытки обратиться к форме не требуются.
Проанализируем распространенную ошибку: при выборе даты окончания на форме пользователь выбирает только календарный день. В результате реквизит ДатаОкончания получает значение с временем начала дня (00:00:00). Если мы передадим такую дату в запрос с условием МЕЖДУ, все документы, созданные в течение завершающего дня периода, не попадут в выборку.
Кроме того, пользователь может оставить поля периода пустыми, если планируется полная выгрузка всей базы. В таком случае переменные будут содержать пустую дату ('00010101000000'), что при жестком отборе приведет к пустой выборке.
Рассмотрим, как правильно подготовить параметры периода перед выполнением запроса:
КонецПериода = ?(ЗначениеЗаполнено(ДатаОкончания), КонецДня(ДатаОкончания), ДатаОкончания);
НачалоПериода = ДатаНачала;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| (&БезОграниченияПоДатеИлиПусто
| ИЛИ РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания)";
Запрос.УстановитьПараметр("ДатаНачала", НачалоПериода);
Запрос.УстановитьПараметр("ДатаОкончания", КонецПериода);
Запрос.УстановитьПараметр("БезОграниченияПоДатеИлиПусто", НЕ ЗначениеЗаполнено(НачалоПериода) И НЕ ЗначениеЗаполнено(КонецПериода));
ВыборкаДанных = Запрос.Выполнить();
В этом примере результат запроса помещается в служебную переменную ВыборкаДанных. Обработка обмена автоматически обойдет строки результата и передаст их в назначенное правило конвертации объектов (ПКО).
Второй способ организации отбора по периоду — использование явных параметров правил конвертации данных. Этот вариант подходит, если границы выгрузки требуют дополнительного вычисления или если период настраивается через отдельную вкладку «Параметры выгрузки».
Разберем по шагам, как настроить этот вариант:
ПериодС и ПериодПо.
Параметры.ПериодС = ДатаНачала;
Параметры.ПериодПо = ?(ЗначениеЗаполнено(ДатаОкончания), КонецДня(ДатаОкончания), ДатаОкончания);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриходныйКассовыйОрдер.Ссылка КАК Ссылка
|ИЗ
| Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
|ГДЕ
| ПриходныйКассовыйОрдер.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", Параметры.ПериодС);
Запрос.УстановитьПараметр("ДатаОкончания", Параметры.ПериодПо);
ВыборкаДанных = Запрос.Выполнить();
При настройке алгоритмов важно понимать, в каком клиентском приложении запускается обработка:
ЭтаФорма) из кода правил вызовет ошибку. Доступны только реквизиты объекта выгрузки и глобальные параметры правил.ДатаНачала и ДатаОкончания. В управляемых формах период часто отображается единым реквизитом типа СтандартныйПериод. При стандартном поведении обработки значения из этого поля автоматически раскладываются в реквизиты объекта ДатаНачала и ДатаОкончания при старте выгрузки.ВыполнитьВыгрузку() необходимо обязательно инициализировать реквизиты объекта в вызывающем коде:
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаПравил = "C:\Rules\ExchangeRules.xml";
ОбработкаОбмена.ИмяФайлаДанных = "C:\Exchange\Export.xml";
ОбработкаОбмена.РежимОбмена = "Выгрузка";
ОбработкаОбмена.ДатаНачала = НачалоМесяца(ТекущаяДата());
ОбработкаОбмена.ДатаОкончания = КонецМесяца(ТекущаяДата());
ОбработкаОбмена.ЗагрузитьПравилаОбмена();
ОбработкаОбмена.ВыполнитьВыгрузку();
Таким образом, для получения периода в произвольном алгоритме достаточно использовать переменные ДатаНачала и ДатаОкончания напрямую, не забывая приводить дату окончания к концу суток функцией КонецДня().