Пересчет товаров / Модуль объекта

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

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

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

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

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

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	
	СкладыСервер.ОтразитьСостоянияПересчетовЯчеек(ЭтотОбъект.Ссылка, ЭтотОбъект.Статус, Отказ);
	
	ПересчетТоваровЛокализация.ОбработкаПроведения(ЭтотОбъект, Отказ, РежимПроведения);
	
КонецПроцедуры

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

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

	УчетныеДанныеЗаполнены = Ложь;
	
	ИнициализироватьДокумент();

	ПересчетТоваровЛокализация.ПриКопировании(ЭтотОбъект, ОбъектКопирования);

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

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

	ПересчетТоваровЛокализация.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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