Расходный ордер на товары / Модуль объекта

файл
#Если НЕ МобильныйАвтономныйСервер Тогда
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий

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

Процедура ПриЗаписи(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	Перем Отказ;
	
	Если ДанныеЗаполнения = "АвтоТест" Тогда
		Возврат;
	КонецЕсли;
	
	Если Не (ЗначениеЗаполнено(Склад)
		И ЗначениеЗаполнено(СкладскаяОперация)
		И (ЗначениеЗаполнено(Получатель) Или СкладскаяОперация = Перечисления.СкладскиеОперации.ОтгрузкаНаВнутренниеНужды)
		И ЗначениеЗаполнено(ДатаОтгрузки)) Тогда
		
		Отказ = Истина;
		
	Иначе
		
		ИспользоватьПомещения = СкладыСервер.ИспользоватьСкладскиеПомещения(Склад, ДатаОтгрузки, Истина);

		Если ИспользоватьПомещения
			И Не ЗначениеЗаполнено(Помещение) Тогда
			Отказ = Истина;
		КонецЕсли;
		
	КонецЕсли;
	
	Если Отказ = Истина Тогда
		ТекстСообщения = НСтр("ru='Расходный ордер на товары можно вводить только на основании распоряжения на отгрузку товаров.'");
		ВызватьИсключение ТекстСообщения;
	КонецЕсли;
		
	ИнициализироватьДокумент(ДанныеЗаполнения);
	
	ПараметрыУказанияСерий = Документы.РасходныйОрдерНаТовары.ПараметрыУказанияСерий(ЭтотОбъект);
	
	НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект, ПараметрыУказанияСерий.ТоварыПоРаспоряжениям); 
	
	Документы.РасходныйОрдерНаТовары.ЗаполнитьОтгружаемыеТоварыПоТоварамПоРаспоряжениям(ЭтотОбъект);
	
	Документы.РасходныйОрдерНаТовары.ЗаполнитьДействиеВСтроках(ЭтотОбъект);
	
	НоменклатураСервер.ЗаполнитьСерииПоFEFO(ЭтотОбъект, ПараметрыУказанияСерий.ОтгружаемыеТовары, Ложь); 
	
	Если Не СкладыСервер.ИспользоватьАдресноеХранение(Склад, Помещение, ДатаОтгрузки)
		И ПолучитьФункциональнуюОпцию("ИспользоватьУпаковкиНоменклатуры") Тогда
		Документы.РасходныйОрдерНаТовары.РазбитьПоУпаковкамСправочно(ЭтотОбъект);
	КонецЕсли;
	
	НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ЭтотОбъект, ПараметрыУказанияСерий.ОтгружаемыеТовары); 
	
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ПриКопировании(ОбъектКопирования)

	ИнициализироватьДокумент();

