Планы видов характеристик в 1С 8.х

Часто возникает необходимость задать какие-то дополнительные свойства для уже существующих в базе элементов. Стандартно для этого используется "реквизит" справочника. Но что делать разработчику конфигурации, если он не хочет добавлять 1000 реквизитов "на все случаи" в свой справочник, а лишать пользователя такой возможности не хочет? Правильно, надо разработать систему которая позволит пользователю самостоятельно добавить к целевому справочнику новое свойство, не заходя в конфигуратор.

Например, клиенту надо добавить "пол" (Муж, Жен). Если в справочнике "контрагенты" нет такого реквизита, то можно воспользоваться универсальными "свойствами" и задать новое свойство для справочника прямо во время работы, ну конечно программист должен предварительно предоставить такую возможность пользователю.

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

1. Определим костяк системы хранения свойств.

Для начала создадим новый план видов характеристик.

  • В наименовании зададим произвольное наименование
  • В типе значений зададим какой тип могут принимать эти дополнительные свойства (которые будет создавать пользователь)
  • В поле "дополнительные значения характеристик" пока ничего не выбираем.
  • Записываем план видов характеристик.

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

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

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

  • В регистре надо для "объекта" задать в "тип данных" те справочники какие могут иметь по вашему мнению свойства, например "номенклатура" и "клиенты" (т.е. смешанный тип для измерения "объект"). Не забудьте сделать измерение "объект" "ведущим".
  • Для измерения "характеристика" надо выбрать собственно сам тип ПВХ "свойства справочников".
  • Для ресурса "Значение свойства" необходимо выбрать особый тип ХАРАКТЕРИСТИКА - "СвойстваСправочников" (не путать с ПВХ, см. скрин)

Также в ресурсе "Значение свойства" надо указать связку с измерением "характеристика":

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

2. Тестирование плана видов характеристик.

Создадим нового клиента в режиме предприятия, видим ссылку на свойства (если не видите проверьте свойство "ведущий" у объекта в регистре).

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

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

Теперь создадим еще одно свойство "оборот в месяц". Т.к. оборот будет уникальным для каждого клиента, то нет смысла выбирать его из вспомогательного справочника, зададим свойству тип "число".

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

Тут же потестируем свойства номенклатуры. Создадим новую карточку товара. Также видим ссылку на свойства.

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

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

Выбрав тип строка мы разрешили пользователю в это свойство вбивать произвольную строку, например "37-46".

3. Фильтрация свойств по типу объекта

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

Для этих целей добавим в ПВХ реквизит, который будет указывать на все виды объектов, на которые можно назначать это свойство. Реквизит сделали а какой "тип" ему назначить? Ведь этот реквизит и сам должен хранить тип, а еще лучше список типов (на случай если свойство действует на несколько видов объектов). Получается в этот новый реквизит надо выбирать "список типов".

В типовых конфигурациях для хранения этого самого "списка типов" сделали отдельный регистр и еще один план видов характеристик. Мы не будем так усложнять пример и сделаем более легкий способ, просто перечислим типы через запятую в этом поле. Таким образом для реквизита назначаем тип "строка 100". А в режиме предприятия тут через запятую укажем виды справочников.

В режиме предприятия от руки впишем целевые виды объектов в новый реквизит

В конфигураторе, создадим форму записи регистра, переопределим выбор характеристики (подсунем свой список)

&НаКлиенте
Процедура ХарактеристикаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ДанныеВыбора = ПолучитьДоступныеХарактеристики(Запись.Объект);
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьДоступныеХарактеристики(Объект)
	мИмяТипа = Объект.Метаданные().Имя;
	Запрос = Новый Запрос();
	Запрос.Текст = "ВЫБРАТЬ
	               |	СвойстваСправочников.Ссылка КАК Ссылка
	               |ИЗ
	               |	ПланВидовХарактеристик.СвойстваСправочников КАК СвойстваСправочников
	               |ГДЕ
	               |	СвойстваСправочников.НазначениеХарактеристики ПОДОБНО &НазначениеХарактеристики";
	Запрос.Параметры.Вставить("НазначениеХарактеристики", "%"+мИмяТипа+"%");
	Массив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
	СписокХарактеристик = Новый СписокЗначений;
	СписокХарактеристик.ЗагрузитьЗначения(Массив);
	Возврат СписокХарактеристик;
КонецФункции

Укажем что не надо показывать историю выбора характеристики (чтобы платформа не выдала ту характеристику которую мы хотим скрыть)

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

 

4. Красивая фильтрация в отчетах на СКД по свойствам.

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

Необходимо в свойствах справочника указать в специальной таблице где хранятся свойства объекта, после этого СКД автоматически подтянет их как будто это обычные реквизиты справочника!

Открыть свойства справочника, перейти на вкладку "Данные", нажать "Характеристики"

Добавить в таблицу новую строчку и заполнить, примерно как на рисунке:

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

В отчетах в режиме предприятия можно задавать свойства и как отборы и как измерения

На этом тема по ПВХ закрыта, удачного программирования!

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