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