Мы, как разработчики и администраторы систем на платформе 1С:Предприятие, регулярно сталкиваемся с необходимостью обновления конфигураций. Одним из наиболее удобных механизмов является динамическое обновление, позволяющее вносить изменения без прерывания работы пользователей. Однако, с переходом на определенные версии платформы, в частности, на 8.3.20.1613 и выше, мы обнаружили неожиданное изменение в поведении системы: даже незначительные изменения в модуле менеджера объекта (например, справочника или документа) стали требовать монопольного режима для обновления информационной базы. Давайте вместе разберем эту проблему, проанализируем наблюдения и гипотезы, а также рассмотрим возможные обходные пути.
Основная сложность, с которой мы столкнулись, заключается в следующем: после перехода с платформы 8.3.17 на 8.3.20.1613 (и, как показывают дальнейшие наблюдения, на более поздние версии, такие как 8.3.18.1334 и 8.3.27.1936) любое изменение в модуле менеджера объекта конфигурации приводит к невозможности динамического обновления. Вместо этого система настойчиво требует установить монопольный режим, что влечет за собой необходимость завершения работы всех пользователей.
Проанализируем ключевые наблюдения, сделанные пользователями, чтобы точнее определить условия возникновения этой ситуации:
СправочникМенеджер, ДокументМенеджер и т.д.). Изменения в модулях объекта (СправочникОбъект, ДокументОбъект), модулях форм или общих модулях по-прежнему позволяют выполнять динамическое обновление.Для того чтобы приблизиться к пониманию происходящего, рассмотрим несколько гипотез, основанных на наблюдениях и дополнительной информации о платформе 1С.
Одна из наиболее правдоподобных гипотез предполагает, что при сохранении изменений конфигурации под новой редакцией платформы (особенно версии 8.3.20 и выше), в режиме без совместимости, происходит внутренняя конвертация или адаптация структуры метаданных. Эта конвертация может быть связана с тем, что модули менеджера являются ключевыми элементами, отвечающими за взаимодействие с базой данных на уровне метаданных, и любые изменения в их коде могут затрагивать внутренние механизмы платформы по управлению объектами.
Рассмотрим подробнее, почему это может происходить:
Ключевым фактором, который постоянно упоминается в обсуждениях, является режим совместимости. Давайте проанализируем его влияние:
Версия 8.3.8), платформа 1С имитирует поведение более старой версии. Это означает, что многие новые механизмы и внутренние оптимизации, введенные в 8.3.20 и выше, остаются неактивными. Именно поэтому базы с включенным режимом совместимости не демонстрируют описанную проблему: старые механизмы работы с модулями менеджера и метаданными продолжают использоваться.Не используется полностью активирует все актуальные возможности текущей версии платформы. Это, с одной стороны, позволяет использовать весь потенциал платформы, но с другой — может вызывать непредвиденные побочные эффекты, если конфигурация не была полностью адаптирована к этим изменениям или если сама платформа имеет недокументированные особенности поведения. Мы видим, что именно в этом режиме проблема и проявляется.Динамическое обновление — это мощный, но ограниченный механизм. Мы знаем, что:
Проблема, затронувшая расширения, также важна. Исторически, обновление расширений могло требовать монопольного режима, если изменения затрагивали внутренние структуры. Например, в более поздних версиях платформы (8.3.22) появились специальные механизмы, позволяющие изменять параметры номеров и кодов объектов в расширениях без перевода конфигурации в монопольный режим. Это свидетельствует о том, что ранее подобные изменения (или изменения, влияющие на аналогичные внутренние механизмы) требовали монопольного доступа. Таким образом, наблюдаемое поведение с расширениями вполне укладывается в общую картину изменения требований платформы к монопольному режиму при работе с метаданными.
Учитывая отсутствие однозначного решения и официального объяснения от 1С, мы можем предложить несколько подходов и временных решений для минимизации негативного влияния данной проблемы:
Если в вашем случае проблема проявляется единожды (то есть, после первого изменения модуля менеджера объекта в базе без режима совместимости), то самым простым решением будет принять это требование и выполнить обновление в монопольном режиме однократно. После этого, дальнейшие изменения в том же модуле, скорее всего, будут обновляться динамически. Этот подход предполагает, что платформа действительно выполняет некую внутреннюю конвертацию или инициализацию метаданных, которая происходит только один раз.
Для выполнения такого обновления, убедитесь, что все пользователи вышли из системы. Затем обновите конфигурацию базы данных стандартным способом. После успешного обновления, вы сможете продолжить работу в обычном режиме.
Поскольку проблема не проявляется на базах с включенным режимом совместимости, как временный обходной путь мы можем включить режим совместимости для вашей информационной базы. Например, установите его в значение Версия 8.3.8 или другую версию, с которой гарантированно не возникает данной проблемы.
Чтобы изменить режим совместимости, выполните следующие шаги:
Конфигурация - Свойства конфигурации.Основные найдите поле Режим совместимости.Версия 8.3.8).Файл - Сохранить конфигурацию) и обновите конфигурацию базы данных (Конфигурация - Обновить конфигурацию базы данных).Важно: Этот метод является временным решением и имеет свои недостатки. Включение режима совместимости отключает новые возможности и оптимизации платформы, что может быть неприемлемо в долгосрочной перспективе. Кроме того, переход в режим совместимости может потребовать адаптации кода конфигурации, если он уже использует специфические функции новой платформы.
Если проблема возникает только для модулей менеджера основной конфигурации, вы можете попробовать перенести часть кода, не требующего прямого доступа к менеджеру объекта, в общие модули или расширения. Это позволит уменьшить частоту изменений в модулях менеджера, снижая тем самым вероятность требования монопольного режима.
Однако, как мы уже отметили, проблема может проявляться и при обновлении расширений. Поэтому этот метод может быть эффективен только в том случае, если изменения в общих модулях и расширениях (с соответствующим режимом совместимости) действительно позволяют динамическое обновление в вашем конкретном сценарии.
Рассмотрим пример, если бы код из модуля менеджера можно было бы переместить в общий модуль:
Допустим, у нас есть функция в модуле менеджера справочника:
// Модуль менеджера справочника "МойСправочник"
Функция ПолучитьНазваниеПоКоду(КодСправочника) Экспорт
Возврат ЭтотОбъект.НайтиПоКоду(КодСправочника).Наименование;
КонецФункции
Если эту функцию можно было бы перенести в общий модуль без потери функциональности, мы могли бы это сделать:
// Общий модуль "МоиПолезныеФункции"
Функция ПолучитьНазваниеСправочникаПоКоду(КодСправочника) Экспорт
Возврат Справочники.МойСправочник.НайтиПоКоду(КодСправочника).Наименование;
КонецФункции
Это уменьшило бы необходимость изменять непосредственно модуль менеджера, хотя в данном конкретном случае обращение к Справочники.МойСправочник все равно подразумевает взаимодействие с менеджером объекта. Однако, если речь идет о более сложных алгоритмах, не требующих прямого доступа к контексту менеджера, перенос кода может помочь.
В условиях неопределенности и отсутствия официальных решений, тщательное тестирование и документирование становятся вашими лучшими инструментами. При каждом изменении в модуле менеджера или обновлении платформы, фиксируйте, как система реагирует, требуется ли монопольный режим, и при каких условиях. Это поможет выявить закономерности, специфичные для вашей конфигурации и среды.
Особое внимание уделяйте проверке, не задеты ли случайно объекты или реквизиты, так как любое изменение структуры базы данных всегда требует монопольного режима. В некоторых случаях, даже если вы изменяете только код, платформа может посчитать, что это влияет на внутренние структуры.
В заключение, проблема с требованием монопольного режима при изменении модуля менеджера на платформе 1С:Предприятие 8.3.20 и выше, особенно в базах без режима совместимости, остается актуальной и во многом недокументированной. Она является следствием эволюции платформы и активации новых внутренних механизмов при отключении режима совместимости. Хотя универсального решения пока не найдено, понимание природы проблемы и использование предложенных обходных путей поможет нам более эффективно управлять обновлениями конфигураций и минимизировать простои в работе пользователей.