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