Например, если взять наш документ «ОказаниеУслуги», то в поле, хранящем реквизит табличной части «Номенклатура» на самом деле находится внутренний идентификатор, указывающий на элемент справочника «Номенклатура»:

приводит к тому, что мы просто читаем данные, хранящиеся в оперативной памяти:
Ссылка |
Ссылка на Номенклатуру?


Однако когда мы обращаемся к виду номенклатуры как к реквизиту того элемента справочника, ссылка на который указана в табличной части документа:


![]()
Когда в обработчике события «ОбработкаПроведения» документа «ОказаниеУслуги» мы присваиваем з^начение реквизита «Номенклатура» табличной части какой-либо переменной, мы имеем дело с объектом ДокументОбъект. ОказаниеУслуги. Этот объект содержит в себе значения всех реквизитов документа и реквизитов его табличных частей. Поэтому обращение:
Если ТекСтрокаПереченьНоменклатуры. Номенклатура. ВидНоменклатуры о
___________________________ Перечисления. ВидыНоменклатуры. Материал Toгда
Движение. Материал = ТекСтрокаПереченьНоменклатуры. Номенклатура;


234
235
Использование основных объектов конфигурации
Оптимизация процедуры проведения документа ОказаниеУслуги
произойдет буквально следующее: |
Ссылка на ВидНоменклатуры? |
Ссылка © |

Поскольку в объекте ДокументОбъект. ОказаниеУслуги есть только ссылка на элемент справочника «Номенклатура» и больше никаких данных об этом элементе нет, система возьмет эту ссылку и обратится по ней в кэш объектов, в надежде найти там данные того объекта, ссылка на который у нее есть. Если кэш объектов не будет иметь нужных данных, он обратится к базе данных с тем, чтобы прочитать все данные объекта, ссылкой на который он обладает. После того, как все данные, хранящиеся в реквизитах нужного элемента справочника и в реквизитах его табличных частей, будут считаны в кэш объектов, кэш объектов вернет запрашиваемую ссылку, хранящуюся в реквизите «ВидНоменклатуры» справочника «Номенклатура».
Как несложно догадаться, подобное обращение к базе данных требует гораздо большего количества времени, нежели просто чтение из оперативной памяти. При интерактивном заполнении документа, подобные задержки ничтожно малы, по сравнению со скоростью работы пользователя. Однако при выполнении большого количества расчетов (например, при проведении больших документов, содержащих несколько тысяч строк), разница во времени может быть довольно заметной.
*■ Узнай больше!
Более подробно об устройстве кэша объектов можно прочитать в главе «Кэш объектов» на странице 554.
Из всего вышесказанного можно сделать следующий вывод: если алгоритм проведения документа использует только те данные, которые присутствуют в реквизитах документа (и его табличных частей), вполне достаточно использовать конструктор движений документа (как это было у нас в случае с документом «ПриходнаяНакладная»). Если же в алгоритме проведения требуется анализировать дополнительные реквизиты объектов, ссылки на которые содержатся в документе, а также использовать результаты расчета итогов регистров, - следует использовать запросы для более быстрой выборки данных из базы данных.
To же самое справедливо в отношении выполнения любых участков программы, критичных по производительности. Механизм запросов лучше «читает» информационную базу и может за один раз выбрать все необходимые данные, поэтому, например, в типовых решениях вы практически не увидите использования объекта СправочникВыборка^имя>.

236
237
Использование основных объектов конфигурации
Оптимизация процедуры проведения документа ОказаниеУслуги



