#std697

Использование предопределенных элементов

Для информации

Стандарт действует для платформы 8.3.3 и выше без режима совместимости с 8.2.

1.1.

В справочниках, планах счетов, планах видов характеристик и планах видов расчета предопределенные элементы можно создавать автоматически или программно.

1.2.

В большинстве случаев создавайте предопределенные элементы автоматически.

Так проще и безопаснее работать с ними в коде.

Примеры: страна Россия в справочнике СтраныМира, профиль групп доступа Администратор.

Для этого:

  • оставляйте свойство ОбновлениеПредопределенныхДанных = Авто;
  • не переключайте режим в коде через УстановитьОбновлениеПредопределенныхДанных;
  • запретите пользователям интерактивное удаление предопределенных данных.

Отключите следующие права ролей (по умолчанию они выключены):

  • ИнтерактивноеУдалениеПредопределенныхДанных;
  • ИнтерактивнаяПометкаУдаленияПредопределенныхДанных;
  • ИнтерактивноеСнятиеПометкиУдаленияПредопределенныхДанных;
  • ИнтерактивноеУдалениеПомеченныхПредопределенныхДанных.

См. #std488: Стандартные роли.

1.3.

Для информации

Уточнение действует для управляемого и обычного приложения.

Исключение: подчиненные узлы РИБ.

В подчиненном узле предопределенные элементы:

  • не создаются автоматически;
  • не обновляются автоматически при изменении метаданных;
  • должны приходить из главного узла вместе с изменениями конфигурации.

В этом режиме:

  1. Загружайте сообщение обмена в подчиненный узел до выполнения прикладного кода, который обращается к предопределенным элементам.
  2. В логике загрузки данных из главного узла (обработчик ПриПолученииДанныхОтГлавного, правила регистрации объектов) избегайте обращений к предопределенным элементам. Нет гарантии, что они уже пришли из сообщения обмена.
  3. Код обработчиков обновления ИБ, который заполняет предопределенные элементы, выполняйте только в главном узле.

Пример

Если ПланыОбмена.ГлавныйУзел() = Неопределено Тогда
    // Заполняем предопределенные элементы.
    ...
КонецЕсли;

При использовании подсистемы Обмен данными БСП версии 2.1.4 и выше требования 1 и 2 снимаются.

1.4.

Для таблиц с предопределенными элементами, которые:

  • не входят в состав плана обмена РИБ;
  • не связаны с таблицами, входящими в план обмена РИБ;

устанавливайте свойство ОбновлениеПредопределенныхДанных = ОбновлятьАвтоматически.

Значение Авто здесь не подходит: в подчиненном узле Авто означает НеОбновлятьАвтоматически, и элементы автоматически не создаются.

Если включен режим совместимости с 8.3.3, при первом запуске подчиненного узла РИБ (сразу после обновления конфигурации) также устанавливайте автоматическое обновление данных программно:

Справочники.<ИмяСправочника>.УстановитьОбновлениеПредопределенныхДанных(
    ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
2.

Если наличие предопределенного элемента зависит от условий (функциональные опции, режим работы и т. п.), автоматическое создание не требуется.

Пример: предопределенные виды расчета в плане видов расчета Начисления зависят от функциональных опций ИспользоватьУчетВремениСотрудниковВЧасах, ИспользоватьСдельныйЗаработок и др.

В этом случае:

  • устанавливайте ОбновлениеПредопределенныхДанных = Не обновлять автоматически;
  • реализуйте в прикладном коде создание элемента и, при необходимости, #std638: пометку недействительным;
  • учитывайте в коде, что элемент может отсутствовать.

Пример

Если ПолучитьФункциональнуюОпцию("ИспользоватьУчетВремениСотрудниковВЧасах") Тогда
    НачислениеОбъект = ПланыВидовРасчета.Начисления.СоздатьВидРасчета();
    НачислениеОбъект.ИмяПредопределенныхДанных = "ОкладПоЧасам";
    ...
    НачислениеОбъект.Записать();
КонецЕсли;

Если не учитывать отсутствие такого элемента, обращение из кода или запроса вызовет исключение.

Неправильно

... = ПланВидовРасчета.Начисления.ОкладПоЧасам;
... = ПредопределенноеЗначение("ПланВидовРасчета.Начисления.ОкладПоЧасам");

При использовании БСП версии 2.1.4 и выше применяйте функцию ПредопределенныйЭлемент() общих модулей ОбщегоНазначения или ОбщегоНазначенияКлиент. Она возвращает Неопределено, если элемента нет в ИБ.

Правильно

... = ОбщегоНазначенияКлиент.ПредопределенныйЭлемент(
    "ПланВидовРасчета.Начисления.ОкладПоЧасам");
См. также
Проверки

#acc:192 #acc:193 #acc:194 #acc:195 #acc:304 #acc:305 #acc:1149

Источник

https://its.1c.ru/db/v8std#content:697