Как исключить документы определенных организаций при онлайн-обмене между базами 1С:Управление торговлей 10?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с распределенными информационными базами или при обмене данными между различными конфигурациями 1С:Управление торговлей 10 (УТ10) часто возникает необходимость в фильтрации выгружаемых данных. Одна из типичных задач – исключить документы, относящиеся к определенным организациям, из процесса обмена, особенно при использовании онлайн-обмена. Рассмотрим, как мы можем решить эту проблему, используя различные подходы.

Наша задача состоит в том, чтобы настроить обмен данными таким образом, чтобы документы по четырем организациям из исходной базы УТ10 переносились в целевую базу УТ10, имеющую три организации, но при этом документы по одной или нескольким ненужным организациям не выгружались совсем. Ситуация усложняется тем, что при использовании универсальной обработки выгрузки данных (например, V8Exchan82.epf) отбор по организациям работает, а вот при штатном онлайн-обмене – нет.

Мы проанализируем несколько подходов к решению этой проблемы, начиная от модификации правил обмена и заканчивая использованием подписок на события.

1. Фильтрация данных непосредственно в правилах обмена

Один из самых распространенных способов управления выгрузкой данных – это модификация правил конвертации объектов (ПКО) или правил конвертации наборов данных (ПКГС) в конфигурации «Конвертация данных». Мы можем добавить логику, которая будет проверять организацию документа и отменять его выгрузку при совпадении с нежелательной организацией.

Суть метода: Добавить условие в событие ПриВыгрузке или ПередВыгрузкой соответствующего объекта (например, документа), которое установит параметр Отказ = Истина, если документ принадлежит организации, которую мы хотим исключить.

Пример кода:

В правилах обмена, в событии ПриВыгрузке для нужного документа (например, "Реализация товаров и услуг"), мы можем написать следующий код:


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

// Автор пробовал такой код (для включения, а не исключения):
// Если (Параметры.Организация <> Объект.Организация) Тогда
//     Отказ = Истина;
// КонецЕсли;

// Адаптируем для исключения:
// Определим организацию, которую мы хотим исключить из обмена.
// Мы можем получить ее из параметра обмена, константы или задать явно.
// Например, используем параметр, который мы настроим в узле обмена или в форме обработки
// V8Exchan82.epf, если вы используете ее для настройки правил.
// Допустим, параметр в правилах называется "ИсключаемаяОрганизация".

Если ЗначениеЗаполнено(Параметры.ИсключаемаяОрганизация) Тогда
    Если Объект.Организация = Параметры.ИсключаемаяОрганизация Тогда
        Отказ = Истина; // Отменяем выгрузку документа, если его организация совпадает с исключаемой
    КонецЕсли;
КонецЕсли;

// Или, если нам нужно исключить несколько организаций, мы можем использовать список:
// Допустим, Параметры.СписокИсключаемыхОрганизаций - это массив или список значений
// с организациями, которые необходимо исключить.
// Если Параметры.СписокИсключаемыхОрганизаций.Найти(Объект.Организация) <> Неопределено Тогда
//     Отказ = Истина;
// КонецЕсли;

Как это работает:

  1. При выгрузке каждого объекта (документа) система вызывает событие ПриВыгрузке.
  2. Внутри этого события мы получаем доступ к текущему объекту через переменную Объект (например, документ "Реализация товаров и услуг") и к его реквизитам, таким как Объект.Организация.
  3. Мы сравниваем организацию документа с той, которую мы хотим исключить. Эту исключаемую организацию мы можем передать как параметр обмена (Параметры.ИсключаемаяОрганизация).
  4. Если организации совпадают, мы устанавливаем переменную Отказ = Истина. Это указывает системе конвертации данных, что текущий объект не должен быть выгружен.

Важно: Убедитесь, что параметр ИсключаемаяОрганизация (или аналогичный) корректно настроен и передается в правила обмена. Если вы используете обработку V8Exchan82.epf для запуска правил, то параметры могут быть заданы на вкладке "Настройка" или "Параметры обмена".

2. Использование подписок на события для управления регистрацией изменений

