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