В современных конфигурациях «1С:Предприятие», таких как Управление торговлей 11.5, ERP 2.5 или Комплексная автоматизация, специалисты часто сталкиваются с системным сообщением: «Установка расширений, модифицирующих структуры данных, в фоновом задании запрещена». Эта ситуация особенно характерна для распределенных информационных баз (РИБ), когда изменения из главного узла приходят в подчиненный.
В данной статье мы подробно разберем, почему возникает эта блокировка, как работают защитные механизмы платформы и какими способами можно корректно применить расширение, если оно затрагивает метаданные.
Начиная с версии платформы 8.3.15, компания 1С ужесточила контроль над целостностью данных. Если расширение не просто добавляет программный код, а модифицирует структуру таблиц базы данных (например, добавляет новые реквизиты в документы, новые справочники или регистры), его установка требует монопольной фиксации изменений в словаре базы данных.
Проанализируем ситуацию: когда обмен данными в РИБ запускается регламентным (фоновым) заданием, система работает в неинтерактивном режиме. В этот момент платформа блокирует любые операции, которые могут привести к непредсказуемому изменению кэша конфигурации или структуры таблиц, так как это может прервать работу других активных пользователей. Свойство расширения ИзменяетСтруктуруДанных в этот момент принимает значение Истина, что и вызывает исключение при попытке записи.
Рассмотрим наиболее простое и эффективное решение, предложенное участниками профессионального сообщества. Если автоматический обмен через Библиотеку стандартных подсистем (БСП) выдает ошибку, нам необходимо перевести процесс в интерактивное русло.
Выполним следующие шаги:
В этом случае обмен запускается в контексте текущего сеанса пользователя. Платформа распознает сеанс как интерактивный, что позволяет ей выдать необходимые предупреждения и корректно завершить обновление конфигурации базы данных, даже если расширение меняет структуру метаданных. Это обходит ограничение на фоновое выполнение.
В конфигурациях на базе БСП предусмотрен механизм «отложенного обновления». Посмотрим, как это работает в контексте расширений. Когда расширение поступает в базу, система может пометить его как требующее установки. Вместо того чтобы пытаться «взломать» запрет на фоновую установку, мы можем дождаться момента, когда администратор войдет в систему.
При входе пользователя с правами Администратор система проанализирует наличие обновлений и предложит завершить установку расширений. Важно убедиться, что в настройках синхронизации не стоит принудительное завершение при ошибках метаданных. Мы рекомендуем проверять состояние расширений в справочнике «Управление расширениями», где можно вручную активировать пришедшие изменения.
Если вы разрабатываете собственную систему обновления или модифицируете существующий механизм обмена, мы рекомендуем добавить проверку свойств расширения перед его записью. Это позволит избежать аварийного завершения фонового задания и записать понятное сообщение в журнал регистрации.
Рассмотрим пример кода для анализа свойств расширения:
// Получаем расширение из файла или потока
РасширениеОбъект = РасширенияКонфигурации.Создать();
// ... загрузка данных в объект ...
// Проверяем, не нарушаем ли мы правила платформы
Если РасширениеОбъект.ИзменяетСтруктуруДанных И ЭтоФоновоеЗадание() Тогда
ЗаписатьВЖурналРегистрации("Обновление.Ошибка",
УровеньЖурналаРегистрации.Ошибка, , ,
"Невозможно установить расширение '" + РасширениеОбъект.Имя + "' в фоновом задании, так как оно меняет структуру данных.");
Возврат;
КонецЕсли;
РасширениеОбъект.Записать();
Метод ЭтоФоновоеЗадание() позволяет определить контекст исполнения, а свойство ИзменяетСтруктуруДанных подскажет, содержит ли расширение новые реквизиты или объекты.
Если нам требуется полная автоматизация без участия пользователя, но фоновое задание не подходит, мы можем использовать запуск сеанса через планировщик задач операционной системы. В этом случае запускается полноценный клиент 1С:Предприятие, который не является фоновым заданием с точки зрения ограничений платформы.
Для обновления конфигурации и применения расширений можно использовать параметры запуска:
/UpdateDBCfg — для обновления конфигурации базы данных./Execute с указанием внешней обработки, которая выполнит команду РасширенияКонфигурации.Записать() в обычном сеансе.Чтобы минимизировать возникновение подобных проблем в будущем, разберем стратегию разделения логики. Опытные разработчики рекомендуют разделять функционал на два типа расширений:
Проанализируем ситуацию: если мы вынесем данные в отдельный пакет, то будем точно знать, что его обновление требует монопольного доступа или интерактивного запуска. Это позволит основной части системы (логике) обновляться максимально быстро и незаметно для пользователей, в то время как «тяжелые» изменения структуры будут применяться строго по регламенту в часы обслуживания базы.
Важный нюанс: также убедитесь, что для расширений, требующих работы с данными, отключен Безопасный режим, если это необходимо для выполнения определенных операций в коде, хотя напрямую на возможность фоновой установки структурных изменений это не влияет.