В случае онлайн-обмена (когда изменения автоматически регистрируются и выгружаются) проблема часто заключается не в самих правилах конвертации, а в механизме регистрации изменений для планов обмена. Если объект зарегистрирован для выгрузки, он попадет в обмен. Чтобы исключить объекты определенных организаций, мы можем управлять этой регистрацией на уровне платформы с помощью подписок на события.

Суть метода: Создать подписку на событие ПриЗаписи для всех типов объектов, которые мы хотим фильтровать (например, всех документов). В обработчике этой подписки мы будем проверять организацию записываемого объекта и, в зависимости от нее, регистрировать или не регистрировать его для обмена, или даже удалять уже существующую регистрацию.

Пример кода для подписки на событие:

Создадим новую подписку на событие в конфигураторе (раздел "Общие" -> "Подписки на события").

  1. Имя: Например, "УправлениеРегистрациейИзмененийДляОбмена".
  2. Событие: Выбираем "ПриЗаписи" для всех нужных объектов (например, "Документ.РеализацияТоваровУслуг", "Документ.ПоступлениеТоваровУслуг" и т.д., или даже для всех документов, если это приемлемо).
  3. Обработчик: Создадим новый модуль общего назначения (например, "УправлениеОбменомМодуль") и в нем экспортную процедуру, например, "ПриЗаписиДокументаУправлениеОбменом".

В модуле "УправлениеОбменомМодуль" мы реализуем следующую процедуру:


Процедура ПриЗаписиДокументаУправлениеОбменом(Источник, Отказ) Экспорт
    // Не обрабатываем объекты, которые приходят через обмен,
    // чтобы избежать циклических вызовов и некорректной логики.
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    // Определяем узел обмена, для которого мы хотим управлять регистрацией.
    // Замените "КодВашегоУзлаОбмена" на актуальный код вашего узла плана обмена.
    // Например, "001" или "УзелДляОбменаСДругойБазой".
    УзелОбмена = ПланыОбмена.НайтиПоКоду("КодВашегоУзлаОбмена");

    Если УзелОбмена = Неопределено Тогда
        // Узел обмена не найден, возможно, ошибка или обмен не настроен.
        Возврат;
    КонецЕсли;

    // Определим организацию или список организаций, которые мы хотим ИСКЛЮЧИТЬ из обмена.
    // Это может быть ссылка на элемент справочника "Организации",
    // или список значений, если организаций несколько.
    // Для примера, используем жестко заданный код организации.
    ИсключаемаяОрганизацияКод = "000000001"; // Замените на реальный код организации, которую нужно исключить.

    // Получаем текущую организацию документа. Предполагаем, что у документов есть реквизит "Организация".
    ОрганизацияДокумента = Неопределено;
    Попытка
        ОрганизацияДокумента = Источник.Организация;
    Исключение
        // У объекта нет реквизита "Организация", пропускаем его.
        Возврат;
    КонецПопытки;

    // Если организация документа совпадает с исключаемой, то мы НЕ регистрируем его.
    // Более того, если он уже был зарегистрирован (например, до изменения его организации),
    // мы удаляем эту регистрацию.
    Если ОрганизацияДокумента.Код = ИсключаемаяОрганизацияКод Тогда
        ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Источник);
    Иначе
        // Если организация документа НЕ совпадает с исключаемой,
        // то регистрируем его для обмена стандартным образом.
        Если Источник.ПометкаУдаления Тогда
            ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Источник);
        Иначе
            ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Источник);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Как это работает:

  1. Каждый раз, когда какой-либо документ, включенный в подписку, записывается, вызывается наша процедура ПриЗаписиДокументаУправлениеОбменом.
  2. Процедура сначала проверяет, не происходит ли запись в результате загрузки данных через обмен, чтобы избежать рекурсии.
  3. Затем она определяет узел плана обмена, для которого нужно управлять регистрацией.
  4. Получив организацию из записываемого документа, она сравнивает ее с той, которую мы хотим исключить.
  5. Если организация документа является "исключаемой", то вызывается ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Источник). Это гарантирует, что даже если объект был ранее зарегистрирован для обмена, его регистрация будет снята.
  6. Если же организация документа не подпадает под исключение, то объект регистрируется для обмена с помощью ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Источник).

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

3. Правила регистрации объектов (ПРОБ/ПРОП)

