При работе с распределенными информационными базами или при обмене данными между различными конфигурациями 1С:Управление торговлей 10 (УТ10) часто возникает необходимость в фильтрации выгружаемых данных. Одна из типичных задач – исключить документы, относящиеся к определенным организациям, из процесса обмена, особенно при использовании онлайн-обмена. Рассмотрим, как мы можем решить эту проблему, используя различные подходы.
Наша задача состоит в том, чтобы настроить обмен данными таким образом, чтобы документы по четырем организациям из исходной базы УТ10 переносились в целевую базу УТ10, имеющую три организации, но при этом документы по одной или нескольким ненужным организациям не выгружались совсем. Ситуация усложняется тем, что при использовании универсальной обработки выгрузки данных (например, V8Exchan82.epf) отбор по организациям работает, а вот при штатном онлайн-обмене – нет.
Мы проанализируем несколько подходов к решению этой проблемы, начиная от модификации правил обмена и заканчивая использованием подписок на события.
Один из самых распространенных способов управления выгрузкой данных – это модификация правил конвертации объектов (ПКО) или правил конвертации наборов данных (ПКГС) в конфигурации «Конвертация данных». Мы можем добавить логику, которая будет проверять организацию документа и отменять его выгрузку при совпадении с нежелательной организацией.
Суть метода: Добавить условие в событие ПриВыгрузке или ПередВыгрузкой соответствующего объекта (например, документа), которое установит параметр Отказ = Истина, если документ принадлежит организации, которую мы хотим исключить.
Пример кода:
В правилах обмена, в событии ПриВыгрузке для нужного документа (например, "Реализация товаров и услуг"), мы можем написать следующий код:
// Предположим, Параметры.ОрганизацияДляИсключения содержит ссылку на организацию,
// которую НЕ нужно выгружать. Этот параметр может быть задан в настройках обмена
// или явно указан в коде.
// Автор пробовал такой код (для включения, а не исключения):
// Если (Параметры.Организация <> Объект.Организация) Тогда
// Отказ = Истина;
// КонецЕсли;
// Адаптируем для исключения:
// Определим организацию, которую мы хотим исключить из обмена.
// Мы можем получить ее из параметра обмена, константы или задать явно.
// Например, используем параметр, который мы настроим в узле обмена или в форме обработки
// V8Exchan82.epf, если вы используете ее для настройки правил.
// Допустим, параметр в правилах называется "ИсключаемаяОрганизация".
Если ЗначениеЗаполнено(Параметры.ИсключаемаяОрганизация) Тогда
Если Объект.Организация = Параметры.ИсключаемаяОрганизация Тогда
Отказ = Истина; // Отменяем выгрузку документа, если его организация совпадает с исключаемой
КонецЕсли;
КонецЕсли;
// Или, если нам нужно исключить несколько организаций, мы можем использовать список:
// Допустим, Параметры.СписокИсключаемыхОрганизаций - это массив или список значений
// с организациями, которые необходимо исключить.
// Если Параметры.СписокИсключаемыхОрганизаций.Найти(Объект.Организация) <> Неопределено Тогда
// Отказ = Истина;
// КонецЕсли;
Как это работает:
ПриВыгрузке.Объект (например, документ "Реализация товаров и услуг") и к его реквизитам, таким как Объект.Организация.Параметры.ИсключаемаяОрганизация).Отказ = Истина. Это указывает системе конвертации данных, что текущий объект не должен быть выгружен.Важно: Убедитесь, что параметр ИсключаемаяОрганизация (или аналогичный) корректно настроен и передается в правила обмена. Если вы используете обработку V8Exchan82.epf для запуска правил, то параметры могут быть заданы на вкладке "Настройка" или "Параметры обмена".
В случае онлайн-обмена (когда изменения автоматически регистрируются и выгружаются) проблема часто заключается не в самих правилах конвертации, а в механизме регистрации изменений для планов обмена. Если объект зарегистрирован для выгрузки, он попадет в обмен. Чтобы исключить объекты определенных организаций, мы можем управлять этой регистрацией на уровне платформы с помощью подписок на события.
Суть метода: Создать подписку на событие ПриЗаписи для всех типов объектов, которые мы хотим фильтровать (например, всех документов). В обработчике этой подписки мы будем проверять организацию записываемого объекта и, в зависимости от нее, регистрировать или не регистрировать его для обмена, или даже удалять уже существующую регистрацию.
Пример кода для подписки на событие:
Создадим новую подписку на событие в конфигураторе (раздел "Общие" -> "Подписки на события").
В модуле "УправлениеОбменомМодуль" мы реализуем следующую процедуру:
Процедура ПриЗаписиДокументаУправлениеОбменом(Источник, Отказ) Экспорт
// Не обрабатываем объекты, которые приходят через обмен,
// чтобы избежать циклических вызовов и некорректной логики.
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Определяем узел обмена, для которого мы хотим управлять регистрацией.
// Замените "КодВашегоУзлаОбмена" на актуальный код вашего узла плана обмена.
// Например, "001" или "УзелДляОбменаСДругойБазой".
УзелОбмена = ПланыОбмена.НайтиПоКоду("КодВашегоУзлаОбмена");
Если УзелОбмена = Неопределено Тогда
// Узел обмена не найден, возможно, ошибка или обмен не настроен.
Возврат;
КонецЕсли;
// Определим организацию или список организаций, которые мы хотим ИСКЛЮЧИТЬ из обмена.
// Это может быть ссылка на элемент справочника "Организации",
// или список значений, если организаций несколько.
// Для примера, используем жестко заданный код организации.
ИсключаемаяОрганизацияКод = "000000001"; // Замените на реальный код организации, которую нужно исключить.
// Получаем текущую организацию документа. Предполагаем, что у документов есть реквизит "Организация".
ОрганизацияДокумента = Неопределено;
Попытка
ОрганизацияДокумента = Источник.Организация;
Исключение
// У объекта нет реквизита "Организация", пропускаем его.
Возврат;
КонецПопытки;
// Если организация документа совпадает с исключаемой, то мы НЕ регистрируем его.
// Более того, если он уже был зарегистрирован (например, до изменения его организации),
// мы удаляем эту регистрацию.
Если ОрганизацияДокумента.Код = ИсключаемаяОрганизацияКод Тогда
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Источник);
Иначе
// Если организация документа НЕ совпадает с исключаемой,
// то регистрируем его для обмена стандартным образом.
Если Источник.ПометкаУдаления Тогда
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Источник);
Иначе
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Источник);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Как это работает:
ПриЗаписиДокументаУправлениеОбменом.ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Источник). Это гарантирует, что даже если объект был ранее зарегистрирован для обмена, его регистрация будет снята.ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Источник).Этот подход более гибок для онлайн-обмена, поскольку он контролирует саму регистрацию изменений, которая является триггером для выгрузки.
В более современных механизмах обмена данными (например, на основе "Конвертации данных 2.0" и выше, которые могут использоваться и для УТ10.3 при определенных настройках), существуют декларативные "Правила регистрации объектов" (ПРОБ и ПРОП). Они позволяют настраивать фильтрацию объектов прямо на узлах планов обмена без программного кода в модулях.
Суть метода: В настройках плана обмена мы можем указать условия, при которых объекты будут регистрироваться для выгрузки. Эти условия могут включать отбор по организации.
Как это работает:
Источник.Организация <> &ОрганизацияДляИсключения.&ОрганизацияДляИсключения будет определяться на уровне узла обмена.Сначала выполняются Правила регистрации по свойствам объекта (ПРОБ), затем Правила регистрации по свойствам плана обмена (ПРОП). Если объект не проходит отбор, установленный ПРОБ, то ПРОП не выполняются, и объект не регистрируется для выгрузки. Это очень мощный инструмент для гибкой и производительной фильтрации.
Соответствие версий и релизов: Мы должны убедиться, что правила обмена актуальны для используемых версий конфигураций УТ 10.3. При обновлении одной из баз, особенно если это были значительные изменения или переход на более новые платформы, может потребоваться обновление или пересоздание правил обмена.
Начальные данные и дубли: При первом обмене или пересоздании настроек обмена крайне важно убедиться в корректности начальных данных и избежать дублирования информации. Например, информацию об организациях, участвующих в обмене, следует ввести в обеих конфигурациях заранее, и данные в классификаторах справочника Номенклатура должны совпадать, чтобы избежать дубликатов.
Проверка и логирование: При возникновении ошибок обмена всегда проверяйте логи обмена. Они могут содержать детальную информацию о том, почему объект не был выгружен или загружен, или какая ошибка произошла при обработке данных.
Резервное копирование: Перед любыми изменениями в настройках обмена или правилах настоятельно рекомендуется сделать полную резервную копию обеих информационных баз, чтобы иметь возможность восстановить данные в случае возникновения проблем.
Параметры обмена данными в УТ10: В настройках учета конфигурации УТ10 (Сервис -> Настройка учета -> Настройка параметров учета -> вкладка "Обмен данными") необходимо установить флажок "Использовать обмен данными с конфигурациями на платформе 8.2" и задать префикс информационной базы. Это критически важные базовые настройки.
Флажки "Не запоминать выгруженные объекты" и "Выгружать объект (полностью), только при наличии на него ссылки" в ПКО:
Роли пользователей: Для пользователей, выполняющих обмен данными, мы должны добавить соответствующие роли: "Добавление и изменение обменов данными", "Выполнение обменов данными". Без этих ролей операции обмена будут недоступны или некорректны.
Мы рассмотрели различные подходы к фильтрации документов по организациям при онлайн-обмене между базами 1С:УТ10. Выбор конкретного метода зависит от сложности требований, версии платформы и конфигурации, а также от ваших предпочтений в части программного кодирования или декларативной настройки. В любом случае, мы должны тщательно протестировать выбранное решение перед внедрением в рабочую среду.