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