При настройке и доработке обменов между конфигурациями (например, между «Управление торговлей 10.3» и «Бухгалтерия предприятия 3.0») мы часто сталкиваемся с ситуацией, когда внесенные в правила конвертации изменения упорно игнорируются системой. Мы можем удалить реквизит в «Конвертации данных», обновить макет в конфигураторе, но при выгрузке данные все равно идут по старому сценарию.
В этой статье мы подробно разберем механизм хранения и версионирования правил обмена в 1С, выясним, почему правка макета не дает мгновенного результата, и рассмотрим алгоритм правильного обновления правил.
Рассмотрим типичную ситуацию, с которой столкнулся автор темы. Имеется односторонний обмен из УТ 10.3 в БП 3.0. После обновления Бухгалтерии изменилась структура метаданных (например, в документе «Требование-накладная» исчез табличный реквизит НоменклатурнаяГруппа). Чтобы избежать ошибок при загрузке, нам необходимо отключить передачу этого реквизита в правилах обмена.
Наши действия обычно выглядят так:
Казалось бы, все сделано верно. Однако при запуске обмена реквизит продолжает выгружаться, или возникает ошибка. Почему это происходит?
Чтобы понять причину, нам нужно разобраться в иерархии источников, откуда механизм обмена получает правила. В типовых решениях 1С существует система приоритетов.
Правила могут находиться в трех местах:
ПравилаДляОбменаДанными. Это основное место хранения рабочих правил. Когда мы настраиваем обмен в режиме «Предприятие», правила из макета конфигурации распаковываются и записываются в этот регистр в виде двоичных данных или XML-строки.Главный вывод: В момент выполнения обмена система читает правила из регистра сведений, а не напрямую из макета конфигурации. Изменив макет в Конфигураторе, мы обновили лишь «шаблон», но в регистре сведений осталась старая копия правил (кэш).
Чтобы наши изменения вступили в силу, нам необходимо принудительно обновить запись в регистре сведений. Разберем по шагам, как это сделать правильно.
Если мы внесли изменения именно в макет конфигурации и хотим, чтобы они применились, нам нужно выполнить процедуру обновления в режиме «1С:Предприятие».
ПравилаДляОбменаДанными (RulesForDataExchange).Нажатие этой кнопки запускает процедуру, которая берет макеты из структуры метаданных и перезаписывает содержимое ресурсов в регистре сведений. Только после этого шага обмен начнет использовать новую логику.
// Примерная логика работы кнопки обновления (псевдокод)
Процедура ОбновитьТиповыеПравила()
МакетПравил = ПолучитьОбщийМакет("ПравилаОбмена_УТ_БП");
ЗаписьРегистра = РегистрыСведений.ПравилаДляОбменаДанными.СоздатьМенеджерЗаписи();
ЗаписьРегистра.ВидОбмена = ...;
ЗаписьРегистра.ПравилаXML = МакетПравил; // Обновляем данные в БД
ЗаписьРегистра.Записать();
КонецПроцедуры
Более предпочтительный способ для доработанных правил — не трогать конфигурацию вообще. Это упрощает дальнейшее обновление типовой конфигурации, так как ваши правила не затрутся при обновлении релиза от поставщика.
Давайте посмотрим, как это сделать:
При этом действии система считает файл и сама запишет его содержимое в регистр ПравилаДляОбменаДанными, заменив типовые правила. При этом макет в конфигураторе останется типовым, а обмен будет работать по вашим правилам.
Если после обновления правил в регистре проблема сохраняется, давайте проверим следующие моменты:
1. Правила регистрации vs Правила конвертации
В современных обменах (на базе БСП) существуют два вида правил:
ПравилаКонвертации (ConversionRules) — описывают, КАК переносить данные (сопоставление полей).ПравилаРегистрации (RegistrationRules) — описывают, КАКИЕ данные регистрировать к обмену.Убедитесь, что вы обновляете именно тот комплект правил, который правили. В интерфейсе настройки обмена это обычно две разные кнопки загрузки.
2. Проверка версии правил в файле выгрузки
Чтобы удостовериться, что применяются именно новые правила, откройте сформированный файл обмена (Message_XX_XX.xml) в текстовом редакторе (например, Notepad++). В начале файла (в "шапке") обычно содержится информация о правилах.
<ПравилаОбмена>
<ВерсияФормата>2.01</ВерсияФормата>
<Id>...</Id>
<ДатаНачала>...</ДатаНачала>
<!-- Здесь можно поискать комментарий или дату создания правил -->
</ПравилаОбмена>
Если вы добавите в описание правил в «Конвертации данных» уникальный комментарий (например, "Версия с исправленным Требованием-накладной"), вы сможете увидеть его в XML-файле выгрузки и точно понять, применились правила или нет.
3. Кэширование на стороне сервера
В редких случаях, особенно в клиент-серверном варианте, сеанс может закэшировать старые данные. Если вы обновили правила в регистре, но результат прежний — попробуйте перезапустить фоновые задания или службу сервера 1С (в крайнем случае), либо просто перезайти в базу.
Процесс правки правил обмена в 1С всегда должен заканчиваться обновлением их в информационной базе. Порядок действий должен быть следующим:
Соблюдение этого алгоритма гарантирует, что обмен данными будет работать именно так, как вы задумали, и избавит от долгих поисков "фантомных" ошибок.