#Если НЕ МобильныйАвтономныйСервер Тогда
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
Функция ИдентичнаяХарактеристика(Номенклатура, ХарактеристикаВДокументе) Экспорт
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ХарактеристикиНоменклатуры.Ссылка КАК Ссылка
|ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
|ГДЕ
| ХарактеристикиНоменклатуры.Владелец = &Номенклатура
| И СОКРЛП(ХарактеристикиНоменклатуры.Наименование) В
| (ВЫБРАТЬ
| СОКРЛП(Т.Наименование) КАК Наименование
| ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК Т
| ГДЕ
| Т.Ссылка = &Характеристика)
|;
|
|
|ВЫБРАТЬ
| *
|ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
|ГДЕ
| ХарактеристикиНоменклатуры.Ссылка = &Характеристика");
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Характеристика", ХарактеристикаВДокументе);
РезультатыЗапроса = Запрос.ВыполнитьПакет();
Выборка = РезультатыЗапроса[0].Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
ИначеЕсли РезультатыЗапроса[1].Пустой() Тогда
Возврат Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
КонецЕсли;
ЗначенияЗаполнения = РезультатыЗапроса[1].Выгрузить()[0];
УстановитьПривилегированныйРежим(Истина);
НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(НоваяХарактеристика, ЗначенияЗаполнения,,"Владелец");
НоваяХарактеристика.Владелец = Номенклатура;
Для Каждого ТабличнаяЧасть Из ХарактеристикаВДокументе.Метаданные().ТабличныеЧасти Цикл
НоваяХарактеристика[ТабличнаяЧасть.Имя].Загрузить(ЗначенияЗаполнения[ТабличнаяЧасть.Имя]);
КонецЦикла;
НоваяХарактеристика.Записать();
УстановитьПривилегированныйРежим(Ложь);
Возврат НоваяХарактеристика.Ссылка;
КонецФункции
Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт
НеРедактируемыеРеквизиты = Новый Массив;
НеРедактируемыеРеквизиты.Добавить("Наименование");
НеРедактируемыеРеквизиты.Добавить("ХарактеристикаНоменклатурыДляЦенообразования");
Возврат НеРедактируемыеРеквизиты;
КонецФункции
#Область ДляВызоваИзДругихПодсистем
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтение
|ГДЕ ИСТИНА
|;
|РазрешитьИзменениеЕслиРазрешеноЧтение
|ГДЕ
| ЗначениеРазрешено(Владелец)";
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#КонецЕсли
#Область ОбработчикиСобытий
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
НоменклатураСервер.ХарактеристикиНоменклатурыОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка);
КонецПроцедуры
#КонецЕсли
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
МультиязычностьКлиентСервер.ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка);
КонецПроцедуры
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
МультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка);
КонецПроцедуры
#КонецОбласти
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область СлужебныеПроцедурыИФункции
Функция ВсеРеквизиты(ТипНоменклатуры, ОсобенностьУчета) Экспорт
НастройкиРеквизитовПоТипу = Справочники.Номенклатура.ЗависимостьРеквизитовОтТипаНоменклатуры(ТипНоменклатуры,
ОсобенностьУчета,
Истина,
Ложь,
Истина);
РеквизитыОтключенныеПоФО = Справочники.Номенклатура.РеквизитыОтключенныеПоФО(Истина);
ВсеРеквизиты = Новый Структура;
Для Каждого Реквизит Из Метаданные.Справочники.ХарактеристикиНоменклатуры.Реквизиты Цикл
Если СтрНайти(Реквизит.Имя, "Удалить") > 0 Тогда
Продолжить;
КонецЕсли;
ЗначениеСвойств = Справочники.Номенклатура.ЗначениеСвойствРеквизита();
ЗначениеСвойств.Имя = Реквизит.Имя;
СтрокаНастройки = НастройкиРеквизитовПоТипу.Найти(Реквизит, "Реквизит");
Если СтрокаНастройки = Неопределено Тогда
Если Реквизит.Имя = "ХарактеристикаНоменклатурыДляЦенообразования" Тогда
ЗначениеСвойств.Использование = Ложь;
Иначе
ЗначениеСвойств.Использование = РеквизитыОтключенныеПоФО.Найти(Реквизит.Имя) = Неопределено;
КонецЕсли;
Иначе
ЗначениеСвойств.Использование = СтрокаНастройки.Использование
И РеквизитыОтключенныеПоФО.Найти(Реквизит.Имя) = Неопределено;
КонецЕсли;
ПредставлениеРеквизита = Реквизит.Синоним;
Если Не ЗначениеЗаполнено(ПредставлениеРеквизита) Тогда
ПредставлениеРеквизита = Реквизит.Имя;
КонецЕсли;
ЗначениеСвойств.Представление = ПредставлениеРеквизита;
ЗначениеСвойств.Тип = Реквизит.Тип;
ЗначениеСвойств.ОбязательныйДляЗаполнения = ЗначениеСвойств.Использование
И (Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку);
ЗначениеСвойств.ОбязательныйДляОтображенияПриСоздании = ЗначениеСвойств.Использование
И ЗначениеСвойств.ОбязательныйДляЗаполнения;
ВсеРеквизиты.Вставить(Реквизит.Имя, Новый ФиксированнаяСтруктура(ЗначениеСвойств));
КонецЦикла;
Возврат Новый ФиксированнаяСтруктура(ВсеРеквизиты);
КонецФункции
Функция РабочееНаименованиеУникально(Объект) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ХарактеристикиНоменклатуры.Ссылка КАК Характеристика
|ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
|ГДЕ
| ХарактеристикиНоменклатуры.Ссылка <> &Ссылка
| И ХарактеристикиНоменклатуры.Наименование = &Наименование
| И ХарактеристикиНоменклатуры.Владелец = &Владелец";
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Запрос.УстановитьПараметр("Наименование", Объект.Наименование);
Запрос.УстановитьПараметр("Владелец", Объект.Владелец);
Результат = Запрос.Выполнить();
Возврат Результат.Пустой()
КонецФункции
Функция РеквизитОписание(Реквизит, ТипНоменклатуры, ОсобенностьУчета) Экспорт
Если ТипЗнч(Реквизит) = Тип("Строка")
Или ТипЗнч(Реквизит) = Тип("ОбъектМетаданных") Тогда
ВсеРеквизитыХарактеристик = ЗначениеНастроекПовтИсп.ВсеРеквизитыХарактеристикНоменклатуры(ТипНоменклатуры,
ОсобенностьУчета);
Если ТипЗнч(Реквизит) = Тип("Строка") Тогда
ИмяРеквизита = Реквизит;
Иначе
ИмяРеквизита = Реквизит.Имя;
КонецЕсли;
Возврат ВсеРеквизитыХарактеристик[ИмяРеквизита];
ИначеЕсли ТипЗнч(Реквизит) = Тип("ФиксированнаяСтруктура") Тогда
Возврат Реквизит;
Иначе
ТекстИсключения = НСтр("ru = 'Неожиданный тип параметра Реквизит.'");
ВызватьИсключение ТекстИсключения;
КонецЕсли;
КонецФункции
Функция РеквизитыСПереопределеннойОбязательностьюЗаполнения(РеквизитыВидаНоменклатуры, Объект) Экспорт
РеквизитыСПереопределеннойОбязательностьюЗаполнения = Новый Соответствие;
Если РеквизитыВидаНоменклатуры = Неопределено Тогда
ЗапрашиваемыеРеквизитыВидаНоменклатуры =
"ШаблонРабочегоНаименованияХарактеристики,
|ТипНоменклатуры,
|ОсобенностьУчета";
Если Объект = Неопределено
Или Объект.Владелец = Неопределено Тогда
РеквизитыВидаНоменклатуры = ОбщегоНазначенияУТ.ЗначенияРеквизитовОбъектаПоУмолчанию(Справочники.ВидыНоменклатуры.ПустаяСсылка(),
ЗапрашиваемыеРеквизитыВидаНоменклатуры);
Иначе
Если ТипЗнч(Объект.Владелец) = Тип("СправочникСсылка.ВидыНоменклатуры") Тогда
ВидНоменклатуры = Объект.Владелец;
Иначе
ВидНоменклатуры = ОбщегоНазначенияУТ.ЗначенияРеквизитовОбъектаПоУмолчанию(Объект.Владелец, "ВидНоменклатуры").ВидНоменклатуры;
КонецЕсли;
РеквизитыВидаНоменклатуры = ОбщегоНазначенияУТ.ЗначенияРеквизитовОбъектаПоУмолчанию(ВидНоменклатуры, ЗапрашиваемыеРеквизитыВидаНоменклатуры);
КонецЕсли;
КонецЕсли;
РеквизитыСПереопределеннойОбязательностьюЗаполнения.Вставить("Наименование",
Не ЗначениеЗаполнено(РеквизитыВидаНоменклатуры.ШаблонРабочегоНаименованияХарактеристики));
РеквизитыСПереопределеннойОбязательностьюЗаполнения.Вставить("Принципал",РеквизитыВидаНоменклатуры.ОсобенностьУчета = Перечисления.ОсобенностиУчетаНоменклатуры.ОрганизациейПоАгентскойСхеме
Или РеквизитыВидаНоменклатуры.ОсобенностьУчета = Перечисления.ОсобенностиУчетаНоменклатуры.Партнером);
РеквизитыСПереопределеннойОбязательностьюЗаполнения.Вставить("Контрагент",
РеквизитыВидаНоменклатуры.ОсобенностьУчета = Перечисления.ОсобенностиУчетаНоменклатуры.Партнером);
Возврат РеквизитыСПереопределеннойОбязательностьюЗаполнения;
КонецФункции
Функция НепроверяемыеРеквизиты(Объект) Экспорт
МассивНепроверяемыхРеквизитов = Новый Массив;
РеквизитыСПереопределеннойОбязательностьюЗаполнения =
РеквизитыСПереопределеннойОбязательностьюЗаполнения(Неопределено, Объект);
Для Каждого КлючЗначение Из РеквизитыСПереопределеннойОбязательностьюЗаполнения Цикл
Если Не КлючЗначение.Значение Тогда
МассивНепроверяемыхРеквизитов.Добавить(КлючЗначение.Ключ);
КонецЕсли;
КонецЦикла;
Возврат МассивНепроверяемыхРеквизитов;
КонецФункции
Функция НастройкиВидимостиИЗаголовков(Объект, РеквизитыВидаНоменклатуры) Экспорт
НастройкиВидимостиИЗаголовков = Новый Структура;
ВидимостьЭлементов = ИспользованиеЭлементов(Объект,РеквизитыВидаНоменклатуры);
УстановитьПривилегированныйРежим(Истина);
ЗаголовкиЭлементов = ЗаголовкиЭлементов(Объект, ВидимостьЭлементов,РеквизитыВидаНоменклатуры);
УстановитьПривилегированныйРежим(Ложь);
НастройкиВидимостиИЗаголовков.Вставить("ВидимостьЭлементов", ВидимостьЭлементов);
НастройкиВидимостиИЗаголовков.Вставить("ЗаголовкиЭлементов", ЗаголовкиЭлементов);
Возврат НастройкиВидимостиИЗаголовков;
КонецФункции
Функция ИспользованиеЭлементов(ПереданныйОбъект, РеквизитыВидаНоменклатуры)
ИспользованиеЭлементов = Новый Структура;
АвторизованВнешнийПользователь = ОбщегоНазначенияУТКлиентСервер.АвторизованВнешнийПользователь();
#Область НастройкаПоВидуНоменклатуры
НастройкиРеквизитовПоВидуНоменклатуры = Справочники.Номенклатура.ТаблицаНастроекРеквизитов(РеквизитыВидаНоменклатуры.Ссылка,
РеквизитыВидаНоменклатуры.ТипНоменклатуры,
РеквизитыВидаНоменклатуры.ОсобенностьУчета,
РеквизитыВидаНоменклатуры.ИспользованиеХарактеристик,
Ложь,
"ХарактеристикиНоменклатуры");
Для Каждого СтрТабл Из НастройкиРеквизитовПоВидуНоменклатуры Цикл
ИмяРеквизита = СтрТабл.ИмяРеквизита;
Если СтрТабл.ЭтоДопРеквизит Тогда
ИмяЭлементаФормы = "ДополнительныйРеквизитЗначение_"
+ СтрЗаменить(?(СтрТабл.ЭтоОбщийРеквизит,
ВРег(Строка(СтрТабл.Набор.УникальныйИдентификатор())),
ВРег(Строка(СтрТабл.НаборСвойств.УникальныйИдентификатор()))),
"-",
"x")
+ "_"
+ СтрЗаменить(ВРег(Строка(СтрТабл.Свойство.УникальныйИдентификатор())), "-", "x");
ИспользованиеЭлементов.Вставить(ИмяЭлементаФормы, СтрТабл.Использование
И Справочники.Номенклатура.ВидимостьРеквизита(СтрТабл,
ИмяРеквизита,
Ложь,
СтрТабл));
Иначе
Если ИмяРеквизита = "ХарактеристикаНоменклатурыДляЦенообразования" Тогда
ИспользованиеЭлементов.Вставить(ИмяРеквизита, СтрТабл.Использование);
Иначе
ИспользованиеЭлементов.Вставить(ИмяРеквизита, СтрТабл.Использование
И (Справочники.Номенклатура.ВидимостьРеквизита(ИмяРеквизита,
ИмяРеквизита,
Ложь,
СтрТабл)));
КонецЕсли;
КонецЕсли;
КонецЦикла;
#КонецОбласти
ИспользованиеЭлементов.Вставить("ГиперссылкаПерейтиСоставНабора",
ПравоДоступа("Просмотр", Метаданные.Справочники.ВариантыКомплектацииНоменклатуры)
И РеквизитыВидаНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Набор
И РеквизитыВидаНоменклатуры.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры);
Возврат ИспользованиеЭлементов;
КонецФункции
Функция ЗаголовкиЭлементов(Объект, ВидимостьЭлементов, РеквизитыВидаНоменклатуры)
ЗаголовкиЭлементов = Новый Структура;
Если РеквизитыВидаНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Работа Тогда
ЗаголовкиЭлементов.Вставить("ГруппаАгентскиеУслуги", НСтр("ru='Работа выполняется по агентскому договору'"));
Иначе
ЗаголовкиЭлементов.Вставить("ГруппаАгентскиеУслуги", НСтр("ru='Услуга реализуется по агентскому договору'"));
КонецЕсли;
Картинка = Новый Картинка;
КартинкаПредупреждение = БиблиотекаКартинок.ПредупреждениеСНачалаСтроки;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВариантыКомплектацииНоменклатурыТовары.НомерСтроки КАК НомерСтроки
|ИЗ
| Справочник.ВариантыКомплектацииНоменклатуры.Товары КАК ВариантыКомплектацииНоменклатурыТовары
|ГДЕ
| &ГиперссылкаПерейтиСоставНабора
| И ВариантыКомплектацииНоменклатурыТовары.Ссылка = &ВариантКомплектацииНоменклатуры
| И НЕ ВариантыКомплектацииНоменклатурыТовары.Ссылка.ПометкаУдаления";
Если Справочники.Номенклатура.РазделВиден("ГиперссылкаПерейтиСоставНабора", ВидимостьЭлементов) Тогда
ВариантКомплектацииНоменклатуры = НаборыВызовСервера.ВариантКомплектацииНоменклатурыПоУмолчанию(
Объект.Владелец,
Объект.Ссылка);
Запрос.УстановитьПараметр("ВариантКомплектацииНоменклатуры", ВариантКомплектацииНоменклатуры);
Иначе
Запрос.УстановитьПараметр("ВариантКомплектацииНоменклатуры", Справочники.ВариантыКомплектацииНоменклатуры.ПустаяСсылка());
КонецЕсли;
Запрос.УстановитьПараметр("ВариантКомплектацииНоменклатуры", ВариантКомплектацииНоменклатуры);
ПараметрыЗапроса = Запрос.НайтиПараметры();
Для Каждого ПараметрЗапроса Из ПараметрыЗапроса Цикл
Если СтрНайти(ПараметрЗапроса.Имя, "ГиперссылкаПерейтиСоставНабора") <> 0 Тогда
Запрос.УстановитьПараметр(ПараметрЗапроса.Имя, Справочники.Номенклатура.РазделВиден(ПараметрЗапроса.Имя, ВидимостьЭлементов));
КонецЕсли;
КонецЦикла;
УстановитьПривилегированныйРежим(Истина);
Выборки = Запрос.ВыполнитьПакет();
УстановитьПривилегированныйРежим(Ложь);
ВидимостьЭлемента = Ложь;
Если Справочники.Номенклатура.РазделВиден("ГиперссылкаПерейтиСоставНабора", ВидимостьЭлементов) Тогда
РезультатЗапроса = Выборки[0];
Количество = РезультатЗапроса.Выбрать().Количество();
Если Количество <> 0 Тогда
ЗаголовокГиперссылки = Новый ФорматированнаяСтрока(НСтр("ru = 'Состав набора'") + " (" + Количество + ")",,,,"СоставНабора");
Иначе
ЗаголовокГиперссылки = Новый ФорматированнаяСтрока(Новый ФорматированнаяСтрока(НСтр("ru = 'Настроить набор'"),,,,"НастроитьНабор"),
КартинкаПредупреждение);
КонецЕсли;
ЗаголовкиЭлементов.Вставить("ГиперссылкаПерейтиСоставНабора", ЗаголовокГиперссылки);
КонецЕсли;
Возврат ЗаголовкиЭлементов;
КонецФункции
Функция НоваяСтруктураРеквизитыВидаНоменклатуры(ВидНоменклатуры) Экспорт
ИменаРеквизитов =
"Ссылка,
|ШаблонНаименованияДляПечатиХарактеристики,
|ШаблонРабочегоНаименованияХарактеристики,
|ЗапретРедактированияРабочегоНаименованияХарактеристики,
|ЗапретРедактированияНаименованияДляПечатиХарактеристики,
|ТипНоменклатуры,
|ОсобенностьУчета,
|НаборСвойствХарактеристик,
|ИспользованиеХарактеристик,
|НастройкиКлючаЦенПоХарактеристике";
Возврат Новый ФиксированнаяСтруктура(
ОбщегоНазначенияУТ.ЗначенияРеквизитовОбъектаПоУмолчанию(ВидНоменклатуры, ИменаРеквизитов));
КонецФункции
#КонецОбласти
#КонецЕсли
#КонецЕсли