Предопределенный элемент 1с. Использование предопределенных элементов. Работа с предопределенными значениями С помощью функции ПредопределенноеЗначение()

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

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

1.2. В большинстве случаев, предопределенные элементы рекомендуется создавать автоматически, поскольку они постоянно нужны и требуется упростить обращение к этим элементам из кода.
Например, предопределенная страна Россия в справочнике Страны мира , предопределенные профиль групп доступа Администратор и т.п.

Для этого

  • в свойстве справочника, плана счетов , плана видов характеристик или плана видов расчета должно быть установлено значение Авто (по умолчанию), а также не следует допускать программных вызовов метода УстановитьОбновлениеПредопределенныхДанных этих объектов для переключения этого режима.
  • запретить удаление предопределенных элементов пользователями, выключив во всех ролях следующие права (по умолчанию выключены):
    • ИнтерактивноеУдалениеПредопределенныхДанных
    • ИнтерактивнаяПометкаУдаленияПредопределенныхДанных
    • ИнтерактивноеСнятиеПометкиУдаленияПредопределенныхДанных
    • ИнтерактивноеУдалениеПомеченныхПредопределенныхДанных

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

При этом:

а) конфигурация должна обеспечивать загрузку сообщения обмена в подчиненный узел РИБ до выполнения другого прикладного кода, который обращается к получаемым из главного узла предопределенным элементам;

б) в прикладной логике загрузки данных из главного узла (обработчик события ПриПолученииДанныхОтГлавного , правила регистрации объектов) следует избегать обращений к предопределенным элементам, поскольку нет гарантии, что они уже были загружены из сообщения обмена;

в) код обработчиков обновления ИБ, который обрабатывает предопределенные элементы, не должен выполняться в подчиненных узлах РИБ:

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

При использовании в конфигурации подсистемы "Обмен данными" Библиотеки стандартных подсистем (БСП) версии 2.1.4 и выше требования (а) и (б) снимаются.

1.4. Для таблиц с предопределенными элементами, которые не входят в состав плана обмена РИБ (и на которые не ссылаются другие таблицы, входящие в состав плана обмена РИБ) рекомендуется устанавливать свойство ОбновлениеПредопределенныхДанных в значение ОбновлятьАвтоматически , а также при первом запуске подчиненного узла РИБ устанавливать автоматическое обновление в данных с помощью вызова:

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

2. В некоторых случаях, предопределенные элементы не требуется создавать автоматически, если их наличие зависит от какого-либо условия: включенной функциональной опции, режима работы программы и т.п.

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

Для этого

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

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

Внимание! Перед вами ознакомительная версия урока, материалы которого могут быть неполными.

Войдите на сайт как ученик

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

Язык запросов 1С 8.3 для начинающих программистов: функция ЗНАЧЕНИЕ

Функция ЗНАЧЕНИЕ предназначена для обращения в тексте запроса к значениям системных перечислений и предопределенным данным .

Что ещё за перечисления и предопределенные данные, спросите вы. Давайте обо всё по порядку.

Перечисления

Перечисления - это прикладной объект (вы помните, что ещё существуют Справочники и Документы ). Зачем он понадобился?

Дело в том, что перечисление - это особенный объект. В отличие от справочников и документов все возможные значения перечислений задаются на этапе конфигурирования и не могут быть в дальнейшем изменены в пользовательском режиме.

Неизменность - это их главный козырь. Это своеобразные константы базы данных.

И если программист в режиме конфигурирования создал перечисление с именем Пол и значениями Мужской и Женский , то при написании программы он может быть уверен, что в дальнейшем значения этого перечисления не изменятся. Поэтому он может смело обращаться к этим значениям из кода.

Представьте, что будет, если он попытается для этих целей использовать справочник?

Во-первых, какой-нибудь пользователь возьмёт да и добавит какой-нибудь "Марсианский пол".

Во-вторых, другой пользователь возьмёт да и удалит один из уже имеющихся полов или имя ему поменяет.