Оптимизация документа ОказаниеУслуги
П |
ервое, что мы сделаем для оптимизации документа «ОказаниеУслуги» - удалим реквизит табличной части «Стоимость», который нам не понадобится в будущем.
Также следует удалить соответствующую колонку из табличного поля, расположенного в форме.
После этого можно полностью удалить содержимое обработчика события «ОбработкаПроведения» в модуле документа и создать в нем заготовку процедуры проведения. Текст запроса, выполняемого в режиме оперативного проведения, будет отличаться от запроса, выполняемого при неоперативном проведении, поэтому формирование текста запроса мы включим в условие Если... Иначе... КонецЕсли:
Процедура ОбработкаПроведения(Отказ, Режим)
Запрос = Новый Запрос;
Если Режим = РежимПроведенияДокумента. Оперативный Тогда Запрос. Текст =
Иначе Запрос. Текст =
КонецЕсли; КонедПроцедуры
Вызовем конструктор запроса и раскроем таблицу
«ПереченьНоменклатуры» табличной части документа
«ОказаниеУслуги» и выберем из нее поля:
• «Номенклатура»,
• «Количество»,
• «ВидНоменклатуры»,
• «Сумма».
Эти поля будут нужны нам для задания значений измерений регистров и их ресурсов. Кроме того, поле «ВидНоменклатуры» понадобится нам для анализа того, чем является номенклатура, указанная в документе: материалом или услугой:
![]()
Теперь задумаемся о том, что для указания значений ресурса «Стоимость» регистров «СтоимостьМатериалов» и «Продажи» нам понадобится рассчитать текущую стоимость номенклатуры как частное стоимости остатка этого материала и его оставшегося количества.
Поэтому добавим к списку выбранных таблиц еще две таблицы:
• «РегистрНакопления. СтоимостьМатериалов. Остатки»,
• «РегистрНакопления. ОстаткиМатериалов. Остатки»:
![]()
Для этих виртуальных таблиц нам нужно будет задать параметры. Эти параметры будут одинаковы для обеих таблиц. Они будут включать в себя момент времени, на который должны быть получены остатки этих регистров, и условие получения данных.

238
239
Использование основных объектов конфигурации
Оптимизация процедуры проведения документа ОказаниеУслуги


Условие получения данных указывает, что остатки должны быть получены только по тем позициям номенклатуры, которые содержатся в проводимом документе (перед выполнением запроса мы передадим в параметр «СписокНоменклатурыДокумента» список всех позиций номенклатуры, содержащихся в проводимом документе):

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

f Узнай больше!
Следует внимательно подходить к использованию виртуальных таблиц запросов. В частности, необходимо уделять особое внимание максимально возможному использованию параметров этих таблиц. Например, в нашем случае можно было бы и не использовать параметр «Условие», а ограничить выбранные поля уже в самом запросе, указав вусловии ПОравенство номенклатуры из документа и материала из таблицы остатков. В результате мы получили бы тот же самый результат, однако no производительности этот способ сильно отличался бы от того, который мы используем.
В самом деле, в нашем варианте виртуальная таблица предоставит нам ровно столько записей, сколько различных элементов номенклатуры содержится в проводимом документе. Если же не указывать условие, виртуальная таблица предоставит нам записи no абсолютно всем элементам номенклатуры, информация о которых есть в регистре накопления. И уже в самом нашем запросе мы будем отбирать из этой огромной массы записей лишь несколько, которые нам действительно нужны.
Очевидно, что второй вариант будет работать дольше, и время выполнения такого запроса будет зависеть в основном не от количества данных, содержащихся в документе (т. е. реального количества обрабатываемой информации), а от размера регистра накопления.

Теперь вспомним о том, что документы «ОказаниеУслуги» могут быть проведены как в оперативном, так и в неоперативном режиме.
*" Узнай больше!
О концепции оперативного и неоперативного проведения документов можно прочитать в главе «Концепция оперативного и неоперативного проведения документов» на странице 541.
Поскольку в оперативном режиме нам понадобится контролировать остатки списываемой номенклатуры на складе, выберем еще раз виртуальную таблицу регистра накопления «ОстаткиМатериалов» и переименуем ее в «ОстаткиМатериаловОстаткиНаСкладе»:


240
241
Использование основных объектов конфигурации
Для этой виртуальной таблицы мы также укажем тп
«МоментВремени», а в условии напишем, что материал должен находиться в списке номенклатуры и склад должен быть равен складу указанному в документе:

Теперь из этой виртуальной таблицы мы выберем поле «КоличествоОстаток»:

