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