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