На этом формирование списка выбранных полей закончено, и мы можем перейти к заданию условий связи между выбранными таблицами. Каждая из виртуальных таблиц должна быть связана с таблицей документа таким образом, что для всех записей таблицы документа должны подбираться имеющиеся записи виртуальной таблицы, причем номенклатура в таблице документа должна быть равна материалу из виртуальной таблицы:
Оптимизация процедуры проведения документа ОказаниеУслуги
Теперь перейдем на закладку «Дополнительно» и установим флаг «Для изменения». Предложение ДЛЯ ИЗМЕНЕНИЯ позволяет заблаговременно заблокировать чтение указанных данных (которые мОгут читаться транзакцией другого соединения) уже при считывании, чтобы исключить взаимные блокировки при записи. Это предложение дает возможность указать в запросе таблицы, считываемые данные которых предполагается изменять.
<*- Узнай больше!
Более подробно об использовании предложения ДЛЯИЗМЕНЕНИЯ можно прочесть на диске ИТС (информационно-технологического сопровождения) в статье «Использование предложения ДЛЯ ИЗМЕНЕНИЯ в языке запросов».
Поскольку мы с вами планируем выполнить запись регистров накопления «ОстаткиМатериалов» и «СтоимостьМатериалов», укажем таблицы этих регистров в качестве таблиц для изменения:

|
Перейдем на закладку «Условия» и зададим условие отбора из таблицы документа только строк проводимого документа (ссылка на него будет передана в параметр запроса «Ссылка»):
|
|


242
243
Использование основных объектов конфигурации
Оптимизация процедуры проведения документа ОказаниеУслуги
![]()

Перейдем на закладку «Псевдонимы» и зададим следующИе псевдонимы полей:
• «НоменклатураВидНоменклатуры» - «ВидНоменклатуры»,
• «КличествоОстатокЬ> - «КоличествоНаСкладе».
Нажмем «ОК» и посмотрим, какой текст запроса сформировал конструктор:
| ОказаниеУслугиПереченьНоменклатуры. Ссылка = &Ссылка
|ДЛЯ ИЗМЕНЕНИЯ
| РегистрНакопления. ОстаткиМатериалов. Остатки, | РегистрНакопления. СтоимостьМатериалов. Остатки"; Иначе Запрос. Текст =
КонецПроцедуры





Процедура ОбработкаПроведения(Отказ, Режим) Запрос = Новый Запрос; Если Режим = РежимПроведенияДокумента. Оперативный Тогда
Запрос. Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры. Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры. Количество,
| ОказаниеУслугиПереченьНоменклатуры. Номенклатура. ВидНоменклатуры
| КАК ВидНоменклатуры.
I ОказаниеУслугиПереченьНоменклатуры. Сумма,
I ОстаткиМатериаловОстатки. КоличествоОстаток,
I СтоимостьМатериаловОстатки. СтоимостьОстаток,
I ОстаткиМатериаловОстаткиНаСкладе. КоличествоОстаток
I КАК КоличествоОстатокНаСкладе
«ИЗ
I Документ. ОказаниеУслуги. ПереченьНоменклатуры
1 КАК ОказаниеУслугиПереченьНоменклатуры
I ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. СтоимостьМатериалов. Остатки(
I &МоментВремени,
I Материал В (&СписокНоменклатурыДокумента))
I КАК СтоимостьМатериаловОстатки
1 ПО ОказаниеУслугиПереченьНоменклатуры. Номенклатура =
t СтоимостъМатериаловОстатки. Материал
I ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. ОстаткиМатериалов. Остатки(
1 &МоментВремени,
I Материал В (&СписокНоменклатурыДокумента))
I КАК ОстаткиМатериаловОстатки
I ПО ОказаниеУслугиПереченьНоменклатуры. Номенклатура =
I ОстаткиМатериаловОстатки. Материал
I ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. ОстаткиМатериалов. Остатки(
I &МоментВремени,
I Материал В (&СписокНоменклатурыДокумента) И
I Склад = &СкладВДокументе)
I КАК ОстаткиМатериаловОстаткиНаСкладе
I ПО ОказаниеУслутиПереченьНоменклатуры. Номенклатура =
I ОстаткиМатериаловОстаткиНаСкладе. Материал
1ГДЕ __
Как видите, в запросе нет ничего сложного за исключением, быть может, трех левых соединений с таблицей табличной части документа и использования ключевого предложения ДЛЯ ИЗМЕНЕНИЯ, значение которого было объяснено выше.
Текст запроса для случая неоперативного проведения документа будет практически таким же, за исключением того, что в нем будет отсутствовать третье левое соединение и, соответственно, поле «КоличествоОстатокНаСкладе», т. к. проверку остатков в этом случае мы выполнять не будем:
Иначе
Запрос. Текст = "ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры. Номенклатура, | ОказаниеУслугиПереченьНоменклатуры. Количеотво, | ОказаниеУслугиПереченьНоменклатуры. Номенклатура. ВидНоменклатуры | КАК ВидНоменклатуры, | ОказаниеУслугиПереченьНоменклатуры. Сумма, | ОстаткиМатериаловОстатки. КоличествоОстаток, | СтоимостьМатериаловОстатки. СтоимостьОстаток |ИЗ
| Документ. ОказаниеУслуги. ПереченьНоменклатуры | КАК ОказаниеУслугиПереченьНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. СтоимостьМатериалов. Остатки(
&МоментВремени,
Материал В (&СписокНоменклатурыДокумента)) I КАК СтоимостьМатериаловОстатки
I ПО ОказаниеУслугиПереченьНоменклатуры. Номенклатура =
I СтоимостьМатериаловОстатки. Материал
I ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. ОстаткиМатериалов. Остатки(
I &МоментВремени,
Материал В (&СписокНоменклатурыДокумента)) I КАК ОстаткиМатериаловОстатки I ПО ОказаниеУслугиПереченьНоменклатуры. Номенклатура =

