Размещение номенклатуры по ячейкам (справочно) / Форма / Модуль формы

файл
#Область ОписаниеПеременных

&НаКлиенте
Перем ВыполняетсяЗакрытие;

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

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

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

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если ЗавершениеРаботы Тогда
		Отказ = Истина;
		
		Возврат;
	КонецЕсли;
	
	Если Не ВыполняетсяЗакрытие
		И Модифицированность Тогда
		
		Отказ = Истина;
		
		ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект);
		
		ПроверитьМодифицированность(ОписаниеОповещения);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытиемЗавершение(РезультатМодифицированность, ДополнительныеПараметры) Экспорт
	
	Если РезультатМодифицированность = Истина Тогда
		Возврат;
	КонецЕсли;
	
	ВыполняетсяЗакрытие = Истина;
	
	Закрыть();
	
	ВыполняетсяЗакрытие = Ложь;
	
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыОсновныеЯчейки

&НаКлиенте
Процедура ОсновныеЯчейкиПриИзменении(Элемент)
	
	ЭтаФорма.Модифицированность = Истина;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОсновныеЯчейкиПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	
	Если Элемент = ЭтаФорма.ТекущийЭлемент Тогда
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
	Иначе
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Перемещение;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОсновныеЯчейкиОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если ПараметрыПеретаскивания.Действие <> ДействиеПеретаскивания.Отмена Тогда
		
		ТекущиеДанные = Элементы.ОсновныеЯчейки.ТекущиеДанные;
		
		ОбработатьНазначениеДополнительнойЯчейки(ТекущиеДанные.Номенклатура, ТекущиеДанные.Склад, ТекущиеДанные.Ячейка);
		
		Отбор = Новый ФиксированнаяСтруктура("Номенклатура, Склад",ТекущиеДанные.Номенклатура, ТекущиеДанные.Склад);
		
		Элементы.ДополнительныеЯчейки.ОтборСтрок = Отбор;
		Элементы.ДополнительныеЯчейки.Обновить();
		
		ЭтаФорма.Модифицированность = Истина;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОсновныеЯчейкиПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ОсновныеЯчейкиЯчейкаПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.ОсновныеЯчейки.ТекущиеДанные;
	
	ОбработатьНазначениеОсновнойЯчейки(ТекущиеДанные.Номенклатура, ТекущиеДанные.Склад, ТекущиеДанные.Ячейка, Ложь);
	
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыДополнительныеЯчейки

&НаКлиенте
Процедура ДополнительныеЯчейкиПриИзменении(Элемент)
	
	ЭтаФорма.Модифицированность = Истина;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ДополнительныеЯчейкиЯчейкаПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.ДополнительныеЯчейки.ТекущиеДанные;
	
	ОбработатьНазначениеДополнительнойЯчейки(ТекущиеДанные.Номенклатура, ТекущиеДанные.Склад, ТекущиеДанные.Ячейка);
	
КонецПроцедуры

&НаКлиенте
Процедура ДополнительныеЯчейкиПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	
	Если Элемент = ЭтаФорма.ТекущийЭлемент Тогда
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
	Иначе
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Перемещение;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДополнительныеЯчейкиПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ДополнительныеЯчейкиОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	
	Если ПараметрыПеретаскивания.Действие <> ДействиеПеретаскивания.Отмена Тогда
		
		ТекущиеДанные = Элементы.ДополнительныеЯчейки.ТекущиеДанные;
		
		ОбработатьНазначениеОсновнойЯчейки(ТекущиеДанные.Номенклатура, ТекущиеДанные.Склад, ТекущиеДанные.Ячейка, Истина);
		
		Элементы.ОсновныеЯчейки.Обновить();
		
		ЭтаФорма.Модифицированность = Истина;
		
	КонецЕсли;
	
КонецПроцедуры

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

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ЗаписатьВРегистр(Команда)
	
	ЭтаФорма.Модифицированность = ЗаписатьВРегистрСервер();
	
КонецПроцедуры

&НаКлиенте
Процедура ПечатьЗаданияНаОтборРазмещениеТоваров(Команда)
	
	ОчиститьСообщения();
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПечатьЗаданияНаОтборРазмещениеТоваровЗавершение", ЭтотОбъект);
	
	ПроверитьМодифицированность(ОписаниеОповещения);
	
