Ордер на отражение пересортицы товаров / Модуль объекта

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

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

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

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

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

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

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

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

Процедура ПриКопировании(ОбъектКопирования)
	
	ИнициализироватьДокумент();
	
КонецПроцедуры

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

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

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

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

Процедура ИнициализироватьДокумент(ДанныеЗаполнения = Неопределено)
	
	Ответственный = Пользователи.ТекущийПользователь();
	Склад         = ЗначениеНастроекПовтИсп.ПолучитьСкладПоУмолчанию(Склад);
	
КонецПроцедуры

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

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

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

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

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


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

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

#КонецЕсли

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