Как получить период с формы обработки выгрузки при использовании произвольного алгоритма в Конвертации данных?

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

При настройке обмена данными в конфигурации «Конвертация данных 2.x» нередко возникает необходимость отобрать данные не по стандартным правилам и отборам, а с помощью собственного запроса в обработчике правила выгрузки данных (ПВД). Однако данные должны отбираться строго за тот период, который интерактивно задал пользователь на форме обработки «Универсальный обмен данными в формате XML». Разберем, как получить значения начала и окончания периода внутри кода обработчиков, какие нюансы важно учитывать при работе с датами и чем различается поведение на управляемых и обычных формах.

Прямой доступ к переменным периода в контексте обработки

Обработка «Универсальный обмен данными в формате XML» выполняет код встроенных алгоритмов и обработчиков правил с помощью оператора Выполнить() непосредственно в контексте модуля своего объекта. Это означает, что все реквизиты объекта обработки доступны напрямую в любом обработчике выгрузки без необходимости обращения через вспомогательные объекты или свойства формы.

Для обращения к периоду выгрузки служат переменные:

  1. ДатаНачала — содержит начало выбранного интервала.
  2. ДатаОкончания — содержит конец выбранного интервала.

Обращаться к ним нужно напрямую по имени переменной, как к локальным переменным обработчика. Использование конструкций вида ЭтотОбъект.ДатаНачала или попытки обратиться к форме не требуются.

Особенности учета времени и пустых значений дат

Проанализируем распространенную ошибку: при выборе даты окончания на форме пользователь выбирает только календарный день. В результате реквизит ДатаОкончания получает значение с временем начала дня (00:00:00). Если мы передадим такую дату в запрос с условием МЕЖДУ, все документы, созданные в течение завершающего дня периода, не попадут в выборку.

Кроме того, пользователь может оставить поля периода пустыми, если планируется полная выгрузка всей базы. В таком случае переменные будут содержать пустую дату ('00010101000000'), что при жестком отборе приведет к пустой выборке.

Рассмотрим, как правильно подготовить параметры периода перед выполнением запроса:


КонецПериода = ?(ЗначениеЗаполнено(ДатаОкончания), КонецДня(ДатаОкончания), ДатаОкончания);
НачалоПериода = ДатаНачала;

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	РеализацияТоваровУслуг.Ссылка КАК Ссылка
    |ИЗ
    |	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |	(&БезОграниченияПоДатеИлиПусто
    |		ИЛИ РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания)";

Запрос.УстановитьПараметр("ДатаНачала", НачалоПериода);
Запрос.УстановитьПараметр("ДатаОкончания", КонецПериода);
Запрос.УстановитьПараметр("БезОграниченияПоДатеИлиПусто", НЕ ЗначениеЗаполнено(НачалоПериода) И НЕ ЗначениеЗаполнено(КонецПериода));

ВыборкаДанных = Запрос.Выполнить();

В этом примере результат запроса помещается в служебную переменную ВыборкаДанных. Обработка обмена автоматически обойдет строки результата и передаст их в назначенное правило конвертации объектов (ПКО).

Передача периода через коллекцию параметров конвертации

Второй способ организации отбора по периоду — использование явных параметров правил конвертации данных. Этот вариант подходит, если границы выгрузки требуют дополнительного вычисления или если период настраивается через отдельную вкладку «Параметры выгрузки».

Разберем по шагам, как настроить этот вариант:

  1. В конфигурации «Конвертация данных» перейдем на закладку Параметры и создадим пользовательские параметры, например ПериодС и ПериодПо.
  2. Если необходимо переопределить или зафиксировать даты программно для всех правил сразу, откроем глобальный обработчик конвертации «Перед выгрузкой данных» и заполним значения:
    
    Параметры.ПериодС = ДатаНачала;
    Параметры.ПериодПо = ?(ЗначениеЗаполнено(ДатаОкончания), КонецДня(ДатаОкончания), ДатаОкончания);
    
  3. В обработчике ПВД «Перед обработкой» обратимся к подготовленным значениям через структуру параметров:
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ПриходныйКассовыйОрдер.Ссылка КАК Ссылка
        |ИЗ
        |	Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
        |ГДЕ
        |	ПриходныйКассовыйОрдер.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
    
    Запрос.УстановитьПараметр("ДатаНачала", Параметры.ПериодС);
    Запрос.УстановитьПараметр("ДатаОкончания", Параметры.ПериодПо);
    
    ВыборкаДанных = Запрос.Выполнить();
    

Влияние типа формы: управляемые формы (УФ) и обычные формы (ОФ)

При настройке алгоритмов важно понимать, в каком клиентском приложении запускается обработка:

  1. Разделение контекстов на УФ: В управляемом приложении выгрузка всегда выполняется на сервере. Обращение к элементам формы (например, к свойствам полей ввода через ЭтаФорма) из кода правил вызовет ошибку. Доступны только реквизиты объекта выгрузки и глобальные параметры правил.
  2. Тип реквизита периода: В обработках для обычных форм на форме всегда присутствуют два независимых реквизита ДатаНачала и ДатаОкончания. В управляемых формах период часто отображается единым реквизитом типа СтандартныйПериод. При стандартном поведении обработки значения из этого поля автоматически раскладываются в реквизиты объекта ДатаНачала и ДатаОкончания при старте выгрузки.
  3. Программный запуск обработки: Если обработка запускается программно из регламентного задания или стороннего кода, формы нет вовсе. В этом случае перед вызовом процедуры ВыполнитьВыгрузку() необходимо обязательно инициализировать реквизиты объекта в вызывающем коде:
    
    ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
    ОбработкаОбмена.ИмяФайлаПравил = "C:\Rules\ExchangeRules.xml";
    ОбработкаОбмена.ИмяФайлаДанных = "C:\Exchange\Export.xml";
    ОбработкаОбмена.РежимОбмена = "Выгрузка";
    ОбработкаОбмена.ДатаНачала = НачалоМесяца(ТекущаяДата());
    ОбработкаОбмена.ДатаОкончания = КонецМесяца(ТекущаяДата());
    ОбработкаОбмена.ЗагрузитьПравилаОбмена();
    ОбработкаОбмена.ВыполнитьВыгрузку();
    

Таким образом, для получения периода в произвольном алгоритме достаточно использовать переменные ДатаНачала и ДатаОкончания напрямую, не забывая приводить дату окончания к концу суток функцией КонецДня().

← На главную