При активной разработке и поддержке интеграционных решений на базе конфигурации «1С:Конвертация данных 2.1» (КД 2.1) специалисты часто сталкиваются с проблемой «засорения» правил обмена. После очередного обновления метаданных баз источника и приемника в КД загружаются устаревшие реквизиты, табличные части и объекты. Согласно стандартам разработки фирмы «1С», перед полным удалением объекты переименовываются с добавлением префикса Удалить или Obsolete.
Эти устаревшие элементы приводят к ошибкам при проверке правил обмена, затрудняют визуальное восприятие структуры метаданных и замедляют процесс настройки. В данной статье мы подробно разберем, как избавиться от подобных объектов, проанализируем поведение встроенных механизмов КД 2.1 и рассмотрим альтернативные, более быстрые и безопасные способы очистки правил.
Давайте выясним причину появления таких объектов. Фирма «1С» использует строгий стандарт проектирования метаданных. При изменении архитектуры конфигурации разработчики не могут сразу физически удалить реквизит из метаданных, так как это приведет к безвозвратной потере данных у пользователей при первом же обновлении. Вместо этого применяется двухэтапный процесс:
Субконто превращается в УдалитьСубконто), а в его синониме указывается текст «(не используется)».Когда мы выгружаем описание структуры конфигурации с помощью обработок MD80Exp.epf или MD82Exp.epf и загружаем его в КД, эти временные реквизиты затягиваются в базу как полноценные свойства. В результате при сопоставлении правил система пытается работать с неактуальными данными, вызывая ошибки валидации.
Рассмотрим стандартный механизм, доступный непосредственно в конфигурации КД. Начиная с релиза 2.1.8.2, в составе конфигурации «Конвертация данных» присутствует встроенная обработка «Групповая обработка справочников и документов».
Выполним следующие шаги для настройки пометки на удаление устаревших элементов:
Конвертации, ПравилаКонвертацииСвойств (ПКС) или Свойства.Важная особенность работы обработки: участники обсуждения справедливо отмечают, что этот процесс может выполняться крайне медленно. Почему так происходит? Дело в том, что платформа выполняет глубокую проверку ссылочной целостности. Справочник Свойства подчинен справочнику Объекты, который, в свою очередь, подчинен справочнику Конфигурации. При попытке пометить элемент на удаление система рекурсивно обходит все связанные правила конвертации свойств (ПКС) и правила конвертации групп свойств (ПКГС). На простых элементах (например, неиспользуемых свойствах без связей) обработка «проскакивает влет», но при обработке перечислений или ключевых справочников процесс может затянуться на часы.
Физическое удаление или даже простая пометка на удаление объектов метаданных внутри КД может нарушить целостность структуры правил. Если на удаляемое свойство завязаны сложные алгоритмы или обработчики событий (например, «Перед выгрузкой», «При выгрузке»), вы получите «битые» ссылки и ошибки компиляции модуля выгрузки.
Проанализируем более безопасную альтернативу. В настройках каждого правила конвертации свойства (ПКС) предусмотрен специальный флаг «Отключить» (или «Отключить обработку данного правила»).
Если этот флаг установлен:
Чтобы не тратить часы на ожидание работы стандартной групповой обработки, мы можем воспользоваться консолью кода и написать простой программный скрипт. Этот скрипт точечно найдет все ПКС, связанные с устаревшими реквизитами, и взведет у них флаг Отключить. Поскольку при этом не запускается тяжелый механизм поиска ссылок платформы, операция займет всего несколько секунд.
Разберем пример кода для реализации этой задачи:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПКС.Ссылка КАК ПКС
|ИЗ
| Справочник.ПравилаКонвертацииСвойств КАК ПКС
|ГДЕ
| (ПОДСТРОКА(ПКС.СвойствоИсточника.Имя, 1, 7) = ""Удалить""
| ИЛИ ПОДСТРОКА(ПКС.СвойствоПриемника.Имя, 1, 7) = ""Удалить""
| ИЛИ ПОДСТРОКА(ПКС.СвойствоИсточника.Имя, 1, 8) = ""Obsolete""
| ИЛИ ПОДСТРОКА(ПКС.СвойствоПриемника.Имя, 1, 8) = ""Obsolete"")
| И ПКС.Отключить = ЛОЖЬ";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
НачатьТранзакцию();
Пока Выборка.Следующий() Цикл
ОбъектПКС = Выборка.ПКС.ПолучитьОбъект();
ОбъектПКС.Отключить = Истина;
ОбъектПКС.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
Как работает этот скрипт: мы выбираем из базы все ПКС, у которых имя свойства источника или приемника начинается со слов «Удалить» или «Obsolete», и которые еще не отключены. Затем в транзакции быстро обходим выборку, устанавливаем свойство Отключить в значение Истина и записываем изменения. Использование транзакции позволяет существенно ускорить запись объектов в базу данных.
Если вам все же необходимо именно физически удалить неиспользуемые правила и свойства из базы КД, рекомендуется использовать специализированные внешние обработки, созданные сообществом разработчиков «1С».
Среди них можно выделить инструменты со следующим функционалом:
Мы подробно разобрали проблему очистки правил от устаревших объектов в «1С:Конвертация данных 2.1». Подведем итог и определим оптимальную стратегию работы: