При сопровождении сложных систем, таких как решения для автоматизации складов (WMS), мы часто сталкиваемся с необходимостью изменения типовых механизмов обмена данными. Одним из ключевых объектов в таких системах является XDTO-пакет (например, WMSMobile), который описывает структуру сообщений между сервером и мобильными терминалами. Правильный перенос измененного пакета в расширение позволяет сохранить конфигурацию на поддержке и упростить процесс будущих обновлений. В этой статье мы подробно разберем, как выполнить этот перенос, избежать ошибок синхронизации и правильно настроить права доступа.
Рассмотрим ситуацию: у нас есть основная конфигурация, в которой пакет WMSMobile уже был изменен (добавлены новые типы или свойства). Мы хотим перенести эти изменения в расширение. Основная сложность заключается в том, что при простом «заимствовании» объекта платформа 1С пытается сопоставить внутренние идентификаторы (UUID) и структуру пакета. Если пакет в основной конфигурации уже значительно отличается от того, что ожидает расширение, или если расширение переносится между разными базами, возникает ошибка «различны объекты».
Проанализируем причины этой ошибки:
Target Namespace. Если в системе одновременно присутствуют два пакета с одинаковым URI (в основной конфигурации и в расширении), возникает неопределенность.Этот способ считается наиболее надежным для «очистки» основной конфигурации и перехода на расширение. Разберем его по шагам:
Шаг 1. Перенос объекта. Откроем дерево метаданных основной конфигурации и расширения. Используя механизм drag-and-drop (удерживая клавишу Ctrl) или обычное копирование, перенесем пакет WMSMobile в ветку XDTO-пакетов расширения. Важно, чтобы имя и URI пространства имен полностью совпадали с оригиналом.
Шаг 2. Проверка связей. Нам необходимо убедиться, что все типы данных, на которые ссылается пакет (если они внешние), также доступны в расширении. Если пакет использует типы других пакетов, их также придется заимствовать.
Шаг 3. Удаление из основной конфигурации. После того как мы убедились, что пакет в расширении работоспособен, удалим его из основной конфигурации. Это критически важный момент: наличие двух одинаковых пакетов (по URI) может привести к непредсказуемому поведению ФабрикаXDTO.
Шаг 4. Тестирование применимости. После удаления выполним команду «Конфигурация — Расширения конфигурации — Проверка возможности применения». Если пакет использовался в программном коде основной конфигурации, платформа может выдать предупреждения. В этом случае нам потребуется также перенести в расширение и программные модули, обращающиеся к этому пакету.
Если мы сталкиваемся с ошибкой «различны объекты» при переносе между разными базами, рассмотрим более «чистый» технически способ — использование файлов схем. Выясним, как это помогает:
WMSMobile и выберем пункт «Выгрузить в файл...». Сохраним схему в формате .xsd.Этот метод гарантирует, что структура типов будет идентичной, а платформа самостоятельно перестроит дерево объектов в соответствии со схемой, что часто решает проблемы несовместимости версий платформы.
Поскольку пакет WMSMobile напрямую связан с мобильной платформой, нужно учитывать нюансы кэширования. Мобильное приложение кэширует XDTO-схему при первом подключении к серверу. Рассмотрим риски: если вы изменили пакет в расширении, но не обновили конфигурацию мобильного приложения или не очистили кэш на устройстве, вы получите ошибку десериализации при попытке обмена данными.
Рекомендация: При любых изменениях в структуре пакетов XDTO для мобильных устройств обязательно выполняйте принудительное обновление мобильного рабочего места.
Часто перенос пакета требует и настройки прав доступа. В процессе обсуждения выяснилось, что стандартное обращение к ролям через Метаданные.Роли в расширении работает не так, как в основной конфигурации. Проанализируем правильный подход.
Если вам нужно программно добавить роль из расширения пользователю, код Пользователь.Роли.Добавить(Метаданные.Роли.МояРольИзРасширения) может вернуть ошибку, так как коллекция Метаданные.Роли видит только объекты основной базы. Выясним, как обратиться к метаданным расширения правильно:
// Получаем доступ к метаданным конкретного расширения
РасширениеWMS = Метаданные.Расширения.Найти("ИмяВашегоРасширения");
Если РасширениеWMS <> Неопределено Тогда
РольОбъекта = РасширениеWMS.Метаданные.Роли.ИмяРоли;
// Дальнейшая работа с ролью
КонецЕсли;
Также стоит помнить о Библиотеке Стандартных Подсистем (БСП). Если в вашей конфигурации используется подсистема управления доступом, то роль из расширения не появится в справочнике «Профили групп доступа» автоматически. Рассмотрим действия для регистрации роли:
/С ЗапуститьОбновлениеИнформационнойБазы или через соответствующие обработки в составе БСП.ПриЗаполненииПоставляемыхРолей, чтобы система «увидела» новые права.Рассмотрим ситуацию, которая возникнет при следующем обновлении типовой конфигурации от поставщика. Поскольку мы удалили пакет WMSMobile из основной конфигурации, при сравнении и объединении система увидит, что объект отсутствует в нашей базе, но есть в новом релизе поставщика. 1С предложит его добавить.
Как поступить правильно:
В заключение отметим, что перенос сложных объектов в расширение — это процесс, требующий внимательности к деталям: от UUID и пространств имен до кэша мобильных устройств и регистрации ролей в БСП. Следуя приведенным шагам, мы сможем создать стабильную и легко обновляемую систему.