1С предопределенное значение

1С предопределенное значение

Содержание

1с 8 предопределенное значение. Обычный и предопределенный элементы. Различие на стороне базы данных. Неверное указание предопределенного элемента

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Начать тест

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

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

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

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

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

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

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

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

Был свидетелем того, как в отчетах для получения необходимой цены использовался отбор по виду цены в запросе по ее наименованию (см. следующий скриншот).

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

К тому же, если привязываться к наименованию или коду элементов справочника, то при получении ссылки на элемент всегда будет осуществляться поиска в таблице справочника. Не смотря на то, что стандартные реквизиты системы индексируются СУБД, поиск по ним в некоторых случаях может занимать значительные ресурсы. К тому же, рациональнее было бы не выполнять поисковой запрос по таблице справочника, если, скажем так, ссылка на элемент и так «заранее известна».

Как выход, можно хранить ссылку на каждый часто используемый элемент справочника «Типы цен номенклатуры» в отдельных константах и получать из них значения в запросе. Однако, в таком случае разработчику придется добавлять отдельную константу для каждого подобного элемента. Ситуация значительно усложнится, если такие элементы будут не только в справочнике «Типы цен номенклатуры», но и в других справочниках («Категории объектов», «Качество», «Номенклатура» и другие). Тогда количество констант в системе может увеличиться в несколько раз!

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

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

Универсальное решение

Суть универсального решения будет заключаться в следующем: будет создан справочник, в который разработчиком будут добавляться предопределенные элементы. В справочник добавлен реквизит «Значение», тип которого зависит от значений, для которых будет создаваться соответствие «Предопределенный элемент справочника -> Связанной значение». Структура метаданных справочника выглядит следующем образом (см. следующий скриншот).

Для получения предопределенного элемента наилучшим вариантом является использование глобального метода «ПредопределенноеЗначение()» . В качестве параметра в метод передается полный путь к предопределенному элементу. Синтаксис похож на функцию языка запросов «ЗНАЧЕНИЕ()» .

Для удобства разработки рекомендую вынести функцию для получения связанного с предопределенным элементом значения в общий модуль. В тестовой конфигурации, доступной для скачивания по ссылке в конце статьи, создан общий модуль «ЗначенияПредопределенныхЭлементов» с экспортной функцией «ПолучитьЗначениеПредопределенногоЭлемента()» . Программный код функции получает ссылку на предопределенный элемент, затем запросом получает значений реквизита «Значение». На следующем скриншоте приведен полный листинг функции.

Как мы видим, в функции формируется запрос к реквизиту «Значение» переданного в качестве параметра предопределенного элемента. В качестве параметр функции является строка с именем предопределенного элемента.
Для правильной работы созданного механизма нужно связать в пользовательском режиме предопределенный элемент с обычным элементом справочника, выбрав соответствующий элемент в реквизите «Значение». Перейдем к вопросу влияния на производительность.

Влияние на производительность

Проводил тест на скорость для обоих вариантов поиска: по наименованию и по ссылке из предопределенного элемента. Поиск проходил по справочнику «Товары» с 20000 записей. При проведении тестов на файловой базе были получены следующие результаты:

Результаты показали, что для файлового варианта работы использование предопределенных элементов для получения часто используемых элементов других справочников работает медленнее практически в 4 раза!

В клиент-серверном варианте работы результаты тестов показывают совсем другую картину. Скорость получения ссылка на нужный элемент не снизилась значительно (один из тестов показал 0.002 сек. для поиска по наименованию и 0.0008 сек. при работе через предопределенный элемент), однако надежность работы программы увеличилась в разы!

Выводы

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

За время работы с платформой не раз встречался с ситуациям, когда после изменения наименования, например у элемента справочника «ТипыЦенНоменклатуры», слетала работа у большинства не типовых отчетов.

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

Файлы для загрузки:

  1. Выгрузка тестовой базы с примерами из статьи.

Печать (Ctrl+P)

Работа с предопределенными значениями с помощью менеджера объекта

Получить предопределенное значение на стороне сервера «1С:Предприятия» можно с помощью менеджера соответствующего объекта. Строка, определяющая получаемый реквизит, имеет следующий вид:

ТипПредопределенногоЗначения.ИмяОбъектаМетаданных.Значение

● ТипПредопределенногоЗначения – для получения предопределенных значений доступно указание следующих типов данных (написание во
множественном числе):
● Справочники,
● ПланыВидовХарактеристик,
● ПланыСчетов,
● ПланыВидовРасчета,
● Перечисления.
● ИмяОбъектаМетаданных

● Значение – может быть одним из следующих:
● для перечислений указывается имя значения перечисления;
● ТочкиМаршрута.ИмяТочки – точка маршрута бизнес-процесса.
В случае, если требуется получить точку маршрута бизнес-процесса, строка, описывающая получаемое значение, будет выглядеть следующим образом:

БизнесПроцессы.ИмяОбъектаМетаданных.ТочкиМаршрута.ИмяТочкиМаршрута
Пример:

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

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

Рассмотрим составляющие этой строки подробнее:
● ТипПредопределенногоЗначения – для получения предопределенных значений доступно указание следующих типов данных (написание в
единственном числе):
● Справочник ,
● ПланВидовХарактеристик ,
● ПланСчетов ,
● ПланВидовРасчета ,
● Перечисление,
● БизнесПроцесс .
● ИмяОбъектаМетаданных – указывается имя объекта метаданных так, как оно задано в конфигураторе.
● Значение – может быть одним из следующих

● для перечислений указывается имя значения перечисления;
● для получения предопределенного значения указывается его имя, как оно задано в конфигураторе;
● ТочкаМаршрута.ИмяТочки – точка маршрута бизнес-процесса;
● ПустаяСсылка – для получения пустой ссылки.
В случае необходимости получить значение системного перечисления параметр метода будет выглядеть следующим образом:
ИмяСистемногоПеречисления.ЗначениеСистемногоПеречисления.
Например:

ТипДиаграммы = ПредопределенноеЗначение(“ТипДиаграммы.ВогнутаяПоверхность “);
В случае если требуется получить точку маршрута бизнес-процесса, строка, описывающая получаемое значение, будет выглядеть следующим образом:
Пример:

// Получение значения перечисления.
Вид = ПредопределенноеЗначение (“Перечисление.ВидыТоваров.Товар”);
// Получение значения пустой ссылки.
ПустаяСсылка =
ПредопределенноеЗначение (“Документ.РасходнаяНакл.ПустаяСсылка”);
// Получение предопределенных данных справочника.
Элемент = ПредопределенноеЗначение (“Справочник.Валюта.Рубль”);
// Точка маршрута бизнес-процесса
Точка = ПредопределенноеЗначение (“БизнесПроцесс.Согласование. ТочкаМаршрута.Одобрение”);

На четвертом уроке нашего мы продолжим знакомиться с программой . Сегодня мы на практических примерах познакомимся с и ерархическими справочниками, а также научимся создавать предопределенные элементы .

Хронометраж 4 урока курса:

00:19 Изменения в справочнике Сотрудники после выполнения домашнего задания по 3 уроку курса
00:35 Редактирование порядка следования реквизитов в справочниках
02:54 Создание справочника Номенклатура
03:40 Создание и настройка иерархического справочника
05:10 Создание групп Услуги и Товары в справочнике Номенклатура
06:05 Заполнение справочника Номенклатура
07:14 3 способа переноса элемента справочника в другую группу
08:21 Создание справочника Склады
09:19 Создание предопределенных элементов справочника
11:25 Заполнение справочника Склады
12:20 Пройти тест по материалу 4 урока

Иерархический справочник – справочник с возможностью иерархического расположения его элементов. Например, в справочнике Номенклатура могут быть созданы группы: Товары, Услуги и т.д., в которых располагаются элементы, относящиеся к этим группам. Кроме того группы справочника могут включать в себя и другие группы, создавая тем самым многоуровневую иерархическую структуру.

Кроме этого, справочники поддерживают и другой вид иерархии, при котором элементы справочника будут относиться не к группам, а к другим элементам этого же справочника. Такой вид иерархии (иерархия элементов ) может использоваться, например, при создании справочника Подразделения, где одно подразделение (подразделение в данном случае элемент справочника, а не группа) может включать в себя несколько других подразделений. Такой вид иерархии применяется достаточно редко.

Формы справочника – визуальное представление справочника. В зависимости от того, какие именно действия мы хотим выполнить с нашим справочником, нам требуется отображать справочник в «различных видах». Так, на 4 уроке курса мы с вами редактировали порядок следования реквизитов в форме списка и в форме элемента справочника.

Система создает (генерирует) формы автоматически, но, при необходимости, разработчик можем «рисовать» формы самостоятельно.

Всего для справочников существует 5 форм (типов форм):

  • форма элемента – для создания или редактирования элемента справочника;
  • форма группы — для создания или редактирования группы справочника;
  • форма списка – для отображения списка элементов справочника;
  • форма выбора — используется, чтобы в поле некой формы выбрать один из элементов данного справочника. Например, чтобы в документе Поступление товара в поле склад выбрать конкретный склад из справочника Склады;
  • форма выбора групп – используется, чтобы в поле некой формы выбрать одну из групп данного справочника.

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

Между обычными и предопределенными элементами справочника существует принципиальная разница. Обычные элементы непостоянны в конфигурации. В процесс работы пользователя они могут создаваться, редактироваться и удаляться и, именно поэтому, на них не следует полагаться при выполнении каких-либо алгоритмов (код и наименование элемента может изменяться пользователем). Предопределенные элементы, напротив, постоянные. В процессе работы, даже если пользователь переименует такой элемент, к нему можно будет обращаться из встроенного языка 1с. Это достигается за счет того, что у предопределенного элемента есть реквизит Имя , который недоступен пользователю. У обычных элементов справочника такого реквизита нет.

Важно! Технически пользователь имет возможность удалить предопределенный элемент справочника, но, как правило, пользователям отключают права на удаление предопределенных элементов справочника.

Домашнее задание по 4 уроку курса

Домашнее задание по четвертому уроку курса будет вам доступно сразу после успешного решения теоретического теста.

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

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

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

Для этого

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

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

При этом:

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

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

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

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

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

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

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

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

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

Для этого

  • в свойстве ОбновлениеПредопределенныхДанных справочника, плана счетов, плана видов характеристик или плана видов расчета нужно установить в значение «Не обновлять автоматически»
  • предусмотреть код создания (и пометки недействительным) предопределенного элемента в зависимости от бизнес-логики, например:

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

  • учитывать в прикладном коде отсутствие предопределенных элементов в ИБ. В противном случае, при обращении к несуществующему предопределенному элементу из кода или текста запроса будет вызвано исключение:

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

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

1С, что такое предопределенный элемент, как создать?

Предопределенный элемент в 1С — это запись справочника заранее созданная в конфигураторе. К предопределенным элементам можно обращаться программно, при этом не используя запросы к базе данных. Данные элементы помечены желтым кружком и их нежелательно редактировать в пользовательском режиме, их нельзя удалить.

Пример создания предопределенного элемента:

Допустим нам необходимо, чтобы в базе изначально присутствовал объект справочника «Договор», а именно «Договор подряда».

  • Заходим в конфигуратор;
  • Открываем справочник договоры -> Прочее -> Предопределенные

  • Нажимаем кнопку «Создать» (зеленый круг с плюсом), затем заполняем «Имя», без пробелов.

  • Обновляем базу;
  • Затем в пользовательском режиме открываем справочник «Договоры». Видим, что уже есть 1 элемент справочника, созданный нами в конфигураторе. Договор помечен желтым кружком, что говорит нам о том, что он предопределенный.

Пример программного обращения к предопределенному элементу

Создадим обработку, с формой, на форму выведем кнопку. При нажатии на кнопку организуем вывод сообщения с наименованием договора созданного в конфигураторе.

Пример процедуры:

&НаСервере Процедура СообщитьНаименованиеПредопределенногоЭлементаНаСервере() // Пример обращения с помощью встроенного языка Сообщить(Справочники.Договоры.ДоговорПодряда); Сообщить(Справочники.Договоры.ДоговорПодряда.Наименование); Сообщить(Справочники.Договоры.ДоговорПодряда.Код); КонецПроцедуры

Пример использования предопределенных элементов в СКД

  • Данные элементы мы можем использовать при отборе, в схеме компоновки данных. Создадим отчет СКД, с текстом запроса:

ВЫБРАТЬ ЗаказПокупателя.Ссылка КАК Ссылка, ЗаказПокупателя.ВерсияДанных КАК ВерсияДанных, ЗаказПокупателя.ПометкаУдаления КАК ПометкаУдаления, ЗаказПокупателя.Номер КАК Номер, ЗаказПокупателя.Дата КАК Дата, ЗаказПокупателя.Проведен КАК Проведен, ЗаказПокупателя.Контрагент КАК Контрагент, ЗаказПокупателя.Договор КАК Договор ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя

  • Далее в форме СКД переходим на вкладку Настройки -> Отбор -> Договор, переместить в правую область -> Выбрать «Договор подряда» из доступных значений;

  • Результат запроса будет отфильтрован по договору подряда.

Предопределенные элементы справочников

Предопределенные элементы справочников создаются в режиме конфигуратора. В режиме «1С:Конфигуратор» определяются имена предопределенных элементов. Сами элементы, которые хранятся в базе данных, создаются в режиме «1С:Предприятие». Таким, образом предопределенный элемент — это метаданные (имя предопределенного элемента) и данные (сам элемент справочника).

1С:Предприятие 8.2

В 1С:Предприятии 8.2 предопределенные элементы добавленные или удаленные в конфигураторе, автоматически добавляются или удаляются в базе данных.

1С:Предприятие 8.3

В этой версии платформы, каждый справочник содержит стандартный реквизит «ИмяПредопределенныхДанных». Он создан для хранения предопределенного имени и доступен для программного изменения. При добавлении нового элемента в конфигураторе, этот элемент может быть создан в базе данных или нет — это зависит от свойства справочника «Обновление предопределенных данных». Если установлено значение «Обновлять автоматически», то созданные предопределенные элементы в конфигураторе, автоматически добавятся в базу. Если свойство установлено в значение «Не обновлять автоматически», элементы в базу не добавятся. В таком случае их нужно создать самостоятельно и программно привязать к предопределенным элементам справочника, установив реквизит «ИмяПредопределенныхДанных».

Как использовать перечисление в запросе 1С 8.2, 8.3

1. Что такое перечисление в запросе?

2. Примеры перечисления 1С 8

3. Перечисление в запросе

Данная статья предназначена для помощи в освоении такого объекта конфигурации 1С как перечисление. Расскажем, как использовать его в тексте запроса 1С.

1. Что такое перечисление в запросе?

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

Неизменность данных – основное преимущество, отличающее «Перечисление» от «Справочника». Так как в справочнике 1С 8.2, 8.3 у пользователя есть возможность удалить определенное значение или же заменить его наименование, что может «сломать» программу, ведь для ее работы были необходимы конкретные значения, для дальнейшего использования их в коде программы.

2. Примеры перечисления 1С 8

Рассмотрим пример перечисления 1С 8 в нашей базе.

В базе создано перечисление «Качество товаров». В него входят такие значения как: «Высокое/Обычное/Низкое»:

Перечисления можно использовать в различных других объектах конфигуратора, например, в справочнике или документе в 1С 8.3 (для примера возьмем документ Товары). Для этого тип реквизита 1С необходимо указать «ПеречисленияСсылка»:

Таким образом, при заполнении данного документа в пользовательском режиме 1С у нас будет возможность выбрать необходимое значение из имеющегося списка (в поле «Качество товара»):

3. Перечисление в запросе

Рассмотрим запрос, включающий в себя выбор товаров и качество из документа. Особенность использования в запросе 1С значений перечисления 1С заключается в том, что для этого необходимо использовать функцию «Значение»:

Ошибки в предопределённых элементах

Сама идея программной работы с предопределенными элемементами, на мой взгляд, очень правильная. Просто есть нюансы, которые нужно учитывать при работе.

Для начала необходимо четко осознать для себя, что есть предопределенные элементы в конфигурации и есть предопределенные элементы в информационной базе (ИБ). Технически предопределенные элементы ИБ это самые обычные элементы справочников, у которых в реквизите «ИмяПредопределенныхДанных» указано, какому предопределенному элементу конфигурации они соответствуют. Ничем больше они от обычных элементов не отличаются. Соответственно, любой обычный элемент ИБ можно сделать предопределенным, любой предопределенный обычным. Для этого достаточно вписать нужное значение в реквизит «ИмяПредопределенныхДанных».

Периодически в этом свойстве оказывается не то значение, которое предусмотрел разработчик. В результате возникают ошибки в работе 1С. От критичных, при которых работа в принципе невозможна, до некритичных, при которых нарушается логика работы алгоритмов.

Условно можно выделить три типа ошибок:
1. «Предопределенный элемент отсутствует в данных»;
2. «Предопределенный элемент не уникален»;
3. Неверное указание предопределенного элемента;

1. «Предопределенный элемент отсутствует в данных» — отсутствие описанного в конфигурации предопределённого элемента в данных ИБ.

Это наиболее простой в отладке и исправлении тип ошибки. Его простота в том, что платформа достаточно корректно сообщает об этой ситуации «Предопределенный элемент отсутствует в данных» и вполне понятно, как её исправить.

При обращении к отсутствующему элементу в коде «Справочники.ВидыКонтактнойИнформации.EmailКонтактногоЛица» выдается сообщение

При обращении к элементу в запросе «ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.EmailКонтактногоЛица)» выдается сообщение:

Такая ошибка возникает в случае, если элемент в конфигурации описан, но в базе ему элемент не сопоставлен.

Для начала уточним, что такая ситуация не всегда является ошибочной. Вполне возможным является использование предопределённых данных в какой-то программной логике, которая для большинства пользователей может не использоваться. В этом случае, чтобы не захломлять справочник у всех пользователей конфигурации, логично определить предопределенные элементы в конфигурации, но не создавать их во всех ИБ, а лишь для тех ИБ, в которых нужная логика конфигурации используется. В этом случае программист может указать для справочника свойство «Не обновлять предопределенные данные» и создать элементы програмно при обращении к функционалу модуля. Либо дать возможность пользователю самостоятельно привязать предопределенные элементы модуля к имеющимся у него обычным элементам.

Также не используется автоматическое создание предопределенных элементов при работе в режиме РИБ. Так как новые элементы должны передаваться из центральной базы, а не создаваться в узлах с отличающимися УИДами.

Т.е. иногда ошибкой является обращение в несопоставленному элементу, а не само наличие такого элемента.

Необходимо проанализировать, почему элемент не создан. Возможно, он должен создаться при выполнении какого-либо режима программы. Например, после выполнения обмена в РИБ. А возможно, его просто случайно удалили.

Если логикой предусмотрено заполнение предопределенных элементов не автоматически, а отдельным режимом, то перед использование обращения по имени «Справочники.ВидыКонтактнойИнформации.EmailКонтактногоЛица» для предотвращения исключительной ситуации желательно проверить, что элемент уже есть в базе. Если элемент отсутствует, то сообщить пользователю об этом и объяснить, какой режим ему нужно выполнить для заполнения элемента. Для такой проверки можно выполнить запрос к данным.

Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | ВидыКонтактнойИнформации.Ссылка |ИЗ | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации |ГДЕ | ВидыКонтактнойИнформации.ИмяПредопределенныхДанных = «»EmailКонтактногоЛица»»»; ЭлементОтсутсвуетВДанных = Запрос.Выполнить().Пустой();

Если это все-таки ошибка в данных базы, то необходимо выполнить привязку к предопределенному элементу элемента ИБ. Т.е. необходимо объяснить системе, к какому элементу ИБ должен обратиться программный код по данному имени. Технически привязка это просто указание имени предопределенного элемента в свойстве «ИмяПредопределенныхДанных» элемента ИБ. Для ее установки достаточно выполнить код:

ОбновляемыйОбъект = СсылкаНаОбъект.ПолучитьОбъект(); ОбновляемыйОбъект.ИмяПредопределенныхДанных = «НашеИмяПредопределенногоЭлемента»; ОбновляемыйОбъект.ОбменДанными.Загрузка = Истина; ОбновляемыйОбъект.Записать();

2. «Предопределенный элемент не уникален» — задвоенные предопределенные элементы:

Эта ситуация заключается в том, что к одному предопределенному элементу привязано несколько элементов ИБ. В этом случае при обращении к предопределенному имени элемент будет выбираться случайным образом. Такая ситуация всегда ошибочна. Ее сложность в том, что платформа никак о ней не сообщает. Просто алгоритмы начинают работать неверно.

Платформа сообщит об ошибке «Предопределенный элемент не уникален» лишь при попытке редактирования задублированного элемента.

До тех пор, пока никому не понадобится редактировать элемент, об ошибке никто не узнает.

Такие дубли могут создаться, например, если для справочника используеися РИБ и в свойствах для предопределенных данных указан режим «Обновлять автоматически». В этом случае при выполнении обмена один экземпляр предопределенных данных создастся при обновлении конфигурации. Второй экземпляр предопределенных элементов с тем же именем передастся из центральной базы при обмене.

Также эти дубли возникнут при использовании обработок обмена между конфигурациями в случае, если в разных базах предопределенным элементам соответствеют разные элементы ИБ. В этом случае один экземпляр предопределенных данных в базе уже есть, второй придет при выполнении загрузки данных с другим УИДом. Если вы выполняете переносы данных, необходимо решить, элементы какой базы считаются основными и использовать их же в подчиненной базе. В подчиненной базе необходимо заменить использование старых элементов на элементы основной базы.

Такие ошибки в базе данных можно выявить запросом вида:

ВЫБРАТЬ ВидыКонтактнойИнформации.ИмяПредопределенныхДанных, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВидыКонтактнойИнформации.Ссылка) КАК КоличествоПредопределенных ИЗ Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации СГРУППИРОВАТЬ ПО ВидыКонтактнойИнформации.ИмяПредопределенныхДанных ИМЕЮЩИЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВидыКонтактнойИнформации.Ссылка) > 1

Этот запрос вернет перечень предопределенных элементов, с которым связано более одного элемента ИБ.

При наличии таких элементов необходимо убрать для одного из них связь с предопределенным. Т.е. необходимо однозначно определить для системы, к какому элементу ИБ должен обратиться программный код при использовании данного имени. Для этого достаточно выполнить код.

ОбновляемыйОбъект = СсылкаНаЭлемент.ПолучитьОбъект(); ОбновляемыйОбъект.ИмяПредопределенныхДанных = «»; ОбновляемыйОбъект.ОбменДанными.Загрузка = Истина; ОбновляемыйОбъект.Записать();

3. Неверное указание предопределенного элемента.

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

Для этого достаточно выполнить одну из команд.

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

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

Ну и кратко об ошибках при программной работе или в режиме конфигуратора:

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

«Не предопределенные объекты не могут иметь предопределенные записи видов субконто» — ошибка возникает при попытке сделать элемент предопределенный плана счетов непредопределенным. Для устранения ошибок необходимо у каждой строки субконта элемента снять признак «Предопределенное».

«Не предопределенные объекты не могут иметь предопределенные записи ведущих видов расчетов» — ошибка возникает при попытке сделать предопределенный элемент плана видов расчета непредопределенным. Для устранения ошибок необходимо у каждой строки ведущего вида расчета элемента снять признак «Предопределенное».

«Предопределенные элементы не уникальны» — ошибка выдается в конфигураторе при обновлении информационной базы на релиз конфигурации без режима совместимости с 8.3.4. Необходимо до обновления проверить дубли и устранить их.

«Имя предопределенного элемента не уникально» — ошибка возникает при наличии в конфигурации нескольких одноименных предопределенных элементов при обновлении на платформу 8.3.6.2332 и выше. Необходимо устранить дубли в конфигурации.

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


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *