gifts2017

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

Опубликовал в раздел Программирование - Практика программирования

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

Обновлено: 15.11.2007

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

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

Обновлено: 15.11.2007

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

Описание характеристик

Характеристики в системе компоновки данных описываются в тексте запроса набора данных специальной инструкцией системы компоновки данных, начинающейся с ключевого слова ХАРАКТЕРИСТИКИ.

Пример запроса:

ВЫБРАТЬ
 РасходнаяНакладнаяСостав.Ссылка КАК Документ,
 РасходнаяНакладнаяСостав.Номенклатура,
 РасходнаяНакладнаяСостав.Количество,
 РасходнаяНакладнаяСостав.Цена,
 РасходнаяНакладнаяСостав.Сумма,
 РасходнаяНакладнаяСостав.НомерСтроки
ИЗ
 Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
{ХАРАКТЕРИСТИКИ
 ТИП(Справочник.Номенклатура)
 СПИСОК ПланВидовХарактеристик.ВидыДопСвойств
 ИДЕНТИФИКАТОР Ссылка
 ИМЯ Наименование
 ТИПЗНАЧЕНИЯ ТипЗначения
 ЗНАЧЕНИЯ РегистрСведений.ДопСвойства
 ОБЪЕКТ Номенклатура
 ХАРАКТЕРИСТИКА ВидСвойства
 ЗНАЧЕНИЕ Свойство }

В данном примере описываются характеристики для полей типа Справочник.Номенклатура.

В описании характеристики указывается:

  1. Тип, для которого определяются характеристики
  2. Описание списка характеристик
  3. Описание значений характеристик

Тип, для которого определяются характеристики

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

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

В предложении ХАРАКТЕРИСТИКИ тип указывается в скобках после ключевого слова ТИП. Синтаксис описания типа такой же, как в описании типа конструкции ВЫРАЗИТЬ языка запроса. Типы, входящие в составной тип перечисляются через запятую.

Описание списка характеристик

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

О каждой характеристике системе необходимо знать следующую информацию:

  1. Идентификатор - внутренний идентификатор характеристики - по данному свойству характеристика будет находиться  в списке значений характеристик. Идентификатор может иметь любой тип, для которого может использоваться сравнение в языке запросов.
  2. Имя характеристики - имя, под которым пользователь вводил характеристику. Например, масса, длина, рост и т.п. Значение этого свойства будет использоваться в качестве имени поля, создаваемого для характеристики.
  3. Тип значения характеристики - значения какого типа могут содержаться в характеристике. Данная информация используется, в отборе для фильтрации по полю - характеристике. Может иметь тип ОписаниеТипов, либо произвольное значение. В случае если тип значения содержит описание типов, то данное описание типов будет использовано как тип значения характеристики. Если тип значения содержит произвольное значение, то типом характеристики будет тип данного значения. Например, если в качестве типа значения используется числовое значение, то типом характеристики будет Число. Если тип значения характеристики не указан, то типом будет считаться тип Булево.

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

Рассмотрим пример. Будем описывать характеристики для поля типа Справочник.Номенклатура.

Допустим, в нашей конфигурации есть план видов характеристик ВидыДопСвойств, содержащий следующие записи:

Ссылка

ПометкаУдаления

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

Код

Наименование

ТипЗначения

Масса

ложь

ложь

000000001

Масса

Число

Ширина

ложь

ложь

000000003

Ширина

Число

Высота

ложь

ложь

000000004

Высота

Число

В качестве идентификатора характеристики будем использовать поле Ссылка. В качестве имени характеристик - Наименование. А в качестве типа значения - поле ТипЗначения.

Таким образом, система получит следующий список характеристик:

Идентификатор

Имя

ТипЗначения

Масса

Масса

Число

Ширина

Ширина

Число

Высота

Высота

Число

Пусть в отчете имеется поле Номенклатура, типа Справочник.Номенклатура. На основе списка характеристик система автоматически создаст для этого поля три поля: МассаШиринаВысота. Тип всех полей будет Число.

 

Как видно, данные поля отображаются в списке реквизитов поля Номенклатура и ничем не отличаются от обычных реквизитов.

Результат отчета, в который выводятся поля - характеристики, может выглядеть так:

Номенклатура

Код

Масса

Лазерный принтер 5250197-203 Minolta-QMS

0000031

5 800

Лазерный принтер Canon LBP-810

0000030

4 300

Лазерный принтер HP LaserJet 2200

0000032

 

В данном примере в отчет выводится характеристика Масса.

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

Список характеристик описывается при помощи ключевых слов СПИСОКИДЕНТИФИКАТОРИМЯТИПЗНАЧЕНИЯ. После ключевого слова СПИСОК идет имя таблицы, из которой получается список характеристик, либо в скобках текст запроса, при помощи которого получается список характеристик. После ключевых слов ИДЕНТИФИКАТОРИМЯТИПЗНАЧЕНИЯ указываются имена полей для получения идентификатора, имени и типа значений характеристики соответственно.

Пример:

{ХАРАКТЕРИСТИКИ
 ТИП(Справочник.Номенклатура)
 СПИСОК ПланВидовХарактеристик.ВидыДопСвойств
 ИДЕНТИФИКАТОР Ссылка
 ИМЯ Наименование
 ТИПЗНАЧЕНИЯ ТипЗначения
 ЗНАЧЕНИЯ РегистрСведений.ДопСвойства
 ОБЪЕКТ Номенклатура
 ХАРАКТЕРИСТИКА ВидСвойства
 ЗНАЧЕНИЕ Свойство }

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

Пример с получением списка характеристик из запроса:

{ХАРАКТЕРИСТИКИ
 ТИП(Справочник.Номенклатура)
 СПИСОК (ВЫБРАТЬ
   ВидыДопСвойств.Ссылка,
   ВидыДопСвойств.Наименование,
   ВидыДопСвойств.ТипЗначения
  ИЗ
   ПланВидовХарактеристик.ВидыДопСвойств КАК ВидыДопСвойств
  ГДЕ
   ВидыДопСвойств.ПометкаУдаления = ЛОЖЬ)
 ИДЕНТИФИКАТОР Ссылка
 ИМЯ Наименование
 ТИПЗНАЧЕНИЯ ТипЗначения
 ЗНАЧЕНИЯ РегистрСведений.ДопСвойства
 ОБЪЕКТ Номенклатура
 ХАРАКТЕРИСТИКА ВидСвойства
 ЗНАЧЕНИЕ Свойство }

В конструкторе запросов характеристики описываются на закладке Характеристики.

 

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

При необходимости получения списка характеристик при помощи запроса, в конструкторе следует указать в качестве источника Запрос и создать запрос.

 

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

Описание значений характеристик

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

Для получения характеристик системе необходима следующая информация:

  1. Из какой таблицы или запроса получать значения характеристик
  2. Поле - идентификатор характеристики. В данном поле будет искаться значение идентификатора, полученного в списке характеристик.
  3. Поле - идентификатор объекта. С данным полем будет осуществляться связь поля исходного запроса, для которого требуется получить значение характеристики.
  4. Поле - значение характеристики. Из данного поля будет получаться значение характеристики. Если поле - значение не указано, то значение характеристики будет иметь значение Истина, в случае, если в таблице будет найдена запись для характеристики объекта и Ложь в противном случае.

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

Номенклатура

ВидСвойства

Свойство

Лазерный принтер 5250197-203 Minolta-QMS

Ширина

630

Лазерный принтер 5250197-203 Minolta-QMS

Высота

320

Лазерный принтер 5250197-203 Minolta-QMS

Масса

5 800

Лазерный принтер Canon LBP-810

Масса

4 300

Лазерный принтер Canon LBP-810

Ширина

470

Лазерный принтер Canon LBP-810

Высота

310

Идентификатором характеристики в данной таблице является поле ВидСвойства. Объектом - поле Номенклатура. А значение находится в поле Свойство. В запросе описание получения значений характеристик будет выглядеть так:

{ХАРАКТЕРИСТИКИ
 ТИП(Справочник.Номенклатура)
 СПИСОК ПланВидовХарактеристик.ВидыДопСвойств
 ИДЕНТИФИКАТОР Ссылка
 ИМЯ Наименование
 ТИПЗНАЧЕНИЯ ТипЗначения
 ЗНАЧЕНИЯ РегистрСведений.ДопСвойства
 ОБЪЕКТ Номенклатура
 ХАРАКТЕРИСТИКА ВидСвойства
 ЗНАЧЕНИЕ Свойство }

После ключевого слова ЗНАЧЕНИЯ указывается имя таблицы, из которой будут получаться значения характеристики, или, в скобках, текст запроса, при помощи которого будут получаться значения. После ключевого словаОБЪЕКТ указывается имя поля, в котором содержится объект. После слова ХАРАКТЕРИСТИКА указывается поле - идентификатор характеристики, а поле ЗНАЧЕНИЕ - имя поля, из которого будут получаться значения характеристики.

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

Пример. Пусть исходный запрос набора данных схемы компоновки данных содержал следующий запрос:

ВЫБРАТЬ
 РасходнаяНакладнаяСостав.Ссылка КАК Документ,
 РасходнаяНакладнаяСостав.Номенклатура,
 РасходнаяНакладнаяСостав.Количество,
 РасходнаяНакладнаяСостав.Цена,
 РасходнаяНакладнаяСостав.Сумма,
 РасходнаяНакладнаяСостав.НомерСтроки
ИЗ
 Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
{ХАРАКТЕРИСТИКИ
 ТИП(Справочник.Номенклатура)
 СПИСОК ПланВидовХарактеристик.ВидыДопСвойств
 ИДЕНТИФИКАТОР Ссылка
 ИМЯ Наименование
 ТИПЗНАЧЕНИЯ ТипЗначения
 ЗНАЧЕНИЯ РегистрСведений.ДопСвойства
 ОБЪЕКТ Номенклатура
 ХАРАКТЕРИСТИКА ВидСвойства
 ЗНАЧЕНИЕ Свойство }