В более современных механизмах обмена данными (например, на основе "Конвертации данных 2.0" и выше, которые могут использоваться и для УТ10.3 при определенных настройках), существуют декларативные "Правила регистрации объектов" (ПРОБ и ПРОП). Они позволяют настраивать фильтрацию объектов прямо на узлах планов обмена без программного кода в модулях.

Суть метода: В настройках плана обмена мы можем указать условия, при которых объекты будут регистрироваться для выгрузки. Эти условия могут включать отбор по организации.

Как это работает:

  1. Откройте конфигуратор, перейдите к нужному плану обмена.
  2. Возможно, потребуется редактирование правил регистрации.
  3. В рамках правил регистрации объектов можно указать выражения для отбора. Например, для документа можно задать условие: Источник.Организация <> &ОрганизацияДляИсключения.
  4. Параметр &ОрганизацияДляИсключения будет определяться на уровне узла обмена.

Сначала выполняются Правила регистрации по свойствам объекта (ПРОБ), затем Правила регистрации по свойствам плана обмена (ПРОП). Если объект не проходит отбор, установленный ПРОБ, то ПРОП не выполняются, и объект не регистрируется для выгрузки. Это очень мощный инструмент для гибкой и производительной фильтрации.

Дополнительные важные рекомендации при настройке обмена УТ10-УТ10

  1. Соответствие версий и релизов: Мы должны убедиться, что правила обмена актуальны для используемых версий конфигураций УТ 10.3. При обновлении одной из баз, особенно если это были значительные изменения или переход на более новые платформы, может потребоваться обновление или пересоздание правил обмена.

  2. Начальные данные и дубли: При первом обмене или пересоздании настроек обмена крайне важно убедиться в корректности начальных данных и избежать дублирования информации. Например, информацию об организациях, участвующих в обмене, следует ввести в обеих конфигурациях заранее, и данные в классификаторах справочника Номенклатура должны совпадать, чтобы избежать дубликатов.

  3. Проверка и логирование: При возникновении ошибок обмена всегда проверяйте логи обмена. Они могут содержать детальную информацию о том, почему объект не был выгружен или загружен, или какая ошибка произошла при обработке данных.

  4. Резервное копирование: Перед любыми изменениями в настройках обмена или правилах настоятельно рекомендуется сделать полную резервную копию обеих информационных баз, чтобы иметь возможность восстановить данные в случае возникновения проблем.

  5. Параметры обмена данными в УТ10: В настройках учета конфигурации УТ10 (Сервис -> Настройка учета -> Настройка параметров учета -> вкладка "Обмен данными") необходимо установить флажок "Использовать обмен данными с конфигурациями на платформе 8.2" и задать префикс информационной базы. Это критически важные базовые настройки.

  6. Флажки "Не запоминать выгруженные объекты" и "Выгружать объект (полностью), только при наличии на него ссылки" в ПКО:

    • "Не запоминать выгруженные объекты": Этот флажок указывает системе конвертации данных, что она не должна сохранять информацию о том, какие объекты уже были выгружены. Это означает, что при каждом обмене объект будет рассматриваться как новый или измененный, и потенциально будет выгружен снова. Может быть полезен, если требуется принудительная повторная выгрузка объектов или если механизм отслеживания изменений работает некорректно.
    • "Выгружать объект (полностью), только при наличии на него ссылки": Этот флажок означает, что объект будет выгружен только в том случае, если на него есть ссылка из другого выгружаемого объекта. Например, если выгружается документ, а у него есть ссылка на контрагента, то контрагент будет выгружен. Если же контрагент существует сам по себе и на него нет ссылок из выгружаемых объектов, он не будет выгружен. Это помогает избежать выгрузки "лишних" справочных данных.
  7. Роли пользователей: Для пользователей, выполняющих обмен данными, мы должны добавить соответствующие роли: "Добавление и изменение обменов данными", "Выполнение обменов данными". Без этих ролей операции обмена будут недоступны или некорректны.

Мы рассмотрели различные подходы к фильтрации документов по организациям при онлайн-обмене между базами 1С:УТ10. Выбор конкретного метода зависит от сложности требований, версии платформы и конфигурации, а также от ваших предпочтений в части программного кодирования или декларативной настройки. В любом случае, мы должны тщательно протестировать выбранное решение перед внедрением в рабочую среду.

← На главную