КонецПроцедуры

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

#Область ОбработчикиКомандТаблицыФормыОсновныеЯчейки

&НаКлиенте
Процедура СделатьЯчейкуДополнительной(Команда)
	
	ТекущиеДанные = Элементы.ОсновныеЯчейки.ТекущиеДанные;
	
	Если ТекущиеДанные <> Неопределено Тогда
		
		ОбработатьНазначениеДополнительнойЯчейки(ТекущиеДанные.Номенклатура, ТекущиеДанные.Склад, ТекущиеДанные.Ячейка);
		
		Отбор = Новый ФиксированнаяСтруктура("Номенклатура, Склад", ТекущиеДанные.Номенклатура, ТекущиеДанные.Склад);
		
		Элементы.ДополнительныеЯчейки.ОтборСтрок = Отбор;
		Элементы.ДополнительныеЯчейки.Обновить();
		
		ЭтаФорма.Модифицированность = Истина;
		
	КонецЕсли;
	
КонецПроцедуры

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

#Область ОбработчикиКомандТаблицыФормыДополнительныеЯчейки

&НаКлиенте
Процедура СделатьЯчейкуОсновной(Команда)
	
	ТекущиеДанные = Элементы.ДополнительныеЯчейки.ТекущиеДанные;
	
	Если ТекущиеДанные <> Неопределено Тогда
		
		ОбработатьНазначениеОсновнойЯчейки(ТекущиеДанные.Номенклатура,ТекущиеДанные.Склад, ТекущиеДанные.Ячейка, Истина);
		
		ЭтаФорма.Модифицированность = Истина;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

// Возвращает информацию документа приемки товаров.
//
// Параметры:
//	ДокументПриемки - ДокументСсылка - ссылка на документ в информационной базе.
//
// Возвращаемое значение:
//	Структура - коллекция, содержащая информацию документа приемки товаров и имеющая следующие свойства:
//		* РезультатПоШапкеДокумента - РезультатЗапроса - данные шапки документа.
//		* ДокументБезТоваров - Булево - признак отсутствия товаров в документе.
//		* РезультатПроверкиДокумента - РезультатЗапроса - данные о применении ордерной политики на складе документа.
//		* РезультатПоТабличнойЧасти - РезультатЗапроса - данные о товарах документа.
//
&НаСервере
Функция ПолучитьДанныеДокумента(ДокументПриемки)
	
	ИмяДокумента				= ДокументПриемки.Метаданные().ПолноеИмя();
	РазделительПакетовЗапроса	= ОбщегоНазначения.РазделительПакетаЗапросов();
	
	ТекстыЗапроса = Новый Массив;
	ТекстыЗапроса.Добавить(ТекстЗапросаВТДанныхДокумента(ИмяДокумента));
	ТекстыЗапроса.Добавить(ТекстЗапросаВТТоварыДокументаПриемки(ИмяДокумента));
	ТекстыЗапроса.Добавить(ТекстЗапросаВТТоварыДокумента(ИмяДокумента));
	ТекстыЗапроса.Добавить(ТекстЗапросаДокументБезТоваров(ИмяДокумента));
	ТекстыЗапроса.Добавить(ТекстаЗапросаДанныхДокументаПриемки());
	ТекстыЗапроса.Добавить(ТекстЗапросаТоварыДокумента());
	
	ТекстЗапроса = СтрСоединить(ТекстыЗапроса, РазделительПакетовЗапроса);
	
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	Запрос.УстановитьПараметр("ДокументПриемки",		ДокументПриемки);
	Запрос.УстановитьПараметр("МассивОбъектов",			ДокументПриемки);
	Запрос.УстановитьПараметр("ОперацияПоступления",	Истина);
	
	УстановитьПривилегированныйРежим(Истина);
	Результат = Запрос.ВыполнитьПакетСПромежуточнымиДанными();
	УстановитьПривилегированныйРежим(Ложь);
	
	МаксимальныйИндекс = Результат.ВГраница();
	
	ДанныеДокумента = Новый Структура;
	ДанныеДокумента.Вставить("РезультатПоШапкеДокумента",	Результат[МаксимальныйИндекс - 5]);
	ДанныеДокумента.Вставить("ДокументБезТоваров",			Результат[МаксимальныйИндекс - 2].Пустой());
	ДанныеДокумента.Вставить("РезультатПроверкиДокумента",	Результат[МаксимальныйИндекс - 1]);
	ДанныеДокумента.Вставить("РезультатПоТабличнойЧасти",	Результат[МаксимальныйИндекс]);
	
	Возврат ДанныеДокумента;
	
КонецФункции

#Область ТекстыЗапросовДанныхДокумента

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

&НаСервере
Функция ШаблонТекстаЗапросаДанныхДокумента()
	
	ШаблонТекстаЗапроса = 
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ДанныеПриемки.Ссылка							КАК Ссылка,
	|	ДанныеПриемки.Дата								КАК Дата,
	|	ДанныеПриемки.Склад								КАК Склад,
	|	ДанныеПриемки.СкладПредставление				КАК СкладПредставление,
	|	ДанныеПриемки.Помещение							КАК Помещение,
	|	ДанныеПриемки.ПомещениеПредставление			КАК ПомещениеПредставление,
	|	ДанныеПриемки.ЭтоНакладная						КАК ЭтоНакладная,
	|	ДанныеПриемки.ИспользуетсяАдресноеХранение		КАК ИспользуетсяАдресноеХранение,
	|	ДанныеПриемки.ИспользуетсяСправочноеХранение	КАК ИспользуетсяСправочноеХранение,
	|	ДанныеПриемки.ПроверитьОрдерностьСклада			КАК ПроверитьОрдерностьСклада,
	|	ДанныеПриемки.ИспользуетсяОрдернаяСхема			КАК ИспользуетсяОрдернаяСхема
	|ПОМЕСТИТЬ ДанныеПриемки
	|ИЗ
	|	&ДанныеПриемки КАК ДанныеПриемки";
	
	Возврат ШаблонТекстаЗапроса;
	
КонецФункции

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

&НаСервере
Функция ТекстСоединенияДанныхДокументаСТЧ(ИмяДокумента, ИмяТЧ)
	
	ИмяТЧДокумента = ИмяДокумента + "." + ИмяТЧ;
	
	ТекстСоединенияТаблиц = 
	"		ВНУТРЕННЕЕ СОЕДИНЕНИЕ &ИмяТЧТовары КАК ТоварыДокумента
	|		ПО ДанныеДокумента.Ссылка = ТоварыДокумента.Ссылка";
	
	ТекстСоединенияТаблиц = СтрЗаменить(ТекстСоединенияТаблиц, "&ИмяТЧТовары", ИмяТЧДокумента);
	
	Возврат ТекстСоединенияТаблиц;
	
КонецФункции

&НаСервере
Функция ТекстУсловияДанныхДокумента()
	
	ТекстУсловияДанныхДокумента = 
	"	И &Склад ССЫЛКА Справочник.Склады
	|	И &Склад <> ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)";
	
	Возврат ТекстУсловияДанныхДокумента;
	
КонецФункции

&НаСервере
Функция ЗначенияПолейДокумента()
	
	ЗначенияПолейДокумента = Новый Структура;
	ЗначенияПолейДокумента.Вставить("Склад");
	ЗначенияПолейДокумента.Вставить("Помещение");
	ЗначенияПолейДокумента.Вставить("ЭтоНакладная");
	ЗначенияПолейДокумента.Вставить("ИспользуетсяАдресноеХранение");
	ЗначенияПолейДокумента.Вставить("ИспользуетсяСправочноеХранение");
	ЗначенияПолейДокумента.Вставить("ПроверитьОрдерностьСклада");
	ЗначенияПолейДокумента.Вставить("ИспользуетсяОрдернаяСхема");
	
	Возврат ЗначенияПолейДокумента;
	
КонецФункции

&НаСервере
Процедура ЗаполнитьЗначенияПолейДокумента(ЗначенияПолей, ПравилоПечати)
	
	ЭтоНакладная				= ПравилоПечати.ЭтоНакладная;
	ОтражениеИзлишков			= ПравилоПечати.ОтражениеИзлишков;
	ИсточникРеквизитов			= ?(ПравилоПечати.СкладыВТЧ, "ТоварыДокумента.", "ДанныеДокумента.");
	ИспользуютсяПомещения		= ЗначениеЗаполнено(ПравилоПечати.ИмяПоляПомещение);
	ПомещениеПоУмолчанию		= "ЗНАЧЕНИЕ(Справочник.СкладскиеПомещения.ПустаяСсылка)";
	ПроверитьОрдерностьСклада	= ЭтоНакладная
									И Не ИспользуютсяПомещения
									И Не ПравилоПечати.КорректировкаТоваров;
	
	Склад		= ИсточникРеквизитов + ПравилоПечати.ИмяПоляСклад;
	Помещение	= ?(ИспользуютсяПомещения, "ДанныеДокумента." + ПравилоПечати.ИмяПоляПомещение, ПомещениеПоУмолчанию);
	
	ЗначенияПолей.Склад								= Склад;
	ЗначенияПолей.Помещение							= Помещение;
	ЗначенияПолей.ЭтоНакладная						= ?(ЭтоНакладная, "ИСТИНА", "ЛОЖЬ");
	ЗначенияПолей.ИспользуетсяАдресноеХранение		= ТекстИспользуетсяАдресноеХранение(ЭтоНакладная, Склад, Помещение);
	ЗначенияПолей.ИспользуетсяСправочноеХранение	= ТекстИспользуетсяСправочноеХранение(ИспользуютсяПомещения,
																							Склад,
																							Помещение);
	ЗначенияПолей.ПроверитьОрдерностьСклада			= ?(ПроверитьОрдерностьСклада, "ИСТИНА", "ЛОЖЬ");
	ЗначенияПолей.ИспользуетсяОрдернаяСхема			= ТекстИспользуетсяОрдернаяСхема(ПроверитьОрдерностьСклада,
																					ОтражениеИзлишков,
																					Склад);
	
КонецПроцедуры

&НаСервере
Функция ТекстИспользуетсяАдресноеХранение(ЭтоНакладная, ИсточникСклада, ИсточникПомещения)
	
	Если ЭтоНакладная Тогда
		ТекстЗапроса = "ЛОЖЬ";
	Иначе
		ТекстЗапроса = 
		"ЕСТЬNULL(ВЫБОР
		|		КОГДА ДанныеДокумента.Склад.ИспользоватьСкладскиеПомещения
		|				И ДанныеДокумента.Дата >= ДанныеДокумента.Склад.ДатаНачалаИспользованияСкладскихПомещений
		|			ТОГДА ВЫБОР
		|					КОГДА ДанныеДокумента.Помещение.ИспользоватьАдресноеХранение
		|							И ДанныеДокумента.Дата >= ДанныеДокумента.Помещение.ДатаНачалаАдресногоХраненияОстатков
		|						ТОГДА ИСТИНА
		|					ИНАЧЕ ЛОЖЬ
		|				КОНЕЦ
		|		ИНАЧЕ ВЫБОР
		|				КОГДА ДанныеДокумента.Склад.ИспользоватьАдресноеХранение
		|						И ДанныеДокумента.Дата >= ДанныеДокумента.Склад.ДатаНачалаАдресногоХраненияОстатков
		|					ТОГДА ИСТИНА
		|				ИНАЧЕ ЛОЖЬ
		|			КОНЕЦ
		|	КОНЕЦ, ЛОЖЬ)";  //@Query-part
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ДанныеДокумента.Склад",		ИсточникСклада);
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ДанныеДокумента.Помещение",	ИсточникПомещения);
	КонецЕсли;
	
	Возврат ТекстЗапроса;
	
КонецФункции

&НаСервере
Функция ТекстИспользуетсяСправочноеХранение(ИспользуютсяПомещения, ИсточникСклада, ИсточникПомещения)
	
	Если ИспользуютсяПомещения Тогда
		ТекстЗапроса = 
		"ЕСТЬNULL(ВЫБОР
		|		КОГДА ДанныеДокумента.Склад.ИспользоватьСкладскиеПомещения
		|				И ДанныеДокумента.Дата >= ДанныеДокумента.Склад.ДатаНачалаИспользованияСкладскихПомещений
		|			ТОГДА ВЫБОР
		|					КОГДА ДанныеДокумента.Помещение.ИспользоватьАдресноеХранениеСправочно
		|							И (НЕ ДанныеДокумента.Помещение.ИспользоватьАдресноеХранение
		|								ИЛИ ДанныеДокумента.Дата < ДанныеДокумента.Помещение.ДатаНачалаАдресногоХраненияОстатков)
		|						ТОГДА ИСТИНА
		|					ИНАЧЕ ЛОЖЬ
		|				КОНЕЦ
		|		ИНАЧЕ ВЫБОР
		|				КОГДА ДанныеДокумента.Склад.ИспользоватьАдресноеХранениеСправочно
		|						И (НЕ ДанныеДокумента.Склад.ИспользоватьАдресноеХранение
		|							ИЛИ ДанныеДокумента.Дата < ДанныеДокумента.Склад.ДатаНачалаАдресногоХраненияОстатков)
		|					ТОГДА ИСТИНА
		|				ИНАЧЕ ЛОЖЬ
		|			КОНЕЦ
		|	КОНЕЦ, ЛОЖЬ)";  //@Query-part
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ДанныеДокумента.Помещение", ИсточникПомещения);
	Иначе
		ТекстЗапроса = 
		"ЕСТЬNULL(ВЫБОР
		|		КОГДА ДанныеДокумента.Склад.ИспользоватьАдресноеХранениеСправочно
		|				И (НЕ ДанныеДокумента.Склад.ИспользоватьАдресноеХранение
		|					ИЛИ ДанныеДокумента.Дата < ДанныеДокумента.Склад.ДатаНачалаАдресногоХраненияОстатков)
		|			ТОГДА ИСТИНА
		|		ИНАЧЕ ЛОЖЬ
		|	КОНЕЦ, ЛОЖЬ)";  //@Query-part
	КонецЕсли;
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ДанныеДокумента.Склад", ИсточникСклада);
	
	Возврат ТекстЗапроса;
	
КонецФункции

&НаСервере
Функция ТекстИспользуетсяОрдернаяСхема(ПроверитьОрдерностьСклада, ОтражениеИзлишков, ИсточникСклада)
	
	Если ПроверитьОрдерностьСклада Тогда
		ТекстЗапроса = 
		"ЕСТЬNULL(ВЫБОР
		|		КОГДА ДанныеДокумента.Склад.ИспользоватьОрдернуюСхемуПриПоступлении
		|				И ДанныеДокумента.Дата >= ДанныеДокумента.Склад.ДатаНачалаОрдернойСхемыПриПоступлении
		|			ТОГДА ИСТИНА
		|		ИНАЧЕ ЛОЖЬ
		|	КОНЕЦ, ЛОЖЬ)";  //@Query-part
		
		СкладскаяОперация = ?(ОтражениеИзлишков, "ПриОтраженииИзлишковНедостач", "ПриПоступлении");
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПриПоступлении",			СкладскаяОперация);
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ДанныеДокумента.Склад",	ИсточникСклада);
	Иначе
		ТекстЗапроса = "ЛОЖЬ";
	КонецЕсли;
	
	Возврат ТекстЗапроса;
	
КонецФункции

&НаСервере
Функция ТекстаЗапросаДанныхДокументаПриемки()
	
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	ДанныеПриемки.Ссылка							КАК Ссылка,
	|	ДанныеПриемки.Склад								КАК Склад,
	|	ДанныеПриемки.СкладПредставление				КАК СкладПредставление,
	|	ДанныеПриемки.ПомещениеПредставление			КАК ПомещениеПредставление,
	|	ДанныеПриемки.ЭтоНакладная						КАК ЭтоНакладная,
	|	ДанныеПриемки.ИспользуетсяАдресноеХранение		КАК ИспользуетсяАдресноеХранение,
	|	ДанныеПриемки.ИспользуетсяСправочноеХранение	КАК ИспользуетсяСправочноеХранение,
	|	ДанныеПриемки.ИспользуетсяОрдернаяСхема			КАК ИспользуетсяОрдернаяСхема
	|ИЗ
	|	ДанныеПриемки КАК ДанныеПриемки
	|ГДЕ
	|	ДанныеПриемки.ПроверитьОрдерностьСклада
	|	И (ДанныеПриемки.ИспользуетсяОрдернаяСхема
	|		ИЛИ ДанныеПриемки.ИспользуетсяАдресноеХранение
	|		ИЛИ НЕ ДанныеПриемки.ИспользуетсяСправочноеХранение)
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ДанныеПриемки.Ссылка							КАК Ссылка,
	|	ДанныеПриемки.Склад								КАК Склад,
	|	ДанныеПриемки.СкладПредставление				КАК СкладПредставление,
	|	ДанныеПриемки.ПомещениеПредставление			КАК ПомещениеПредставление,
	|	ДанныеПриемки.ЭтоНакладная						КАК ЭтоНакладная,
	|	ДанныеПриемки.ИспользуетсяАдресноеХранение		КАК ИспользуетсяАдресноеХранение,
	|	ДанныеПриемки.ИспользуетсяСправочноеХранение	КАК ИспользуетсяСправочноеХранение,
	|	ДанныеПриемки.ИспользуетсяОрдернаяСхема			КАК ИспользуетсяОрдернаяСхема
	|ИЗ
	|	ДанныеПриемки КАК ДанныеПриемки
	|ГДЕ
	|	НЕ ДанныеПриемки.ПроверитьОрдерностьСклада
	|	И (ДанныеПриемки.ИспользуетсяАдресноеХранение
	|		ИЛИ НЕ ДанныеПриемки.ИспользуетсяСправочноеХранение)";
	
	Возврат ТекстЗапроса;
	
КонецФункции

&НаСервере
Функция ТекстЗапросаДокументБезТоваров(ИмяДокумента)
	
	ТекстЗапроса = 
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ДанныеДокумента.Ссылка КАК Ссылка
	|ИЗ
	|	&ИмяТаблицыДокумента КАК ДанныеДокумента
	|		ЛЕВОЕ СОЕДИНЕНИЕ ДанныеПриемки КАК ДанныеПриемки
	|		ПО ДанныеДокумента.Ссылка = ДанныеПриемки.Ссылка
	|ГДЕ
	|	ДанныеДокумента.Ссылка = &ДокументПриемки
	|	И ДанныеПриемки.Ссылка ЕСТЬ NULL";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыДокумента", ИмяДокумента);
	
	Возврат ТекстЗапроса;
	
КонецФункции

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

#Область ТекстыЗапросовТоварыДокумента

&НаСервере
Функция ТекстЗапросаВТТоварыДокументаПриемки(ИмяДокумента)
	
	Если Не ИспользоватьДанныеДокумента(ИмяДокумента) Тогда
		МенеджерОбъекта	= ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяДокумента);
		ТекстЗапроса	= МенеджерОбъекта.ТекстЗапросаТоварыДокументаДляПечатиЗаданияНаОтборРазмещениеТоваров();
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПОМЕСТИТЬ ТоварыДокумента", "ПОМЕСТИТЬ ТоварыДокументаПриемки");
	Иначе
		ТекстыВложенныхТаблиц	= Новый Массив;
		ТекстОбъединения		= ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении();
		ТекстЗапроса			= ШаблонТекстаЗапросаТоварыДокументаПриемки();
		
		ИмяТЧ = "";
		
		Для Каждого ЗначениеСписка Из ПравилаПечати Цикл
			ПравилоПечати = ЗначениеСписка.Значение;
			
			Если ПравилоПечати.ИмяТЧТовары = ИмяТЧ Тогда
				Продолжить;
			КонецЕсли;
			
			ТекстЗапросаТоварыДокумента = ТекстЗапросаТоварыДокументаПриемки(ИмяДокумента, ПравилоПечати);
			
			ТекстыВложенныхТаблиц.Добавить(ТекстЗапросаТоварыДокумента);
		КонецЦикла;
		
		ТекстЗапросаВТ	= СтрСоединить(ТекстыВложенныхТаблиц, ТекстОбъединения);
		ТекстЗапроса	= СтрЗаменить(ТекстЗапроса, "#ТоварыДокумента", "(" + ТекстЗапросаВТ + ")");
	КонецЕсли;
	
	Возврат ТекстЗапроса;
	
КонецФункции

