Переход на новые версии технологической платформы «1С:Предприятие» часто преподносит сюрпризы разработчикам и администраторам баз данных. Одним из наиболее резонансных нововведений в версии 8.3.12 стало кардинальное изменение механизма работы с расширениями конфигурации, а именно появление свойства «Область действия» (Scope).
Это нововведение привело к возникновению неприятной тупиковой ситуации (так называемого «порочного круга»), когда рабочее расширение, созданное на платформе 8.3.11 и содержащее собственные структуры данных (например, регистры сведений или накопления), отказывается сохраняться после обновления платформы. При попытке применить изменения система выдает ошибки, блокирующие любую дальнейшую работу.
В этой статье мы подробно разберем, почему возникает этот конфликт, проанализируем внутренние механизмы платформы и рассмотрим три практических способа выхода из этой ситуации: как с полным сохранением накопленных в расширении данных, так и более простые методы для тестовых сред.
Начиная с версии 8.3.12, платформа поддерживает разделение расширений на уровне СУБД. Свойство расширения «Область действия» может принимать два значения:
Конфликт и невозможность сохранения расширения возникают из-за следующей последовательности проверок платформы:
ОбластьДанныхОсновныеДанные), у которого свойство «Разделение расширений конфигурации» установлено в значение Разделять, платформа принудительно и автоматически присваивает всем импортируемым или обновляемым расширениям область действия Разделение данных.Информационная база через свойства расширения в конфигураторе. Однако здесь срабатывает вторая проверка платформы, и мы получаем следующую ошибку: «Запрещено изменение области действия расширения при изменении структуры данных этим расширением». Платформа блокирует изменение области действия, так как внутри расширения уже физически существует созданный вами объект (например, собственный РегистрСведений), который меняет структуру таблиц СУБД.В результате мы получаем классический deadlock: сохранить расширение с областью Разделение данных нельзя, а изменить область на Информационная база невозможно из-за наличия регистра. Давайте разберем по шагам, как решить эту проблему.
Этот метод является наиболее предпочтительным для рабочих баз данных, так как он позволяет полностью сохранить структуру таблиц вашего расширения и все накопленные в них записи. Для реализации этого способа основная конфигурация должна находиться в режиме возможности изменения (быть снятой с поддержки или находиться на поддержке с сохранением изменений).
Рассмотрим этот процесс по шагам:
ОбластьДанныхОсновныеДанные или ОбластьДанныхВспомогательныеДанные).Разделять на Не использовать.F7 (или выбрав пункт меню Конфигурация -> Обновить конфигурацию базы данных).F7.Разделять. Повторно нажмите F7 для завершения процесса обновления.После выполнения этих действий область действия расширения будет жестко зафиксирована в значении Информационная база, все данные ваших регистров останутся в целости и сохранности, а база данных вернется к штатному режиму работы.
Если вы столкнулись с этой ошибкой на этапе разработки, тестирования или если данные внутри регистра сведений вашего расширения не представляют ценности (их можно легко перезаполнить), можно воспользоваться более быстрым деструктивным методом. Этот метод основан на том, что платформа разрешает свободно менять область действия у абсолютно пустых расширений.
Проанализируем этот алгоритм:
.cfe..cfe.F7). Платформа применит изменения, создаст физические таблицы для вашего регистра, сохранив при этом правильную область действия расширения.В некоторых случаях конфликт области действия провоцируется рассинхронизацией режимов совместимости основной конфигурации и самого расширения при переходе на новые релизы платформы. Платформа 1С очень чувствительна к этим параметрам.
Проанализируем ситуацию совместимости:
Не использовать, то и в свойствах расширения обязательно должен быть установлен аналогичный режим Не использовать.8.3.11, а расширение пытается работать без совместимости под управлением платформы 8.3.12 или более высокой, это гарантированно вызовет логический сбой при определении области действия расширения.Для исправления этой ситуации проверьте свойства совместимости в палитре свойств обоих объектов и приведите их к единому знаменателю. После выравнивания режимов совместимости попробуйте повторно выполнить шаги из Способа 1.
Чтобы обезопасить себя от подобных ситуаций при будущих обновлениях платформы, рекомендуется придерживаться нескольких правил при проектировании расширений, содержащих собственные структуры данных.
Во-первых, перед проведением любых обновлений платформы (особенно при переходе между минорными версиями, например с 8.3.11 на 8.3.12/8.3.13) обязательно делайте резервную копию базы данных (файл .dt или средствами СУБД MS SQL/PostgreSQL). Во-вторых, вы можете программно контролировать состояние ваших расширений и их свойства. Например, с помощью следующего кода можно быстро получить список активных расширений в режиме предприятия и проанализировать их параметры:
УстановленныеРасширения = РасширенияКонфигурации.Получить();
Для Каждого Расширение Из УстановленныеРасширения Цикл
ЗаписьЖурналаРегистрации("ПроверкаРасширений",
УровеньЖурналаРегистрации.Информация,
,
,
"Расширение: " + Расширение.Имя + " | Активно: " + Расширение.Активно);
КонецЦикла;
Если перед удалением расширения по Способу 2 вам крайне важно сохранить хотя бы текстовую часть данных из вашего регистра, вы можете временно выгрузить их в JSON или XML с помощью несложной обработки:
Запись = Новый ЗаписьJSON;
Запись.ОткрытьФайл("C:\temp\register_backup.json");
Выборка = РегистрыСведений.МойРегистрРасширения.Выбрать();
Пока Выборка.Следующий() Цикл
// Сериализуем данные в файл для последующего восстановления
Данные = Новый Структура("Код, Наименование, Значение");
ЗаполнитьЗначенияСвойств(Данные, Выборка);
ЗаписатьJSON(Запись, Данные);
КонецЦикла;
Запись.Закрыть();
Используя предложенные методики, вы сможете легко преодолеть «порочный круг» ограничений платформы 1С 8.3.12+ и успешно продолжить разработку и поддержку ваших конфигураций без потери важных бизнес-данных.