А программа от этого сломается, потому что для её работы необходимо, чтобы было ровно два пола и именно с именами "Мужской" и "Женский".

Вот для таких случаев, как раз и существуют перечисления: чтобы один раз (ещё на этапе конфигурирования) жестко задать все возможные варианты значений и в дальнейшем использовать их в коде программ.

Давайте рассмотрим пример такого перечисления в нашей базе "Гастроном". Вы читаете ознакомительную версию урока, полноценные уроки находятся .

Вот оно наше перечисление с именем Пол . Какие значения оно может принимать?

Всего два значения. С именами "Мужской" и "Женский". То что нам надо.

Где мы в дальнейшем можем использовать это перечисление? Ну, конечно, в справочнике Клиенты . Обратите внимание, что в его списке появился новый реквизит с именем Пол и типом Перечисление.Пол :

Таким образом, при заполнении карточки клиента уже в режиме пользователя мы сможем в качестве пола клиента выбирать всего из двух значений Мужской и Женский:

Теперь давайте составим запрос, выбирающий клиентов и их пол из базы:

А теперь давайте изменим запрос, чтобы остались только мужчины. Если мы попробуем написать что-то типа:

то ничего не получим:

Потому что к значениям перечисления так обращаться нельзя. К ним нужно обращаться используя функцию ЗНАЧЕНИЕ :

Итак, одна из задач функции ЗНАЧЕНИЕ - использование в запросах значений перечислений.

Предопределенные данные

Я лучше покажу на примере, что такое предопределенные данные для справочников. Вы читаете ознакомительную версию урока, полноценные уроки находятся .

В нашей базе "Гастроном" (в режиме пользователя) откройте справочник "Единицы измерения":

Присмотритесь к его элементам. Видите жёлтые кружочки рядом с некоторыми из элементов? Вот эти элементы (у которых кружочки) и есть предопределенные данные .

Вообще же, если какой-либо элемент справочника является предопределенным (то есть на нём стоит жёлтый кружочек), то это особенный элемент.

Во-первых, это означает, что элемент был создан ещё на этапе конфигурирования программистом (в нашем случае это элементы с кодами 1, 2 и 3).

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

Именно поэтому просто удалить такой элемент не получится. Попробуйте пометить его на удаление:

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

Вот они все наши предопределенные элементы для справочника Единица измерения. Обратите внимание, что все предопределенные элементы имеют специальное имя, которое не отображается в режиме пользователя.

Для элемента с кодом 1 это имя Тонна, с кодом 2 - Грамм и так далее. Это имя называется предопределенным именем элемента и именно по этому имени можно обращаться к нему из кода (или из запроса в нашем случае).

Вы спросите почему же было не сделать единицы измерения просто перечислением с элементами Тонна, Грамм и Пачка? А всё потому, что в данном случае нам важно, чтобы справочник единицы измерения всегда содержал какие-то определенные элементы (тонна, грамм и пачка), но в то же время мы не хотим запрещать пользователю добавлять какие-то свои элементы (килограмм, штука и так далее). Вы читаете ознакомительную версию урока, полноценные уроки находятся .

Поэтому здесь безусловно больше подходят предопределенные элементы, чем перечисления.

А обращаться к нашим предопределенным элементам из запроса мы сможем используя уже знакомую нам функцию ЗНАЧЕНИЕ :

Пройдите тест

Начать тест

1. Значения перечислений задаются

2. Для хранения списка складов на фирме подойдёт тип

3. Для хранения списка единиц измерения на складе подойдёт тип

4. Для хранения ставок налога, список которых не должен изменяться пользователем, подойдёт тип

5. Чтобы обратиться в запросе к значению перечисления подойдёт функция

6. Для хранения ставок налога, список которых будет меняться пользователем, подойдёт тип

7. Предопределенные данные бывают у

