Часто возникает ситуация, когда в рамках одной конфигурации 1С настроено несколько синхронизаций с разными базами, но все они используют один и тот же универсальный план обмена, например, СинхронизацияДанныхЧерезУниверсальныйФормат. Проблема заключается в том, что при изменении правил регистрации для одного узла обмена эти изменения автоматически применяются ко всем остальным. Это происходит потому, что они используют общий модуль менеджера регистрации.
Проанализируем ситуацию: нам нужно, чтобы для одного узла (например, синхронизации с "Бухгалтерией предприятия") действовали одни правила выгрузки объектов, а для другого (например, с "Розницей") — совершенно другие. При этом создавать новый план обмена нецелесообразно. Давайте вместе разберемся, как элегантно решить эту задачу, не внося кардинальных изменений в конфигурацию.
Основная идея заключается в том, чтобы "научить" правила регистрации различать, для какого именно узла они сейчас выполняются. Мы сделаем это, добавив специальный признак в сам узел плана обмена и настроив отбор по этому признаку в правилах конвертации. Разберем по шагам.
Добавляем реквизит в план обмена
Первым делом нам нужно создать тот самый признак, по которому мы будем различать узлы. Для этого в режиме конфигуратора откроем нужный план обмена (в нашем примере это СинхронизацияДанныхЧерезУниверсальныйФормат) и добавим ему новый реквизит. Назовем его, например, ВариантНастройки с типом "Строка". Этот реквизит будет служить идентификатором для применения особого набора правил.
Настраиваем узлы обмена в пользовательском режиме
Теперь, когда у планов обмена появился новый реквизит, нам нужно его заполнить для каждого узла, которому требуются особые правила. Запускаем 1С в режиме "Предприятие".
Переходим в настройки синхронизации данных и открываем параметры нужного узла. В его форме мы увидим наш новый реквизит ВариантНастройки. Заполним его уникальным значением. Например, для узла обмена с Бухгалтерией укажем значение "ОбменУПБП". Для другого узла, которому нужны иные правила, можно указать "ОбменРозница" или оставить поле пустым, если для него должны работать правила по умолчанию.
Настраиваем отбор в правилах регистрации
Это ключевой шаг. Теперь в конфигурации "Конвертация данных" при редактировании правил регистрации объектов (ПРО) мы можем настроить отбор. Наша задача — указать, что определенное правило должно срабатывать только для тех узлов, у которых реквизит ВариантНастройки имеет нужное нам значение.
Например, мы хотим, чтобы некий документ не выгружался в базу "Бухгалтерия предприятия". Мы заходим в правило регистрации этого документа и настраиваем отбор. В отборе мы указываем, что правило применяется, если свойство плана обмена ВариантНастройки не равно значению "ОбменУПБП".
В выгруженном XML-файле правил это будет выглядеть следующим образом. Посмотрим на пример:
<ЭлементОтбора>
<ЭтоСтрокаКонстанты>trueЭтоСтрокаКонстанты>
<ТипСвойстваОбъекта>СтрокаТипСвойстваОбъекта>
<СвойствоПланаОбмена>ВариантНастройкиСвойствоПланаОбмена>
<ВидСравнения>НеРавноВидСравнения>
<СвойствоОбъекта>ОбменУПБПСвойствоОбъекта>
<ТаблицаСвойствПланаОбмена>
<Свойство>
<Наименование>ВариантНастройкиНаименование>
<Тип>СтрокаТип>
<Вид>РеквизитВид>
Свойство>
ТаблицаСвойствПланаОбмена>
ЭлементОтбора>
Рассмотрим подробнее, что здесь происходит. Этот блок кода говорит системе: "Применить это правило регистрации только в том случае, если у текущего узла плана обмена значение реквизита ВариантНастройки не равно строке 'ОбменУПБП'". Таким образом, для всех узлов, кроме нашего целевого, правило будет работать, а для узла с пометкой "ОбменУПБП" — нет. Это именно то, чего мы добивались.
<ЭтоСтрокаКонстанты>?В процессе анализа XML-файла правил может возникнуть вопрос о назначении тега <ЭтоСтрокаКонстанты>true</ЭтоСтрокаКонстанты>. Выясним причину его использования.
Этот тег является служебным и указывает обработчику правил, как именно интерпретировать значение, с которым происходит сравнение (в нашем примере это "ОбменУПБП").
Если установлено true: значение в теге <СвойствоОбъекта> воспринимается как константное, фиксированное строковое значение (литерал). То есть, система будет сравнивать значение реквизита ВариантНастройки именно со строкой "ОбменУПБП". Это наш случай.
Если установлено false (или тег отсутствует): значение в <СвойствоОбъекта> будет интерпретироваться как имя другого свойства (например, реквизита самого регистрируемого объекта). Система попыталась бы сравнить значение реквизита ВариантНастройки со значением другого поля, имя которого было бы "ОбменУПБП".
В интерфейсе "Конвертации данных" это обычно настраивается выбором: сравнивать свойство с полем "Значение" (что соответствует <ЭтоСтрокаКонстанты>true</ЭтоСтрокаКонстанты>) или с другим "Свойством".
Таким образом, мы добились гибкой настройки правил регистрации для разных узлов обмена, не создавая лишних планов обмена и используя стандартный механизм отборов в "Конвертации данных".
← К списку