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