Всем известно отличие предопределенных элементов от обычных: "Предопределенные элементы создаются в режиме "Конфигуратор" и не могут быть удалены в режиме 1С:Предприятия". В пользовательском режиме отличить предопределенный элемент от добавленных пользователями можно по специальной пиктограмме (см. следующий скриншот).

В основном предопределенные элементы создаются разработчиками, чтобы завязать именно на них алгоритмы в различных объекта конфигурации. Например, в конфигурации "Управление производственным предприятием" в справочнике "Качество" разработчиками добавлен предопределенный элемент "Новый".

Этот элемент используется во многих модулях конфигурации. Так в документе "Поступление товаров и услуг" при выполнении проведения во всех регистрах, где есть измерение "Качество", подставляется значение предопределенного элемента. Далее приведен листинг заполнения таблицы проведения по регистру "ТоварыОрганизаций":

// ТОВАРЫ ПО РЕГИСТРУ ТоварыОрганизаций. НаборДвижений = Движения. ТоварыОрганизаций; Если ВидПоступления = Перечисления. ВидыПоступленияТоваров. НаСклад Тогда // Получим таблицу значений, совпадающую со структурой набора записей регистра. ТаблицаДвижений = НаборДвижений. Выгрузить() ; // Заполним таблицу движений. ОбщегоНазначения. ЗагрузитьВТаблицуЗначений(ТаблицаПоТоварам, ТаблицаДвижений) ; // Недостающие поля. ТаблицаДвижений. ЗаполнитьЗначения(Организация, " Организация " ) ; ТаблицаДвижений. ЗаполнитьЗначения(Неопределено , " Комиссионер " ) ; ТаблицаДвижений. ЗаполнитьЗначения(Справочники. Качество. Новый , " Качество " ) ; // Заполняем качество из предопределенного элемента

Таким образом, характерные черты предопределенных элементов и их назначение достаточно просты. Рассмотрим способ их хранения в таблицах базы данных и его отличие от обычных элементов.

Различия

В тестовой конфигурации создан справочник "Товары". В нем создана группа "Тестовые элементы". Содержимое группы Вы могли видеть на скриншоте в начале статьи. Для справочника "Товары" в SQL-базе данных имеется соответствующая таблица "_Reference37" со следующей структурой:

Но как определить соответствие реквизитов дереве конфигурации и полей в SQL-таблице?

Воспользуемся стандартным методом глобального контекста "ПолучитьСтруктуруХраненияБазыДанных()", который вернет нам таблицу значений с описанием струкутры таблиц.

В таблице значений "Поля" мы видим соответствие полей SQL-таблицы и реквизитов объекта в дереве метаданных. В нашем примере мы рассматриваем структуру справочника "Товары". У всех справочников есть стандартный реквизит "Предопределенный"булевого типа, который для предопределенных элементов установлен в ИСТИНА:

По таблице со структурой хранения справочника в базе данных мы однозначно можем сказать, что поле "Предопределенный" соответствует полю "IsMetadata". Если мы просмотрим содержимое таблицы "_Reference37" в SQL-базе, то увидим следующее:

В записи для предопределенного элемента значение поля "IsMetadata" установлено в "0x01", что соответствует флагу ИСТИНА. Для обычных элементов значение установлено в "0x00". В этом и заключается главное отличие предопределенных элементов от обычных. Все остальные поля хранятся в базе данных аналогично полям обычных элементов, добавленных пользователями.

Предопределенным элементам можно найти очень интересное предназначение. С их помощью можно запретить удалять/помечать на удаление группы элементов в справочнике и других объектах, где их можно добавить. Если мы попытаемся удалить или пометить на удаление группу "Тестовые элементы". то получим такие ошибки:

Таким образом, предопределенные элементы делают группу, в которую они помещены, тоже "предопределенной".

Завершение

Предопределенные элементы являются неотъемлемой частью большинства конфигурации. Их использование упрощает разработку и делает построение функционала логически более "стройным" и цельным.


Top