Использование дополнительных реквизитов и сведений » История » Версия 9
Версия 8 (Всеволод Дорофеев, 11.02.2020 17:02) → Версия 9/14 (Всеволод Дорофеев, 10.06.2020 17:52)
h1. Использование дополнительных реквизитов и сведений
h3. Использование дополнительных реквизитов и сведений в БП 2.0
* Справочник ЗначенияСвойствОбъектов
* План видов характеристик НазначенияСвойствКатегорийОбъектов
* План видов характеристик СвойстваОбъектов
* Регистр сведений ЗначенияСвойствОбъектов
h3. Использование дополнительных реквизитов и сведений в БП 3.0, УТ11,..
* План видов характеристик ДополнительныеРеквизитыИСведения
* Справочник ЗначенияСвойствОбъектов (Дополнительные значения)
* Справочник ЗначенияСвойствОбъектовИерархия (Дополнительные значения (иерархия))
* Справочник НаборыДополнительныхРеквизитовИСведений
* Регистр сведений ДополнительныеСведения
* Табличная часть "Дополнительные реквизиты" справочников и документов
Пример:
<pre>
//получение доп.реквизита для объекта "Источник"
ЭлементПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Серия", Истина);
НайденнаяСтрока = Источник.ДополнительныеРеквизиты.Найти(ЭлементПВХ, "Свойство");
</pre>
<pre>
//УТ11
//Доп.сведение
ЭлементПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Тип", Истина);
МассивСвойств = новый массив;
МассивСвойств.Добавить(ЭлементПВХ);
ТаблицаСвойств = УправлениеСвойствами.ПолучитьЗначенияСвойств(Источник, ложь, истина, МассивСвойств);
НайденнаяСтрока = ТаблицаСвойств.Найти(ЭлементПВХ, "Свойство");
Если не НайденнаяСтрока = Неопределено Тогда
Значение = НайденнаяСтрока.Значение;
КонецЕсли;
</pre>
<pre>
//Проверим и создадим строковый доп. реквизит к справочнику Номенклатура
&НаСервере
функция ПроверитьДобавитьСтроковыйДопРеквизитДляНоменклатуры(ИмяРеквизита, ДлинаСтроки=0)
//ищем доп. реквизит по заголовку
ЭлПВХ_Ссылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Заголовок",ИмяРеквизита);
Если ЭлПВХ_Ссылка.Пустая() Тогда
//если не найдено, то создадим новый
ЭлПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
ЭлПВХ.Заголовок = ИмяРеквизита;
ЭлПВХ.НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура;
ЭлПВХ.Наименование = ЭлПВХ.Заголовок+" ("+ЭлПВХ.НаборСвойств+")";
ЭлПВХ.ТипЗначения = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(ДлинаСтроки));
ЭлПВХ.Записать();
ЭлПВХ_Ссылка = ЭлПВХ.Ссылка;
КонецЕсли;
//проверим, что реквизит указан в наборе доп. реквизитов заказа покупателя
НаборОб = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура.ПолучитьОбъект();
Если НаборОб.ДополнительныеРеквизиты.Найти(ЭлПВХ_Ссылка, "Свойство") = Неопределено Тогда
//добавим реквизит в набор
СтрНаборОб = НаборОб.ДополнительныеРеквизиты.Добавить();
СтрНаборОб.Свойство = ЭлПВХ_Ссылка;
КонецЕсли;
Если НаборОб.Модифицированность() Тогда
//запишем при необходимости
НаборОб.Записать();
КонецЕсли;
Возврат ЭлПВХ_Ссылка;
КонецФункции
</pre>
<pre>
//Установка доп.реквизита Объекта
&НаСервере
Процедура УстановитьДополнительныйРеквизитОбъекта(Объект, ИмяРеквизита, ЗначениеРеквизита)
ЭлПВХ_Ссылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Заголовок",ИмяРеквизита);
Если ЭлПВХ_Ссылка.Пустая() Тогда
Сообщить("Не найден доп. реквизит "+ИмяРеквизита+", значение не установлено!");
Возврат;
КонецЕсли;
СтрДопРеквизиты = Объект.ДополнительныеРеквизиты.Найти(ЭлПВХ_Ссылка, "Свойство");
Если СтрДопРеквизиты = Неопределено Тогда
СтрДопРеквизиты = Объект.ДополнительныеРеквизиты.Добавить();
КонецЕсли;
СтрДопРеквизиты.Свойство = ЭлПВХ_Ссылка;
СтрДопРеквизиты.Значение = ЗначениеРеквизита;
КонецПроцедуры
</pre>
h3. Установка доп.сведения Объекта
<pre>
&НаСервереБезКонтекста
Функция ЗаписатьЗначениеДополнительногоСведения(Объект, Свойство, Значение)
Попытка
УстановитьПривилегированныйРежим(Истина);
НаборЗаписей = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(Объект);
НаборЗаписей.Отбор.Свойство.Установить(Свойство);
НоваяСтрокаНабора = НаборЗаписей.Добавить();
НоваяСтрокаНабора.Объект = Объект;
НоваяСтрокаНабора.Свойство = Свойство;
НоваяСтрокаНабора.Значение = Значение;
НаборЗаписей.Записать();
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
</pre>
h3. Поиск Объекта по значению доп.сведения
<pre>
&НаСервереБезКонтекста
Функция НайтиОбъектПоДопСведениюСервере(Свойство, Значение)
Рез = неопределено;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеСведения.Объект КАК Объект
|ИЗ
| РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Свойство = &Свойство
| И ДополнительныеСведения.Значение = &Значение";
Запрос.УстановитьПараметр("Значение", Значение);
Запрос.УстановитьПараметр("Свойство", Свойство);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Рез = ВыборкаДетальныеЗаписи.Объект;
КонецЕсли;
Возврат Рез;
КонецФункции
</pre>
h3. Снятие ограничения в 150 символов на длину наименования для дополнительных значений (Справочник.ЗначенияСвойствОбъектов)
https://its.1c.ru/db/v8std#content:746:hdoc
<pre>
#Область ОбработчикиСобытий
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
Поля.Добавить("Наименование");
Поля.Добавить("ПолноеНаименование");
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
//ЛокализацияКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка);
// 1cmanager.ru Снимаем ограничение на длину наименования в 150 символов
Представление = ?(ПустаяСтрока(Данные.ПолноеНаименование), Данные.Наименование, Данные.ПолноеНаименование);
СтандартнаяОбработка = Ложь;
КонецПроцедуры
#КонецОбласти
</pre>
h3. Использование дополнительных реквизитов и сведений в БП 2.0
* Справочник ЗначенияСвойствОбъектов
* План видов характеристик НазначенияСвойствКатегорийОбъектов
* План видов характеристик СвойстваОбъектов
* Регистр сведений ЗначенияСвойствОбъектов
h3. Использование дополнительных реквизитов и сведений в БП 3.0, УТ11,..
* План видов характеристик ДополнительныеРеквизитыИСведения
* Справочник ЗначенияСвойствОбъектов (Дополнительные значения)
* Справочник ЗначенияСвойствОбъектовИерархия (Дополнительные значения (иерархия))
* Справочник НаборыДополнительныхРеквизитовИСведений
* Регистр сведений ДополнительныеСведения
* Табличная часть "Дополнительные реквизиты" справочников и документов
Пример:
<pre>
//получение доп.реквизита для объекта "Источник"
ЭлементПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Серия", Истина);
НайденнаяСтрока = Источник.ДополнительныеРеквизиты.Найти(ЭлементПВХ, "Свойство");
</pre>
<pre>
//УТ11
//Доп.сведение
ЭлементПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Тип", Истина);
МассивСвойств = новый массив;
МассивСвойств.Добавить(ЭлементПВХ);
ТаблицаСвойств = УправлениеСвойствами.ПолучитьЗначенияСвойств(Источник, ложь, истина, МассивСвойств);
НайденнаяСтрока = ТаблицаСвойств.Найти(ЭлементПВХ, "Свойство");
Если не НайденнаяСтрока = Неопределено Тогда
Значение = НайденнаяСтрока.Значение;
КонецЕсли;
</pre>
<pre>
//Проверим и создадим строковый доп. реквизит к справочнику Номенклатура
&НаСервере
функция ПроверитьДобавитьСтроковыйДопРеквизитДляНоменклатуры(ИмяРеквизита, ДлинаСтроки=0)
//ищем доп. реквизит по заголовку
ЭлПВХ_Ссылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Заголовок",ИмяРеквизита);
Если ЭлПВХ_Ссылка.Пустая() Тогда
//если не найдено, то создадим новый
ЭлПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
ЭлПВХ.Заголовок = ИмяРеквизита;
ЭлПВХ.НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура;
ЭлПВХ.Наименование = ЭлПВХ.Заголовок+" ("+ЭлПВХ.НаборСвойств+")";
ЭлПВХ.ТипЗначения = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(ДлинаСтроки));
ЭлПВХ.Записать();
ЭлПВХ_Ссылка = ЭлПВХ.Ссылка;
КонецЕсли;
//проверим, что реквизит указан в наборе доп. реквизитов заказа покупателя
НаборОб = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура.ПолучитьОбъект();
Если НаборОб.ДополнительныеРеквизиты.Найти(ЭлПВХ_Ссылка, "Свойство") = Неопределено Тогда
//добавим реквизит в набор
СтрНаборОб = НаборОб.ДополнительныеРеквизиты.Добавить();
СтрНаборОб.Свойство = ЭлПВХ_Ссылка;
КонецЕсли;
Если НаборОб.Модифицированность() Тогда
//запишем при необходимости
НаборОб.Записать();
КонецЕсли;
Возврат ЭлПВХ_Ссылка;
КонецФункции
</pre>
<pre>
//Установка доп.реквизита Объекта
&НаСервере
Процедура УстановитьДополнительныйРеквизитОбъекта(Объект, ИмяРеквизита, ЗначениеРеквизита)
ЭлПВХ_Ссылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Заголовок",ИмяРеквизита);
Если ЭлПВХ_Ссылка.Пустая() Тогда
Сообщить("Не найден доп. реквизит "+ИмяРеквизита+", значение не установлено!");
Возврат;
КонецЕсли;
СтрДопРеквизиты = Объект.ДополнительныеРеквизиты.Найти(ЭлПВХ_Ссылка, "Свойство");
Если СтрДопРеквизиты = Неопределено Тогда
СтрДопРеквизиты = Объект.ДополнительныеРеквизиты.Добавить();
КонецЕсли;
СтрДопРеквизиты.Свойство = ЭлПВХ_Ссылка;
СтрДопРеквизиты.Значение = ЗначениеРеквизита;
КонецПроцедуры
</pre>
h3. Установка доп.сведения Объекта
<pre>
&НаСервереБезКонтекста
Функция ЗаписатьЗначениеДополнительногоСведения(Объект, Свойство, Значение)
Попытка
УстановитьПривилегированныйРежим(Истина);
НаборЗаписей = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(Объект);
НаборЗаписей.Отбор.Свойство.Установить(Свойство);
НоваяСтрокаНабора = НаборЗаписей.Добавить();
НоваяСтрокаНабора.Объект = Объект;
НоваяСтрокаНабора.Свойство = Свойство;
НоваяСтрокаНабора.Значение = Значение;
НаборЗаписей.Записать();
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
</pre>
h3. Поиск Объекта по значению доп.сведения
<pre>
&НаСервереБезКонтекста
Функция НайтиОбъектПоДопСведениюСервере(Свойство, Значение)
Рез = неопределено;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеСведения.Объект КАК Объект
|ИЗ
| РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Свойство = &Свойство
| И ДополнительныеСведения.Значение = &Значение";
Запрос.УстановитьПараметр("Значение", Значение);
Запрос.УстановитьПараметр("Свойство", Свойство);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Рез = ВыборкаДетальныеЗаписи.Объект;
КонецЕсли;
Возврат Рез;
КонецФункции
</pre>
h3. Снятие ограничения в 150 символов на длину наименования для дополнительных значений (Справочник.ЗначенияСвойствОбъектов)
https://its.1c.ru/db/v8std#content:746:hdoc
<pre>
#Область ОбработчикиСобытий
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
Поля.Добавить("Наименование");
Поля.Добавить("ПолноеНаименование");
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
//ЛокализацияКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка);
// 1cmanager.ru Снимаем ограничение на длину наименования в 150 символов
Представление = ?(ПустаяСтрока(Данные.ПолноеНаименование), Данные.Наименование, Данные.ПолноеНаименование);
СтандартнаяОбработка = Ложь;
КонецПроцедуры
#КонецОбласти
</pre>