При работе с распределенными информационными базами (РИБ) программисты часто сталкиваются с необходимостью расширения типового функционала. Использование расширений кажется идеальным вариантом, так как позволяет оставить основную конфигурацию на поддержке. Однако добавление новых реквизитов в документы или табличные части через механизм расширений может привести к фатальным ошибкам, вплоть до полного прекращения работы программы (Access Violation) на периферийных узлах. Разберем подробно, почему это происходит и какие стратегии решения существуют.
Проанализируем ситуацию, возникшую в версии платформы 8.3.16. Основная проблема заключается в том, как 1С обрабатывает сериализацию данных при обмене. Когда мы добавляем реквизит в расширение, структура базы данных физически меняется: создаются дополнительные таблицы или поля. При обмене данными через РИБ используется механизм XDTO-сериализации.
Выясним причину "вылета" программы. Когда центральная база отправляет сообщение обмена, содержащее данные новых реквизитов из расширения, периферийная база должна быть готова к их приему. Если расширение на узле еще не обновилось или возникла ошибка в сопоставлении типов данных, платформа пытается записать значение в несуществующее (с точки зрения текущего сеанса) поле. В старых версиях платформы это вызывало не штатную ошибку записи, а критический сбой процесса.
Также важно учитывать ошибку 10214341, зарегистрированную разработчиками 1С. Суть её в том, что если структура плана обмена модифицируется расширениями, последующие изменения основной конфигурации могут перестать регистрироваться или отправляться. Это нарушает целостность всей распределенной системы.
Первым делом рассмотрим самый надежный способ — обновление платформы. Многие критические ошибки работы расширений в РИБ были исправлены в последующих релизах. Рассмотрим шаги по миграции:
8.3.16, рекомендуется переход на версию не ниже 8.3.18.1201 или актуальные релизы веток 8.3.20 и выше.Если обновление платформы невозможно или не помогает, разберем более консервативный, но стабильный подход. Несмотря на удобство расширений, механизм Data Extensions (расширение данных) в распределенных системах до сих пор считается менее стабильным, чем классическое изменение метаданных.
Выполним следующие действия для стабилизации системы:
ЗаказПокупателя).Преимущество этого метода: механизмы РИБ гарантированно умеют работать с реквизитами основной конфигурации. Это исключает ошибки десериализации и гарантирует регистрацию изменений в планах обмена.
Посмотрим на ситуацию со стороны типовых механизмов. Если конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП), для добавления полей можно использовать механизм "Дополнительные реквизиты и сведения".
Рассмотрим алгоритм реализации:
ДополнительныеРеквизиты, которая уже включена в состав планов обмена 1С.Пример программного обращения к доп. реквизитам в коде расширения может выглядеть так:
// Пример получения значения дополнительного реквизита
ЗначениеРеквизита = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаОбъект, "МойДополнительныйРеквизит");
Если вам критически важно использовать именно расширение с данными, проанализируем порядок его внедрения в РИБ. Автоматическая передача расширения через флаг Использовать в РИБ часто дает сбои.
Попробуем применить "ручной" метод синхронизации:
Использовать в РИБ..cfe через Конфигуратор (меню "Расширения" — "Сохранить расширение в файл").Этот метод позволяет избежать ситуации, когда данные приходят в базу раньше, чем структура метаданных успевает перестроиться через механизм автоматического обновления конфигурации расширений.
Для предотвращения подобных ситуаций в будущем, проанализируем несколько правил гигиены разработки в РИБ:
пр_СрокДоставки). Это спасет базу от краха, если в будущем разработчики 1С добавят реквизит с таким же именем в типовую конфигурацию.Таким образом, мы выяснили, что основной причиной вылетов является нестабильность платформы 8.3.16 при работе с XDTO-пакетами расширений. Наиболее эффективным решением остается либо обновление на стабильный релиз 8.3.18+, либо отказ от хранения данных в расширении в пользу основной конфигурации.