При активной разработке в расширениях конфигурации программисты часто сталкиваются с необходимостью добавления собственных объектов метаданных, таких как РегистрыНакопления. Однако попытка добавить такой объект может закончиться ошибкой: "Использование регистров накопления в расширениях недопустимо в режиме совместимости 8.3.12 и ниже". В этой статье мы подробно разберем, какие технические требования предъявляет платформа к таким задачам, как правильно настроить окружение и какие риски следует учитывать при хранении данных в расширениях.
Для начала проанализируем ситуацию, с которой сталкивается разработчик. Даже если на сервере установлена современная версия платформы (например, 8.3.13 или выше), это не гарантирует доступность всех функций. Ключевым параметром является Режим совместимости, установленный в свойствах конфигурации и самого расширения.
Разберем по шагам, почему возникает ошибка:
РежимСовместимости версии 8.3.12 или ниже, платформа блокирует использование новых механизмов, чтобы обеспечить стабильность работы старого кода.Таким образом, для решения проблемы необходимо, чтобы и в основной конфигурации, и в расширении был установлен режим совместимости не ниже 8.3.13. Однако простое изменение этого параметра в расширении при сохранении старого режима в основной базе не поможет — платформа выдаст ошибку при попытке применения изменений.
Рассмотрим алгоритм действий, если вам жизненно необходим регистр накопления в расширении:
8.3.12, вам придется поднять этот режим. Важно: это действие может потребовать доработки существующего кода основной базы, так как изменение режима совместимости меняет поведение некоторых функций платформы.Если основная конфигурация находится на поддержке и вы не можете менять ее режим совместимости, использовать собственные регистры в расширении невозможно.
Опытные разработчики часто предостерегают от использования регистров в расширениях, аргументируя это возможной потерей данных. Разберем подробнее, как устроено хранение данных расширений в СУБД (MS SQL, PostgreSQL и др.).
Когда вы создаете РегистрНакопления.XXX в расширении, платформа создает для него физические таблицы в базе данных. Эти таблицы имеют специальные префиксы. Главная опасность заключается в жизненном цикле расширения:
Проанализируем ситуацию: если администратор базы данных по ошибке удалит расширение при обновлении или переустановке, восстановить данные регистра можно будет только из резервной копии всей базы данных.
Если данные регистра критически важны (например, это финансовый учет), рассмотрим более безопасный вариант работы с конфигурацией на поддержке:
РегистрНакопления непосредственно в основную конфигурацию. Это гарантирует, что таблицы данных будут защищены стандартными механизмами платформы и не исчезнут при манипуляциях с расширениями.Этот подход считается «золотым стандартом»: структура данных хранится в основной базе, а бизнес-логика — в расширении. Таким образом, основная конфигурация остается максимально чистой, а данные — в безопасности.
При использовании регистров накопления в расширениях важно понимать, кто может выступать в роли регистратора (документа, делающего движения). Рассмотрим доступные варианты:
Посмотрим на пример того, как программно записываются движения в такой регистр в модуле расширения:
// Пример в расширении при проведении заимствованного документа
&После("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведенияПосле(Отказ, РежимПроведения)
// Обращаемся к нашему новому регистру из расширения
ДвиженияРегистрИзРасширения = Движения.Расш1_РегистрПродаж;
ДвиженияРегистрИзРасширения.Записывать = Истина;
НовоеДвижение = ДвиженияРегистрИзРасширения.Добавить();
НовоеДвижение.Период = Дата;
НовоеДвижение.Номенклатура = Объект.Товар;
НовоеДвижение.Количество = Объект.Количество;
КонецПроцедуры
Выясним, какие еще нюансы существуют при работе с итогами регистров в расширениях:
8.3.14, работа с итогами регистров расширений была значительно оптимизирована. Однако в высоконагруженных системах (с тысячами транзакций в минуту) следует проявлять осторожность, так как СУБД приходится выполнять дополнительные операции соединения для объединения контекста основной базы и расширения.Несмотря на то что функционал появился в 8.3.13, наиболее стабильная работа с собственными объектами расширений (включая корректный расчет итогов и отображение в динамических списках) наблюдается в версиях 8.3.15 и выше. Если ваша инфраструктура позволяет, рекомендуется поднять режим совместимости именно до этих версий.
Подведем итог: использование регистров накопления в расширениях — мощный инструмент, который требует внимательного отношения к режиму совместимости и регламентам обслуживания базы данных. Главное правило — никогда не удаляйте расширение, содержащее данные, без предварительной выгрузки этих данных в файл или резервную копию.