КонецПроцедуры

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	Если Не ДополнительныеСвойства.Свойство("ОтложенноеПроведение") Тогда
		
		ПараметрыФО = Новый Структура;
		ПараметрыФО.Вставить("Склад", Склад);
		
		Если Не Проведен
			И Статус <> Перечисления.СтатусыРасходныхОрдеров.КОтбору
			И Статус <> Перечисления.СтатусыРасходныхОрдеров.Подготовлен
			И (ПолучитьФункциональнуюОпцию("ИспользоватьСерииНоменклатурыСклад",ПараметрыФО)
			Или СкладыСервер.ИспользоватьСкладскиеПомещения(Склад, ДатаОтгрузки)
			Или СкладыСервер.ИспользоватьАдресноеХранение(Склад, Помещение, ДатаОтгрузки)) Тогда
			
			ТекстСообщения = НСтр("ru = 'Документ должен быть проведен сначала в статусе ""К отбору"" или ""Подготовлен""'");
			
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,ЭтотОбъект,"Статус","Объект",Отказ);
		КонецЕсли;
	КонецЕсли;

	МассивНепроверяемыхРеквизитов = Новый Массив;

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

	ПараметрыПроверки = НоменклатураСервер.ПараметрыПроверкиЗаполненияХарактеристик();
	ПараметрыПроверки.ВыводитьНомераСтрок = Не ИспользоватьУпаковочныеЛисты;
	ПараметрыПроверки.ИмяТЧ = "ТоварыПоРаспоряжениям"; 
	НоменклатураСервер.ПроверитьЗаполнениеХарактеристик(ЭтотОбъект,МассивНепроверяемыхРеквизитов,Отказ,ПараметрыПроверки);
	
	ПараметрыПроверки = НоменклатураСервер.ПараметрыПроверкиЗаполненияХарактеристик();
	ПараметрыПроверки.ВыводитьНомераСтрок = Не ИспользоватьУпаковочныеЛисты;
	ПараметрыПроверки.ИмяТЧ = "ОтгружаемыеТовары"; 
	НоменклатураСервер.ПроверитьЗаполнениеХарактеристик(ЭтотОбъект,МассивНепроверяемыхРеквизитов,Отказ,ПараметрыПроверки);
	
	ПараметрыУказанияСерий =
		НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.РасходныйОрдерНаТовары);
	МассивПараметров = Новый Массив;
	МассивПараметров.Добавить(ПараметрыУказанияСерий.ТоварыПоРаспоряжениям);
	МассивПараметров.Добавить(ПараметрыУказанияСерий.ОтгружаемыеТовары);
	НоменклатураСервер.ПроверитьЗаполнениеСерий(ЭтотОбъект,
		МассивПараметров,
		Отказ,
		МассивНепроверяемыхРеквизитов);

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

	// ++ Локализация
	
	// контроль заполнения марок
	
	Если Не Отказ Тогда
		РасходныйОрдерНаТоварыЛокализация.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
	КонецЕсли;
	
	// -- Локализация
	
КонецПроцедуры

Процедура ПроверитьСоответствиеСтрокТабличныхЧастей(Отказ)
	
	Выборка = Документы.РасходныйОрдерНаТовары.ВыборкаИзЗапросаПоПревышениюРаспоряжений(ЭтотОбъект);
	
	ШаблонСообщения = НСтр("ru = 'Количество товара %Товар%, которое нужно отгрузить по распоряжениям на отгрузку не равно количеству, которое отгружается ордером.'");
	
	Пока Выборка.Следующий() Цикл
		Отказ = Истина;
		ТоварПредставление = НоменклатураКлиентСервер.ПредставлениеНоменклатуры(Выборка.Номенклатура,
																	Выборка.Характеристика,
																	,
																	Выборка.Серия,
																	Выборка.Назначение);
		ТекстСообщения = СтрЗаменить(ШаблонСообщения,"%Товар%", ТоварПредставление);
		
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,ЭтотОбъект.Ссылка);
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область ИнициализацияИЗаполнение

Процедура ИнициализироватьДокумент(ДанныеЗаполнения = Неопределено)

	Ответственный = Пользователи.ТекущийПользователь();
	Приоритет = ЗначениеНастроекПовтИсп.ПолучитьПриоритетПоУмолчанию(Приоритет);
	
	Если СкладыСервер.ИспользоватьАдресноеХранение(Склад,Помещение,ДатаОтгрузки) Тогда
		ЗонаОтгрузки = Справочники.СкладскиеЯчейки.ЗонаОтгрузкиПоУмолчанию(Склад,Помещение,ЗонаОтгрузки);
	КонецЕсли;
	
	Если ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыРасходныхОрдеров", Новый Структура("Склад", Склад)) Тогда
		ОбъектМетаданныхСтатус = Метаданные().Реквизиты.Статус; // ОбъектМетаданныхРеквизит
		Статус = ОбъектМетаданныхСтатус.ЗначениеЗаполнения;
	Иначе
		Статус = Перечисления.СтатусыРасходныхОрдеров.Отгружен;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область Прочее

Процедура ПроверитьОрдерныйСклад(Отказ)
	
	Если НЕ СкладыСервер.ИспользоватьОрдернуюСхемуПриОтгрузке(Склад, Дата) Тогда
		
		Отказ = Истина;
		ТекстСообщения = НСтр("ru='На складе ""%Склад%"" на %Дата% не используется ордерная схема при отгрузке.'");
		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%Склад%",Склад);
		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%Дата%",Формат(Дата, "ДЛФ=D"));
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
			ТекстСообщения,
			Ссылка);
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#КонецЕсли
#КонецЕсли

Связанные материалы