244
245
Использование основных объектов конфигурации
Оптимизация процедуры проведения документа ОказаниеУслуги
![]()









| ОстаткиМатериаловОстатки. Материал
|
|ГДЕ
| ОказаниеУслугиПереченьНоменклатуры. Ссылка = &Ссылка |
|ДЛЯ ИЗМЕНЕНИЯ
| РегистрНакопления. ОстаткиМатериалов. Остатки, | РегистрНакопления. СтоимостьМатериалов. Остатки"; КонецПроцедуры
Теперь добавим в текст обработчика задание параметров запроса:
Заирос. УстановитъПараметр("СкладВДокументе",Склад);
Иначе
Запрос. Текст = "ВЫБРАТЪ
| РегистрНакопления. ОстаткиМатериалов. Остатки"; КонецЕсли;
Запрос. УстановитьПараметрС'МоментВремени", МоментВремени()); Запрос. УстановитьПараметрО'СписокНоменклатурыДокумента",
ПереченьНоменклатуры. ВыгрузитьКолонку("Номенклатура")); Запрое. УстановитьПараметр("Ссылка",Ссылка);
Обратите внимание, что для формирования списка номенклатуры документа мы используем метод ВыгрузитьКолонку() объекта ДокументТабличнаяЧасть. ОказаниеУслуги. ПереченьНоменклат УРЫ.
После этого добавим получение результата запроса и цикл его обхода:
КонецЕсли;
Запрос. УстановитьПараметрС'МоментВремени", МоментВремени());
Запрос. УстановитьПараметрС'СписокНоменклатурыДокумента",
ПереченъНоменклатуры. ВыгрузитьКолонку(" Номенклатура")); Запрос. УстановитьПараметр("Ссылка",Ссылка);
ВыборкаРезультатаЗапроса = Запрос. Выполнить().Выбрать(); Пока ВыборкаРезультатаЗапроса. Следующий() Цикл
КонецЦикла;
КонецПроцедуры_____________________________________________________
Теперь, прежде чем начать формирование движений по регистрам, нам нужно проверить наличие на складе достаточного количества номенклатуры:
КонецЕсли;
Запрос. УстановитьПараметр("МоментВремени", МоментВремени()); Запрос. УстановитьПараметр("СписокНоменклатурыДокумента",
ПереченьНоменклатуры. ВыгрузитьКолонкуС'Номенклатура")); Запрос. УстановитьПараметр("Ссылка",Ссылка);
ВыборкаРезультатаЗапроса = Запрос. Выполнить().Выбрать(); Пока ВыборкаРезультатаЗапроса. Следующий() Цикл
//Проверить остаток при оперативном проведении - Если Режим = РежимПроведенияДокумента. Оперативный Тогда Если ВыборкаРезультатаЗапроса. ВидНоменклатуры =
Перечисления. ВидыНоменклатуры. Материал Тогда Остаток = ?(Вы6оркаРезультатаЗапроса. КоличествоОстатокНаСкладе = NuH,
0,ВыборкаРезультатаЗапроса. КоличествоОстатокНаСкладе); Если Остаток < ВыборкаРезультатаЗапроса. Количество Тогда Сообщить("Материала " +
СокрЛП(ВыборкаРезультатаЗапроса. Номенклатура) +
" имеется только " + Остаток);
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;

246
247
Использование основных объектов конфигурации
Оптимизация процедуры проведения документа ОказаниеУслуги


![]()



КонедЕсли;
КонецЦикла; КонецПроцедуры
И в заключение добавим формирование движений по регистрам накопления:
КонецЕсли;
Запрос. УстановитьПараметр(" МоментВремени", МоментВремени());
Запрос. УстановитьПараметр(" СписокНоменклатурыДокумента",
ПереченьНоменклатуры. ВыгрузитьКолонкуС'Номенклатура")); Запрос. УстановнтьПараметр(" Ссылка" ,Ссылка);
ВыборкаРезультатаЗапроса = Запрос. Вьшолнить().Выбрать(); Пока ВыборкаРезультатаЗапроса. Следующий() Цикл
//Провернть остаток при оперативном проведении Если Режим — РежимПроведенияДокумента. Оперативный Тогда Если ВыборкаРезультатаЗапроса. ВидНоменклатуры =
Перечисления. ВидыНоменклатуры. МатериалТогда Остаток = ?(ВыборкаРезультатаЗапроса. КоличествоОстатокНаСкладе = Null,
0, ВыборкаРезультатаЗапроса. КоличествоОстатокНаСкладе); Если Остаток < ВыборкаРезультатаЗапроса. Количество Тогда Сообщить("Материала" +
СокрЛП(ВыборкаРезультатаЗапроса. Номенклатура) + " имеется только " + Остаток); Отказ = Истина; Возврат; КонецЕсли; КонецЕсли; КонецЕсли;
//Сформировать движения
Если ВыборкаРезультатаЗапроса. ВидНоменклатуры =
Перечисления. ВидыНоменклатуры. Материал Тогда
// регистр ОстаткиМатериалов Расход
Движение = Движения. ОстаткиМатериалов. Добавить();
Движение. ВидДвижения = ВидДвиженияНакопления. Расход;
Движение. Период = Дата;
Движение. Материал = ВыборкаРезулыатаЗапроса. Ноченклатура;
Движение. Склад = Склад;
Движение. Количество = ВыборкаРезультатаЗапроса. Количество;
// регистр СтоимостьМатериалов Расход
Движение = Движения. СтоимостьМатериалов. Добавить();
Движение. ВидДвижения = ВидДвиженияНакопления. Расход;
Движение. Период = Дата;
Движение. Материал = ВыборкаРезультатаЗапроса. Номенклатура;
//расчитать стоимость материала
СтоимостьМатериала =
?(ВыборкаРезультатаЗапроса. КоличествоОстаток = Null, 0, ВыборкаРезультатаЗапроса. СтоимостьОстаток / ВыборкаРезультатаЗапроса. КоличествоОстаток); Движение. Стоимость = СтоимостьМатериала *
ВыборкаРезультатаЗапроса. Количество; КонецЕсли;
// регистр Продажи
Движение = Движения. Продажи. Добавить();
Движение. Период = Дата;
Движение. Номенклатура = ВыборкаРезультатаЗанроса. Номенклатура;
Движение. Клиент = Клиент;
Движение. Мастер = Мастер;
Движение. Количество = ВыборкаРезультатаЗапроса. Количество;
Движение. Выручка = ВыборкаРезультатаЗапроса. Сумма;
Если ВыборкаРезультатаЗапроса. ВидНоменклатуры =
Перечисления. ВидыНоменклатуры. Материал Тогда
Движение. Стоимость = СтоимостьМатериала *
ВыборкаРезультатаЗапроса. Количество; Иначе
Движение. Стоимость = 0; КонецЕсли; КонецЦикла;
// записать движения регистров Движения. ОстаткиМатериалов. Записать();
Движения. СтоимостьМатериалов. Записан,(); Движения. Продажи. Записать();
КонецПроцедуры
Запустим 1С:Предприятие в режиме отладки и проверим работу нового обработчика события «ОбработкаПроведения», перепроведя все документы «ОказаниеУслуги».
В заключение следует сделать небольшое отступление, которое касается задания параметров виртуальных таблиц, использовавшихся в наших запросах.

248
249
Использование основных объектов конфигурации
Оптимизация процедуры проведения документа ОказаниеУслуги

Как в первом, так и во втором запросах мы использовали условие что материал должен находиться в списке значений, задаваемом одним из параметров запроса:
Что нового мы узнали
![]()




| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. СтоимостьМатериалов. Остатки(
| &МоментВремени,
Материал В (&СписокНоменклатурыДокумента))
Однако, что при большом количестве строк табличной части документа, из которой формируется список номенклатуры документа, возможно более эффективным будет не передача номенклатуры документа в списке значений, а выполнение вложенного запроса:
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. СтоимостьМатериалов. Остатки(
| &МоментВремени,
| Материал В (ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура
| ИЗ
| Документ. ОказаниеУслуги. ПереченьНоменклатуры
| КАК ОказаниеУслугиПереченьНоменклатуры
| ГДЕ ОказаниеУслугиПереченьНоменклатуры. Ссылка =
| &Ссылка))
Выбор одного или другого решения требует сравнительных тестов
и зависит от конкретной информационной базы, размеров документа,
количества одновременно работающих пользователей,
производительности компьютеров и т. д.
Теперь мы можем на некоторое время отвлечься от запросов, с которыми мы достаточно «плотно» работали в этой главе, и обратить свое внимание на не менее интересные возможности, которые предоставляет разработчику платформа 1С:Предприятие 8.0.
- как система 1С:Предприятие выполняет обращение к
ссылочным данным - как используется кэш объектов - почему для доступа к массивам данных информационной
базы предпочтительнее использовать запросы - как запросом получить остатки регистра накопления - когда следует использовать ключевое предложение ДЛЯ
ИЗМЕНЕНИЯ - на что следует обращать внимание при задании
параметров виртуальных таблиц запросов - почему при неоперативном проведении документов не
нужно контролировать остатки
- как и зачем можно передать вложенный запрос в параметры виртуальной таблицы

250
251
План видов характеристик


Глава 7. План видов характеристик
В этой главе мы познакомимся с новым объектом конфигурации - План видов характеристик - и узнаем, каким образом можно использовать этот объект для расширения возможностей нашей конфигурации.
Постановка задачи
З |
адача, которую мы перед собой поставим, будет заключаться в следующем: мы создадим механизм, который позволит пользователю произвольным образом описывать материалы, и, что самое главное, вести учет в разрезе всех тех описаний, которые могут быть заданы пользователем.
Описывать материалы пользователь сможет следующим образом: для каждого материала будет возможность создать некоторые (произвольные) характеристики этого материала (например, цвет, производитель и пр.). Затем, при поступлении материалов можно будет задать конкретные значения интересующих характеристик (например, при поступлении электрических кабелей можно будет указать, что они белого цвета и их сечение равно 2,5 мм2, а при поступлении резиновых шлангов указать, что они черного цвета и произведены на фирме «Fagumit Sp. z о. о.»).
В дальнейшем всегда можно будет получить информацию о том, сколько и каких материалов есть у нас, скажем, белого цвета, или сколько было израсходовано черных резиновых шлангов.
Поскольку заранее не известно, какими именно характеристиками пользователь захочет описать тот или иной материал, мы должны предоставить ему некоторый механизм, позволяющий создавать любые характеристики и, что самое важное, указывать, какой тип значения должен быть у этих характеристик. Тогда при задании значений определенной характеристики пользователь сможет выбирать значения строго в соответствии с указанным типом.
Такую возможность описания характеристик как раз и обеспечивает объект конфигурации План видов характеристик, с которым мы сейчас познакомимся.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |


