Всем известно отличие предопределенных элементов от обычных: "Предопределенные элементы создаются в режиме "Конфигуратор" и не могут быть удалены в режиме 1С:Предприятия". В пользовательском режиме отличить предопределенный элемент от добавленных пользователями можно по специальной пиктограмме (см. следующий скриншот).
В основном предопределенные элементы создаются разработчиками, чтобы завязать именно на них алгоритмы в различных объекта конфигурации. Например, в конфигурации "Управление производственным предприятием" в справочнике "Качество" разработчиками добавлен предопределенный элемент "Новый".
Этот элемент используется во многих модулях конфигурации. Так в документе "Поступление товаров и услуг" при выполнении проведения во всех регистрах, где есть измерение "Качество", подставляется значение предопределенного элемента. Далее приведен листинг заполнения таблицы проведения по регистру "ТоварыОрганизаций":
// ТОВАРЫ ПО РЕГИСТРУ ТоварыОрганизаций. НаборДвижений = Движения.ТоварыОрганизаций; Если ВидПоступления = Перечисления.ВидыПоступленияТоваров.НаСклад Тогда // Получим таблицу значений, совпадающую со структурой набора записей регистра. ТаблицаДвижений = НаборДвижений.Выгрузить(); // Заполним таблицу движений. ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоТоварам, ТаблицаДвижений); // Недостающие поля. ТаблицаДвижений.ЗаполнитьЗначения(Организация, "Организация"); ТаблицаДвижений.ЗаполнитьЗначения(Неопределено,"Комиссионер"); ТаблицаДвижений.ЗаполнитьЗначения(Справочники.Качество.Новый, "Качество"); // Заполняем качество из предопределенного элемента
Таким образом, характерные черты предопределенных элементов и их назначение достаточно просты. Рассмотрим способ их хранения в таблицах базы данных и его отличие от обычных элементов.
В тестовой конфигурации создан справочник "Товары". В нем создана группа "Тестовые элементы". Содержимое группы Вы могли видеть на скриншоте в начале статьи. Для справочника "Товары" в SQL-базе данных имеется соответствующая таблица "_Reference37" со следующей структурой:
Но как определить соответствие реквизитов дереве конфигурации и полей в SQL-таблице?
Воспользуемся стандартным методом глобального контекста "ПолучитьСтруктуруХраненияБазыДанных()", который вернет нам таблицу значений с описанием струкутры таблиц.
В таблице значений "Поля" мы видим соответствие полей SQL-таблицы и реквизитов объекта в дереве метаданных. В нашем примере мы рассматриваем структуру справочника "Товары". У всех справочников есть стандартный реквизит "Предопределенный"булевого типа, который для предопределенных элементов установлен в ИСТИНА:
По таблице со структурой хранения справочника в базе данных мы однозначно можем сказать, что поле "Предопределенный" соответствует полю "IsMetadata". Если мы просмотрим содержимое таблицы "_Reference37" в SQL-базе, то увидим следующее:
В записи для предопределенного элемента значение поля "IsMetadata" установлено в "0x01", что соответствует флагу ИСТИНА. Для обычных элементов значение установлено в "0x00". В этом и заключается главное отличие предопределенных элементов от обычных. Все остальные поля хранятся в базе данных аналогично полям обычных элементов, добавленных пользователями.
Предопределенным элементам можно найти очень интересное предназначение. С их помощью можно запретить удалять/помечать на удаление группы элементов в справочнике и других объектах, где их можно добавить. Если мы попытаемся удалить или пометить на удаление группу "Тестовые элементы". то получим такие ошибки:
Таким образом, предопределенные элементы делают группу, в которую они помещены, тоже "предопределенной".
Предопределенные элементы являются неотъемлемой частью большинства конфигурации. Их использование упрощает разработку и делает построение функционала логически более "стройным" и цельным.