&НаСервере
Функция ШаблонТекстаЗапросаТоварыДокументаПриемки()
	
	ШаблонТекстаЗапроса =
	"ВЫБРАТЬ
	|	ТаблицаТоваров.Ссылка				КАК Ссылка,
	|	ТаблицаТоваров.Склад				КАК Склад,
	|	ТаблицаТоваров.Помещение			КАК Помещение,
	|	МИНИМУМ(ТаблицаТоваров.НомерСтроки)	КАК НомерСтроки,
	|	ТаблицаТоваров.Номенклатура			КАК Номенклатура,
	|	ТаблицаТоваров.Характеристика		КАК Характеристика
	|ПОМЕСТИТЬ ТоварыДокументаПриемки
	|ИЗ
	|	#ТоварыДокумента КАК ТаблицаТоваров
	|
	|СГРУППИРОВАТЬ ПО
	|	ТаблицаТоваров.Ссылка,
	|	ТаблицаТоваров.Склад,
	|	ТаблицаТоваров.Помещение,
	|	ТаблицаТоваров.Номенклатура,
	|	ТаблицаТоваров.Характеристика
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Ссылка,
	|	Склад,
	|	Помещение,
	|	Номенклатура,
	|	Характеристика";
	
	Возврат ШаблонТекстаЗапроса;
	
КонецФункции

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

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

&НаСервере
Функция ИспользоватьДанныеДокумента(ИмяДокумента)
	
	ДокументыИсключения = Новый Массив;
	ДокументыИсключения.Добавить(Метаданные.Документы.ВозвратТоваровОтКлиента.ПолноеИмя());
	ДокументыИсключения.Добавить(Метаданные.Документы.СборкаТоваров.ПолноеИмя());
	//++ НЕ УТ
	ДокументыИсключения.Добавить(Метаданные.Документы.РаспределениеВозвратныхОтходов.ПолноеИмя());
	//-- НЕ УТ
	
	ИспользоватьДанныеДокумента = ДокументыИсключения.Найти(ИмяДокумента) = Неопределено;
	
	Возврат ИспользоватьДанныеДокумента;
	
КонецФункции

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

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

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

// Осуществляется инициализация информации о местах хранения товаров.
//
// Параметры:
//	ДокументПриемки - ДокументСсылка - ссылка на документ в информационной базе.
//	ДанныеДокумента - см. ПолучитьДанныеДокумента.
//
&НаСервере
Процедура ИнициализироватьМестаХранения(ДокументПриемки, ДанныеДокумента)
	
	ПравилоПечати = ПравилаПечати[0].Значение;
	
	ВыборкаПоШапке = ДанныеДокумента.РезультатПоШапкеДокумента.Выбрать();
	ВыборкаПоШапке.Следующий();
	
	Если Не ПравилоПечати.СкладыВТЧ Тогда
		ЗаполнитьЗначенияСвойств(Объект, ВыборкаПоШапке, "Склад");
	Иначе
		Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ДокументПриемки, "Склад") Тогда
			Объект.Склад = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДокументПриемки, "Склад");
		Иначе
			Объект.Склад = Неопределено;
		КонецЕсли;
	КонецЕсли;
	
	ЗаполнитьЗначенияСвойств(Объект, ВыборкаПоШапке, "Дата, Помещение");
	
КонецПроцедуры

