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