Пользователь указал, что в отчет нужно выводить поля НоменклатураНоменклатура.Масса и Номенклатура.Высота.

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

ВЫБРАТЬ
 РасходнаяНакладнаяСостав.Номенклатура КАК Номенклатура,
 ПРЕДСТАВЛЕНИЕССЫЛКИ(РасходнаяНакладнаяСостав.Номенклатура) КАК НоменклатураПредставление,
 ДопСвойства.Свойство КАК Свойство,
 ДопСвойства1.Свойство КАК Свойство1
ИЗ
 Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДопСвойства КАК ДопСвойства
  ПО (ДопСвойства.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
    И ДопСвойства.ВидСвойства = &П)
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДопСвойства КАК ДопСвойства1
  ПО (ДопСвойства1.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
    И ДопСвойства1.ВидСвойства = &П2)

Значения параметров: П = Масса, П2 = Высота

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

Использование категорий

При помощи механизма характеристик системы компоновки данных можно описывать и категории - характеристики, не имеющие значений, а имеющие лишь признак наличия/отсутствия.

Рассмотрим пример.

Допустим, список категорий хранится в справочнике Категории, содержащей следующие записи:

Ссылка

ПометкаУдаления

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

Код

Наименование

Импортные

ложь

ложь

000000001

Импортные

Бухгалтерия

ложь

ложь

000000002

Бухгалтерия

В регистре сведений КатегорииНоменклатуры содержатся установленные категории номенклатуры:

Номенклатура

Категория

Принтер HP DeskJet 1500

Импортные

1С:Бухгалтерия  7.7 Базовая версия

Бухгалтерия

1С:Бухгалтерия  7.7 Стандартная  версия

Бухгалтерия

1С:Бухгалтерия  ПРОФ версия 7.7

Бухгалтерия

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

{ХАРАКТЕРИСТИКИ
 ТИП(Справочник.Номенклатура)
 СПИСОК Справочник.Категории
 ИДЕНТИФИКАТОР Ссылка
 ИМЯ Наименование
 ЗНАЧЕНИЯ РегистрСведений.КатегорииНоменклатуры
 ОБЪЕКТ Номенклатура
 ХАРАКТЕРИСТИКА Категория }

Как видно, в описании характеристик не указано поле ТипЗначения, а в таком случае, считается, что характеристика имеет логический тип. Кроме того, не указано поле, из которого будет получаться значение характеристики. В таком случае считается, что значение характеристики Истина в случае, если характеристика для объекта присутствует в таблице значений характеристик и Ложь в противном случае.

При таких условиях в полях - реквизитах поля Номенклатура появятся дополнительные поля:

 

Если пользователь укажет, что поле Номенклатура.Бухгалтерия необходимо выводить в результат, то запрос в макете компоновки данных будет выглядеть следующим образом:

ВЫБРАТЬ
 РасходнаяНакладнаяСостав.Номенклатура КАК Номенклатура,
 ПРЕДСТАВЛЕНИЕССЫЛКИ(РасходнаяНакладнаяСостав.Номенклатура) КАК НоменклатураПредставление,
 ВЫБОР
  КОГДА КатегорииНоменклатуры.Номенклатура ЕСТЬ НЕ NULL
   ТОГДА ИСТИНА
  ИНАЧЕ ЛОЖЬ
 КОНЕЦ КАК Поле1
ИЗ
 Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КатегорииНоменклатуры КАК КатегорииНоменклатуры
  ПО (КатегорииНоменклатуры.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
    И КатегорииНоменклатуры.Категория = &П)

Как видно, запрос аналогичен запросу, формируемому для обычных характеристик. Исключение составляет получение значения характеристики. В данном случае это следующая конструкция:

 ВЫБОР
  КОГДА КатегорииНоменклатуры.Номенклатура ЕСТЬ НЕ NULL
   ТОГДА ИСТИНА
  ИНАЧЕ ЛОЖЬ
 КОНЕЦ

Как видно, результатом данного выражения будет Истина, в случае если связь выполнилась, т.е. категория установлена, и Ложь в противном случае.

 

 

Скачать файлы

Наименование Файл Версия Размер
Использование характеристик в системе компоновки данных.pdf 9
.pdf 272,72Kb
29.07.10
9
.pdf 272,72Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Николай ~ ~ (kuzyara) 25.06.14 06:05
Зачем компоновщик макета при установке отбора на характеристику делает выборку левым соединением, когда логичнее и быстрее было бы сначала найти всю номенклатуру с характеристикой и добавить строчку к основному запросу "ГДЕ Номенклатура В (ВЫБРАТЬ СписокНоменклатурыСХарактеристиками)". Особенно это касается виртуальных регистров и когда нам номенклатура в полях не нужна.

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