Почему возникает ошибка 'В текущем сеансе существуют изменяющие данные расширения конфигурации, неиспользуемые в распределенной информационной базе' при синхронизации РИБ и как ее исправить?
Мы начнем с исследования распространенной и критической ошибки, с которой сталкиваются разработчики и администраторы 1С при работе с Распределенными Информационными Базами (РИБ) и расширениями конфигурации: "В текущем сеансе существуют изменяющие данные расширения конфигурации, неиспользуемые в распределенной информационной базе." Это сообщение часто появляется во время синхронизации, вызывая недоумение у пользователей, которые считают, что их расширения не должны влиять на РИБ или не предназначены для репликации. Мы углубимся в корневые причины этой ошибки, рассмотрим шаги по диагностике и предложим эффективные решения, опираясь как на практический опыт, так и на возможности платформы 1С:Предприятие.
Почему возникает ошибка: "Расширение изменяет данные, не используемые в РИБ"
Рассмотрим подробнее суть проблемы. Ошибка "В текущем сеансе существуют изменяющие данные расширения конфигурации, неиспользуемые в распределенной информационной базе." возникает в ситуации, когда расширение конфигурации в центральной базе данных изменяет метаданные, то есть структуру данных информационной базы. Такие изменения могут включать добавление новых реквизитов, табличных частей, создание собственных справочников, документов или регистров сведений. Однако, при этом, либо само расширение не настроено для передачи в подчиненные узлы Распределенной Информационной Базы (РИБ), либо план обмена не включает синхронизацию расширений. Платформа 1С строго следит за консистентностью структуры данных во всех узлах РИБ. Если в центральной базе структура данных изменена расширением, которое отсутствует или отличается в периферийном узле, это приводит к несоответствию, которое платформа расценивает как критическую ошибку, препятствующую синхронизации. Даже если нам кажется, что расширение не должно отправляться в РИБ, если оно изменяет структуру данных, 1С будет требовать его наличия и соответствия во всех узлах или устранения влияния на структуру.
Такие изменения структуры данных могут проявляться по-разному. Разберем наиболее распространенные сценарии:
Добавление новых реквизитов к существующим объектам конфигурации (например, к справочнику "Номенклатура" или документу "Реализация товаров и услуг"). Даже если реквизит добавлен на форму, но при этом является реквизитом объекта конфигурации, он изменяет структуру данных.
Создание собственных объектов метаданных в расширении, таких как новые справочники, документы, регистры сведений или перечисления. Эти объекты хранят свои данные и, следовательно, изменяют общую структуру базы.
Изменение состава или свойств существующих объектов метаданных, например, добавление новых колонок в табличную часть существующего документа или изменение типа данных существующего реквизита.
Добавление нового реквизита на форму, который при этом был ошибочно создан как реквизит основного объекта формы, а не как чисто программный реквизит формы, не влияющий на данные. Именно такая ситуация, как мы выясним далее, произошла в нашей разбираемой теме на форуме.
Диагностика причины ошибки
Для эффективного решения проблемы, нам необходимо сначала точно определить, что именно в расширении вызывает изменение структуры данных. Разберем по шагам процесс диагностики, опираясь на логику развития обсуждаемой на форуме ситуации.
Проанализируйте сообщение об ошибке. Само сообщение "В текущем сеансе существуют изменяющие данные расширения конфигурации, неиспользуемые в распределенной информационной базе." прямо указывает на то, что расширение влияет на структуру данных. Это ключевой момент, который не следует игнорировать или списывать на "странности" платформы.
Проверьте ваше расширение на предмет изменений структуры данных. На первом этапе автор темы утверждал (Сообщение 4), что в расширении "нет там только в запросе соответствие по дате поставил", подразумевая отсутствие изменений структуры данных. Однако, эксперты на форуме сразу предположили (Сообщение 2), что "расширение содержит 'данные/объекты данных влияющие на структуру данных'". Это первое, что следует проверить.
Особое внимание уделите всем новым реквизитам, которые вы могли добавить в расширении. Проверьте реквизиты, добавленные как к объектам конфигурации (справочникам, документам), так и к формам. Иногда разработчики, добавляя реквизит на форму для визуализации, случайно создают его как реквизит основного объекта, что приводит к изменению структуры данных. Именно этот сценарий подтвердил автор в Сообщении 10: "Да действительно создал лишний реквизит на форме." Этот "лишний" реквизит, даже если он кажется чисто визуальным, если он является реквизитом основного объекта, приводит к изменению структуры данных и, как следствие, к реструктуризации базы.
Дополнительным индикатором того, что расширение влияет на структуру данных, может служить свойство "Назначение расширения конфигурации" (Сообщения 5, 6, 7, 8). Если вы попытаетесь изменить назначение расширения с "Адаптация" на "Дополнение", и платформа выдаст ошибку "невозможна смена назначения расширения если расширение влияет на структура данных" (Сообщение 8), это окончательно подтвердит факт изменения структуры данных. Расширения с назначением "Дополнение" по своей природе не должны вносить глубоких изменений в структуру, чтобы быть максимально совместимыми с обновлениями основной конфигурации и другими расширениями.
Используйте программные методы для проверки. Платформа 1С предоставляет способ программно определить, влияет ли расширение на структуру данных. Вы можете использовать метод ИзменяетСтруктуруДанных() объекта РасширениеКонфигурации. Например, в консоли запросов или через временную обработку вы можете выполнить следующий код:
Для Каждого РасширениеКонф Из Метаданные.Расширения Цикл
Если РасширениеКонф.ИзменяетСтруктуруДанных() Тогда
Сообщить("Расширение """ + РасширениеКонф.Имя + """ изменяет структуру данных.");
КонецЕсли;
КонецЦикла;
Этот код поможет вам быстро идентифицировать все расширения, которые влияют на структуру базы данных.
Как расширения влияют на структуру данных и РИБ
Чтобы глубже понять природу ошибки и способы её предотвращения, проанализируем, как расширения взаимодействуют со структурой данных и как это отражается на работе Распределённых Информационных Баз.
Расширение данных. С версии 8.3.11 платформа 1С предоставила разработчикам мощный инструмент: возможность расширять структуру хранимых данных конфигурации напрямую через расширения. Это означает, что мы можем добавлять свои собственные объекты (справочники, документы, регистры) или реквизиты к существующим объектам основной конфигурации, не снимая её с поддержки.
Реструктуризация базы данных. Любое изменение структуры данных, будь то добавление нового реквизита к существующему справочнику или создание нового объекта, требует реструктуризации базы данных. Если, например, расширение добавляет собственный реквизит к справочнику, для этого справочника может быть создана отдельная таблица с новой структурой, и данные будут перенесены из старой таблицы. При загрузке такого расширения в базу, если оно изменяет структуру данных, автоматически выполняется реструктуризация, что зачастую требует монопольного режима работы с информационной базой.
Константа "ЗагрузитьРасширенияИзменяющиеСтруктуруДанных". Когда в файле обмена РИБ (или при первоначальной загрузке) обнаруживаются изменения расширений, затрагивающие структуру данных, платформа 1С устанавливает специальную константу ЗагрузитьРасширенияИзменяющиеСтруктуруДанных. Эта константа служит сигналом для пользователя о необходимости загрузить расширения в монопольном режиме. Пока эта константа установлена, система не позволит выполнить выгрузку данных, сигнализируя, что приём расширений, изменяющих структуру, не был корректно завершен или подтвержден.
Синхронизация расширений в РИБ. С версии 8.3.12 платформа 1С реализовала механизм обмена расширениями в РИБ на уровне платформы. Для того чтобы расширения автоматически передавались в подчиненные узлы РИБ, необходимо выполнить два ключевых условия:
Для соответствующего плана обмена должно быть включено свойство "Включать расширения конфигурации".
В самом расширении должна быть установлена галочка "Используется в распределенной ИБ".
Если эти условия не соблюдены, а расширение изменяет структуру данных, то периферийные узлы не получат обновленную структуру, что приведет к ошибкам синхронизации.
Проблемы с синхронизацией данных расширений. Важно понимать, что автоматическая передача самих расширений (то есть их метаданных) не всегда гарантирует автоматическую синхронизацию данных, которые были добавлены этими расширениями (например, записей в новые справочники или регистры сведений, созданные в расширении). Для обеспечения полной синхронизации данных, добавленных расширениями, часто требуется заимствовать в расширение типовые подписки на события типа "РегистрацияПолный*" для соответствующих объектов и настроить их состав, чтобы они регистрировали изменения новых данных для обмена. Без этого данные могут не попадать в периферийные узлы.
Возможные пути решения проблемы
После того как мы выявили, что расширение действительно изменяет структуру данных и поняли механизмы, приводящие к ошибке, рассмотрим конкретные пути решения этой проблемы. Выбор оптимального решения зависит от того, является ли изменение структуры данных целесообразным и необходимым для всей РИБ, или оно было ошибкой/нужно только локально.
Исключить изменение структуры данных из расширения.
Этот путь является наиболее прямым, если изменение структуры данных, внесённое расширением, было случайным или не является критически важным для работы системы в целом. В нашем случае (Сообщение 10), автор обнаружил, что создал "лишний реквизит на форме", который на самом деле был реквизитом объекта. Если этот реквизит не является обязательным для хранения данных и не используется в логике, требующей его синхронизации, то его следует удалить или переделать.
Если реквизит был добавлен на форму и предназначался только для временного хранения или отображения, не сохраняемого в базе данных, его следует создать как реквизит формы, а не как реквизит объекта. Реквизиты формы не влияют на структуру базы данных и, следовательно, не вызовут проблем с РИБ. Для этого при создании реквизита в расширении убедитесь, что его свойство "Путь к данным" не указывает на объект конфигурации.
Шаги по исправлению:
Откройте расширение в конфигураторе.
Найдите реквизиты, добавленные к объектам или формам, которые влияют на структуру данных.
Если реквизит был ошибочно создан как реквизит объекта, но по сути является временным или визуальным, удалите его и создайте заново как реквизит формы, не связанный с данными.
Если изменение структуры данных не требуется вовсе, просто удалите этот объект/реквизит из расширения.
После внесения изменений, обновите конфигурацию базы данных и перезапустите 1С в монопольном режиме, чтобы изменения в расширении вступили в силу и база данных реструктуризировалась, если это необходимо.
Этот подход позволяет сохранить расширение, не требуя его синхронизации в РИБ, так как оно перестает влиять на структуру данных.
Настроить расширение для синхронизации с РИБ.
Если изменения структуры данных, внесенные расширением, являются необходимыми и должны присутствовать во всех узлах Распределенной Информационной Базы, то правильным решением будет настроить расширение на синхронизацию с РИБ.
Шаги по настройке:
В конфигураторе откройте расширение.
Перейдите к свойствам расширения и установите флажок "Используется в распределенной ИБ". Этот флажок указывает платформе, что данное расширение должно быть частью обмена в РИБ.
Откройте Планы обмена, которые используются для вашей РИБ.
Для каждого соответствующего плана обмена перейдите к его свойствам и установите флажок "Включать расширения конфигурации". Это гарантирует, что метаданные расширений будут передаваться в узлы РИБ при синхронизации.
После этих изменений, необходимо выполнить полную синхронизацию данных или создать новый начальный образ для периферийных узлов, чтобы гарантировать, что все узлы имеют идентичную структуру данных, включая изменения, внесенные расширением.
Важно помнить, что даже если расширение будет синхронизироваться, для синхронизации данных, которые хранятся в объектах, добавленных расширением, может потребоваться дополнительная настройка путем заимствования подписок на события регистрации изменений.
Отключить расширение (если оно не нужно в периферийных узлах и его изменения не критичны).
Если расширение меняет структуру данных, но его функционал и данные не требуются в периферийных узлах, и вы не хотите его удалять полностью (например, чтобы сохранить данные, добавленные им в центральной базе), вы можете его отключить.
Как отключить:
В конфигураторе или в режиме "Предприятие" (через "Все функции" -> "Стандартные" -> "Управление расширениями конфигурации") найдите нужное расширение.
Снимите флажок "Активно" для этого расширения.
Важно: При отключении расширения данные, которые хранились в структурах, добавленных этим расширением, не будут удалены, но станут недоступны для использования в прикладном решении. Если после отключения проблема синхронизации сохраняется, это может означать, что платформа все еще "помнит" о старых изменениях, или что есть другие расширения, влияющие на структуру данных. В таком случае, возможно, потребуется более глубокая диагностика или удаление расширения.
Проверить назначение расширения.
Мы уже упоминали об этом в разделе диагностики, но стоит ещё раз подчеркнуть важность правильного выбора назначения расширения:
"Адаптация" – это более широкое назначение, которое позволяет вносить значительные изменения, в том числе влияющие на структуру данных и использовать "опасные" аннотации, как "Вместо". Такие расширения часто тесно связаны с конкретной версией основной конфигурации.
"Дополнение" – это более ограниченное назначение, предназначенное для добавления новой функциональности, которая должна быть максимально независимой от основной конфигурации и корректно работать при её обновлении. Расширения с назначением "Дополнение" не должны влиять на структуру данных.
Если ваше расширение изменяет структуру данных, но ему присвоено назначение "Дополнение", это может быть внутренним конфликтом, который, хотя и не всегда напрямую вызывает ошибку РИБ, указывает на неверный подход к разработке и потенциальные проблемы в будущем. Если расширение должно влиять на структуру, оно должно быть "Адаптацией". Если нет, то следует устранить влияние на структуру.
Общие рекомендации и важные аспекты
Для минимизации рисков при работе с расширениями и РИБ, мы всегда должны придерживаться следующих практических советов.
Создавайте резервные копии. Перед любыми изменениями в конфигурации или расширениях, особенно если они затрагивают структуру данных или работу РИБ, обязательно создавайте полную резервную копию информационной базы. Это ваша "подушка безопасности" на случай непредвиденных проблем.
Проверяйте соответствие версий платформы и конфигурации. Иногда проблемы с РИБ или расширениями могут быть вызваны несоответствием версий платформы 1С и типовой конфигурации, особенно если последняя работает в старом режиме совместимости. Убедитесь, что все компоненты обновлены до актуальных и совместимых версий.
Пересоздание начального образа РИБ. В особо сложных случаях, когда после многочисленных попыток исправить ошибки синхронизации РИБ с расширениями проблема не решается, может потребоваться более радикальный шаг: отвязка базы от РИБ, загрузка актуальной конфигурации из центральной базы (убедившись, что она содержит все необходимые расширения и их настройки), а затем повторное подключение базы к РИБ с созданием нового начального образа. Это гарантирует полную синхронизацию структуры и метаданных.
Тщательно тестируйте изменения. Любые изменения в расширениях, влияющие на структуру данных или предназначенные для работы в РИБ, должны проходить тщательное тестирование на тестовых базах перед внедрением в продуктивную среду.