&НаСервере
Процедура ИнициализироватьТаблицыЯчеек(ДанныеДокумента)
	
	ВыборкаПоТоварам = ДанныеДокумента.РезультатПоТабличнойЧасти.Выбрать();
	
	ТекущаяНоменклатура		= Неопределено;
	ТекущаяХарактеристика	= Неопределено;
	
	Пока ВыборкаПоТоварам.Следующий() Цикл
		
		Если ВыборкаПоТоварам.ОсновнаяЯчейка
			Или (ТекущаяНоменклатура <> ВыборкаПоТоварам.Номенклатура
				И ТекущаяХарактеристика <> ВыборкаПоТоварам.Характеристика) Тогда
			
			// Если основная ячейка, или основная ячейка не назначена.
			НоваяСтрока = Объект.ОсновныеЯчейки.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаПоТоварам, , "НомерСтроки");
			
			Если Не ВыборкаПоТоварам.ОсновнаяЯчейка Тогда
				НоваяСтрока.Ячейка = Справочники.СкладскиеЯчейки.ПустаяСсылка();
				
				Отбор = Новый Структура("Номенклатура, Склад, Ячейка");
				ЗаполнитьЗначенияСвойств(Отбор, ВыборкаПоТоварам);
			
				Если Объект.ДополнительныеЯчейки.НайтиСтроки(Отбор).Количество() = 0 Тогда
					НоваяСтрока = Объект.ДополнительныеЯчейки.Добавить();
					ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаПоТоварам, , "НомерСтроки");
				КонецЕсли;
			КонецЕсли;
			
			ТекущаяНоменклатура		= ВыборкаПоТоварам.Номенклатура;
			ТекущаяХарактеристика	= ВыборкаПоТоварам.Характеристика;
			
		Иначе
			
			Отбор = Новый Структура("Номенклатура, Склад, Ячейка");
			ЗаполнитьЗначенияСвойств(Отбор, ВыборкаПоТоварам);
			
			Если Объект.ДополнительныеЯчейки.НайтиСтроки(Отбор).Количество() = 0 Тогда
				НоваяСтрока = Объект.ДополнительныеЯчейки.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаПоТоварам, , "НомерСтроки");
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ОбработатьНазначениеДополнительнойЯчейки(Номенклатура, Склад, Ячейка)
	
	Если ЗначениеЗаполнено(Ячейка) Тогда
		
		Отбор = Новый Структура("Номенклатура, Склад, Ячейка", Номенклатура, Склад, Ячейка);
		
		ДопЯчейки = Объект.ДополнительныеЯчейки.НайтиСтроки(Отбор);
		
		Если ДопЯчейки.Количество() > 1 Тогда
			
			ПерваяСтрока = Истина;
			
			Для Каждого СтрМас Из ДопЯчейки Цикл
				Если ПерваяСтрока Тогда
					ПерваяСтрока = Ложь;
				Иначе
					Объект.ДополнительныеЯчейки.Удалить(СтрМас);
				КонецЕсли;
			КонецЦикла;
			
		ИначеЕсли ДопЯчейки.Количество() = 0 Тогда
			
			НоваяСтрока = Объект.ДополнительныеЯчейки.Добавить();
			НоваяСтрока.Номенклатура	= Номенклатура;
			НоваяСтрока.Ячейка			= Ячейка;
			НоваяСтрока.Склад			= Склад;
			
		КонецЕсли;
		
		ОснЯчейки = Объект.ОсновныеЯчейки.НайтиСтроки(Отбор);
		
		Для Каждого СтрМас Из ОснЯчейки Цикл
			СтрМас.Ячейка = Неопределено;
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьНазначениеОсновнойЯчейки(Номенклатура, Склад,Ячейка, ДобавлятьВДополнительные)
	
	Если ЗначениеЗаполнено(Ячейка) Тогда
		
		Отбор		= Новый Структура("Номенклатура, Склад, Ячейка", Номенклатура, Склад, Ячейка);
		ДопЯчейки	= Объект.ДополнительныеЯчейки.НайтиСтроки(Отбор);
		
		Для Каждого СтрМас Из ДопЯчейки Цикл
			Объект.ДополнительныеЯчейки.Удалить(СтрМас);
		КонецЦикла;
		
		ОтборБезЯчеек	= Новый Структура("Номенклатура, Склад", Номенклатура, Склад);
		ОснЯчейки		= Объект.ОсновныеЯчейки.НайтиСтроки(ОтборБезЯчеек);
		
		Для Каждого СтрМас Из ОснЯчейки Цикл
			
			Если ДобавлятьВДополнительные
				И ЗначениеЗаполнено(СтрМас.Ячейка) Тогда
				
				ОтборПоиска = Новый Структура("Номенклатура, Склад, Ячейка");
				ЗаполнитьЗначенияСвойств(ОтборПоиска, СтрМас);
				
				Если Объект.ДополнительныеЯчейки.НайтиСтроки(ОтборПоиска).Количество() = 0 Тогда
					НоваяСтрока = Объект.ДополнительныеЯчейки.Добавить();
					ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрМас);
				КонецЕсли;
				
			КонецЕсли;
			
			СтрМас.Ячейка = Ячейка;
			
		КонецЦикла;
		
		Отбор = Новый ФиксированнаяСтруктура("Номенклатура, Склад", Номенклатура, Склад);
		
		Элементы.ДополнительныеЯчейки.ОтборСтрок = Отбор;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

#Область Инициализация

ВыполняетсяЗакрытие = Ложь;

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

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