Склады / Модуль менеджера

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

#Область ПрограммныйИнтерфейс

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

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

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

// Возвращает имена блокируемых реквизитов для механизма блокирования реквизитов БСП.
//
// Возвращаемое значение:
//	Массив - имена блокируемых реквизитов.
//
Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт

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

КонецФункции

// Возвращает розничный склад, если найден один розничный склад, иначе - пустую ссылку.
//
//	Возвращаемое значение:
//		СправочникСсылка.Склады - розничный склад.
//
Функция РозничныйСкладПоУмолчанию() Экспорт
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 2
	|	Склады.Ссылка КАК Склад
	|ИЗ
	|	Справочник.Склады КАК Склады
	|ГДЕ
	|	(НЕ Склады.ПометкаУдаления)
	|	И Склады.ТипСклада = ЗНАЧЕНИЕ(Перечисление.ТипыСкладов.РозничныйМагазин)");
	
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Количество() = 1 
	   И Выборка.Следующий()
	Тогда
		Склад = Выборка.Склад;
	Иначе
		Склад = Справочники.Склады.ПустаяСсылка();
	КонецЕсли;
	
	Возврат Склад;

КонецФункции 

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

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

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

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

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

// Проверяет в привилегированном режиме, является ли элемент справочника группой складов, и при этом
//  склады могут указываться в табличных частях документов продажи.
//
// Параметры:
//  Склад	 - СправочникСсылка.Склады	 - элемента справочника, для которого производится проверка.
// 
// Возвращаемое значение:
//  Булево - склад является группой складов.
//
Функция ЭтоГруппаИСкладыИспользуютсяВТЧДокументовПродажи(Склад) Экспорт
	
	Если ЗначениеЗаполнено(Склад) 
		И ПолучитьФункциональнуюОпцию("ИспользоватьСкладыВТабличнойЧастиДокументовПродажи") Тогда
		Возврат Справочники.Склады.ЭтоГруппа(Склад);
	Иначе
		Возврат Ложь;
	КонецЕсли;
	
КонецФункции 

// Проверяет в привилегированном режиме, является ли элемент справочника группой складов, и при этом
//  склады могут указываться в табличных частях документов закупки.
//
// Параметры:
//  Склад	 - СправочникСсылка.Склады	 - Склад, признак которого нужно получить.
// 
// Возвращаемое значение:
//  Булево - склад является группой складов. Склады этой группы могут указывать в табличной части
//  документа закупки.
//
Функция ЭтоГруппаИСкладыИспользуютсяВТЧДокументовЗакупки(Склад) Экспорт
	
	Если ЗначениеЗаполнено(Склад) 
		И ПолучитьФункциональнуюОпцию("ИспользоватьСкладыВТабличнойЧастиДокументовЗакупки") Тогда
		Возврат Справочники.Склады.ЭтоГруппа(Склад);
	Иначе
		Возврат Ложь;
	КонецЕсли;
	
КонецФункции 

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

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

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

	Возврат МассивГрупп; 
	
КонецФункции

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

	//++ НЕ УТ
	Описание = ОписаниеОбъекта();
	Описание.Имя = "ВозвратМатериаловИзПроизводства";
	Описания.Добавить(Описание);
	
	Описание = ОписаниеОбъекта();
	Описание.Имя = "ВыпускПродукции";
	Описания.Добавить(Описание);
	//-- НЕ УТ


	//-- Устарело_Производство21
	Возврат ТекстЗапросаРасчетаРекомендуемойДатыНачалаНовойСхемыУчетаНаСкладе(Описания);
КонецФункции

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

	//++ Устарело_Производство21
	Описание = ОписаниеОбъекта();
	Описание.Имя = "ПередачаМатериаловВПроизводство";
	Описания.Добавить(Описание);
	//-- Устарело_Производство21
	
	Описание = ОписаниеОбъекта();
	Описание.Имя = "ЗаказМатериаловВПроизводство";
	Описание.ИмяПоляДата = "ТЧ.НачалоОтгрузки";
	Описания.Добавить(Описание);
	
	//++ Устарело_Переработка24
	Описание = ОписаниеОбъекта();
	Описание.Имя = "ЗаказПереработчику";
	Описание.ИмяПоляДата = "ТЧ.ДатаОтгрузки";
	Описание.ИмяПоляСклад = "ТЧ.Склад";
	Описание.ИмяТЧ = "Материалы";
	Описания.Добавить(Описание);
	//-- Устарело_Переработка24
	
	Описание = ОписаниеОбъекта();
	Описание.Имя = "ЗаказПереработчику2_5";
	Описание.ИмяПоляДата = "ТЧ.ДатаОтгрузки";
	Описание.ИмяПоляСклад = "ТЧ.Склад";
	Описание.ИмяТЧ = "ОбеспечениеМатериаламиИРаботами";
	Описания.Добавить(Описание);
	

	//-- НЕ УТ
	
	Возврат ТекстЗапросаРасчетаРекомендуемойДатыНачалаНовойСхемыУчетаНаСкладе(Описания);
КонецФункции

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

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

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

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

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

// Производит удаление индивидуального прайс листа для объекта.
// 
// Параметры:
// 	Ссылка - СправочникСсылка.Склады - Ссылка на колонку прайс лист.
// Возвращаемое значение:
// 	Булево - результат выполнения.
Функция УдалитьИПЛ(Ссылка) Экспорт
	РезультатОперации = Ложь;	
	
	СправочникОбъект = Ссылка.получитьОбъект();
	СправочникОбъект.ИндивидуальныйВидЦены = Справочники.ВидыЦен.ПустаяСсылка();
	УстановитьПривилегированныйРежим(Истина);
	СправочникОбъект.Записать();
	УстановитьПривилегированныйРежим(Ложь);
	
	РезультатОперации = Истина;
	
	Возврат РезультатОперации;
КонецФункции
 
#Область Команды

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

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

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа.
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЭтоГруппа ИЛИ
	|	ЗначениеРазрешено(Ссылка)";
	
	Ограничение.ТекстДляВнешнихПользователей =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЗначениеРазрешено(Ссылка)";

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

#Область ДляДоступаКСвойствамСкладов

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

// Возвращает значения по умолчанию для параметров склада.
// 
// Возвращаемое значение:
//  Структура - Значения по умолчанию:
// * Ссылка - СправочникСсылка.Склады - 
// * ИспользоватьАдресноеХранение - Булево - 
// * ИспользоватьАдресноеХранениеСправочно - Булево - 
// * ИспользоватьОрдернуюСхемуПриОтгрузке - Булево - 
// * ИспользоватьОрдернуюСхемуПриОтраженииИзлишковНедостач - Булево - 
// * ИспользоватьОрдернуюСхемуПриПоступлении - Булево - 
// * ИспользоватьСерииНоменклатуры - Булево - 
// * ИспользоватьСкладскиеПомещения - Булево - 
// * КонтролироватьОперативныеОстатки - Булево - 
// * НастройкаАдресногоХранения - ПеречислениеСсылка.НастройкиАдресногоХранения - 
// * ТипСклада - ПеречислениеСсылка.ТипыСкладов - 
// * ИспользованиеРабочихУчастков - ПеречислениеСсылка.ИспользованиеСкладскихРабочихУчастков - 
// * ИспользоватьСтатусыРасходныхОрдеров - Булево - 
// * ИспользоватьСтатусыПриходныхОрдеров - Булево - 
// * ИспользоватьСтатусыПересчетовТоваров - Булево - 
// * ДатаНачалаОрдернойСхемыПриОтгрузке - Дата - 
// * ДатаНачалаОрдернойСхемыПриПоступлении - Дата - 
// * ДатаНачалаОрдернойСхемыПриОтраженииИзлишковНедостач - Дата - 
// * ДатаНачалаИспользованияСкладскихПомещений - Дата - 
// * ДатаНачалаАдресногоХраненияОстатков - Дата - 
// * УчитыватьСебестоимостьПоСериям - Булево - 
// * КонтролироватьСвободныеОстатки - Булево - 
// * СкладОтветственногоХранения - Булево - 
// * ВидПоклажедержателя - ПеречислениеСсылка.ВидыПоклажедержателей - 
// * Поклажедержатель - Неопределено - 
// * СрокОтветственногоХранения - Число - 
// * ОтветственноеХранениеДоВостребования - Булево - 
// * УсловияХраненияТоваров - Строка - 
// * ЦеховаяКладовая - Булево - 
Функция ЗначенияПоУмолчанию() Экспорт
	
	СтруктураЗначений = Новый Структура;
	
	СтруктураЗначений.Вставить("Ссылка", Справочники.Склады.ПустаяСсылка());
	СтруктураЗначений.Вставить("ИспользоватьАдресноеХранение", Ложь);
	СтруктураЗначений.Вставить("ИспользоватьАдресноеХранениеСправочно", Ложь);
	СтруктураЗначений.Вставить("ИспользоватьОрдернуюСхемуПриОтгрузке", Ложь);
	СтруктураЗначений.Вставить("ИспользоватьОрдернуюСхемуПриОтраженииИзлишковНедостач", Ложь);
	СтруктураЗначений.Вставить("ИспользоватьОрдернуюСхемуПриПоступлении", Ложь);
	СтруктураЗначений.Вставить("ИспользоватьСерииНоменклатуры", Ложь);
	СтруктураЗначений.Вставить("ИспользоватьСкладскиеПомещения", Ложь);
	СтруктураЗначений.Вставить("КонтролироватьОперативныеОстатки", Ложь);
	СтруктураЗначений.Вставить("НастройкаАдресногоХранения", Перечисления.НастройкиАдресногоХранения.НеИспользовать);
	СтруктураЗначений.Вставить("ТипСклада", Перечисления.ТипыСкладов.ОптовыйСклад);
	СтруктураЗначений.Вставить("ИспользованиеРабочихУчастков", Перечисления.ИспользованиеСкладскихРабочихУчастков.НеИспользовать);
	СтруктураЗначений.Вставить("ИспользоватьСтатусыРасходныхОрдеров", Ложь);
	СтруктураЗначений.Вставить("ИспользоватьСтатусыПриходныхОрдеров", Ложь);
	СтруктураЗначений.Вставить("ИспользоватьСтатусыПересчетовТоваров", Ложь);
	СтруктураЗначений.Вставить("ДатаНачалаОрдернойСхемыПриОтгрузке", '00010101');
	СтруктураЗначений.Вставить("ДатаНачалаОрдернойСхемыПриПоступлении", '00010101');
	СтруктураЗначений.Вставить("ДатаНачалаОрдернойСхемыПриОтраженииИзлишковНедостач", '00010101');
	СтруктураЗначений.Вставить("ДатаНачалаИспользованияСкладскихПомещений", '00010101');
	СтруктураЗначений.Вставить("ДатаНачалаАдресногоХраненияОстатков", '00010101');
	СтруктураЗначений.Вставить("УчитыватьСебестоимостьПоСериям", Ложь);
	СтруктураЗначений.Вставить("КонтролироватьСвободныеОстатки", Ложь);
	СтруктураЗначений.Вставить("СкладОтветственногоХранения", Ложь);
	СтруктураЗначений.Вставить("ВидПоклажедержателя", Перечисления.ВидыПоклажедержателей.СобственнаяОрганизация);
	СтруктураЗначений.Вставить("Поклажедержатель", Неопределено);
	СтруктураЗначений.Вставить("СрокОтветственногоХранения", 0);
	СтруктураЗначений.Вставить("ОтветственноеХранениеДоВостребования", Ложь);
	СтруктураЗначений.Вставить("УсловияХраненияТоваров", "");
	СтруктураЗначений.Вставить("ЦеховаяКладовая", Ложь);
	
	Возврат СтруктураЗначений
	
КонецФункции

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

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

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

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

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

#КонецЕсли

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

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

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
	
	СкладыВызовСервера.СкладыОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка);
	
КонецПроцедуры

#КонецЕсли

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

Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
	
	МультиязычностьКлиентСервер.ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка);
	
КонецПроцедуры

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
	
	МультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка);
	
КонецПроцедуры

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

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

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

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

// Заполняет список команд печати.
// 
// Параметры:
//   КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
КонецПроцедуры

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

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

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

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

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

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

	Для Каждого Описание Из Описания Цикл
		ПрисоединитьТЧ = СтрНайти(Описание.ИмяПоляСклад,"ТЧ.") > 0 Или СтрНайти(Описание.ИмяПоляДата,"ТЧ.");
		
		Текст = ШаблонТекстаЗапроса;

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

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

// Возвращаемое значение:
// 	Структура - содержит:
// * ИмяПоляДата - Строка -
// * ИмяПоляСклад - Строка -
// * ИмяТЧ - Строка -
// * Имя - Строка - 
//
Функция ОписаниеОбъекта()
	
	Описание = Новый Структура;
	Описание.Вставить("Имя");
	Описание.Вставить("ИмяТЧ",             "Товары");
	Описание.Вставить("ИмяПоляСклад",      "Шапка.Склад");
	Описание.Вставить("ИмяПоляДата",       "Шапка.Дата");
	Возврат Описание;
	
КонецФункции

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

#Область ОбновлениеИнформационнойБазы

// см. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления
//
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт

	Обработчик = Обработчики.Добавить();
	Обработчик.Процедура = "Справочники.Склады.ОбработатьДанныеДляПереходаНаНовуюВерсию";
	Обработчик.Версия = "11.5.24.25";
	Обработчик.РежимВыполнения = "Отложенно";
	Обработчик.Идентификатор = Новый УникальныйИдентификатор("a6ec615b-1bd4-4a82-b8cb-9f57e390a0fa");
	Обработчик.Многопоточный = Истина;
	Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.Склады.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию";
	Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы";
	
	СписокОписаний = Новый Массив;
	СписокОписаний.Добавить(НСтр("ru = 'Обновление справочника ""Склады"":'"));
	СписокОписаний.Добавить(НСтр("ru = '- Заполнение мультиязычных реквизитов справочника';"));
	
	Обработчик.Комментарий = СтрСоединить(СписокОписаний, Символы.ПС);
	Обработчик.Порядок = Перечисления.ПорядокОбработчиковОбновления.Обычный;
	
	Читаемые = Новый Массив;
	Читаемые.Добавить(Метаданные.Справочники.Склады.ПолноеИмя());
	Обработчик.ЧитаемыеОбъекты = СтрСоединить(Читаемые, ",");
	
	Изменяемые = Новый Массив;
	Изменяемые.Добавить(Метаданные.Справочники.Склады.ПолноеИмя());
	Обработчик.ИзменяемыеОбъекты = СтрСоединить(Изменяемые, ",");
	
	Блокируемые = Новый Массив;
	Блокируемые.Добавить(Метаданные.Справочники.Склады.ПолноеИмя());
	Обработчик.БлокируемыеОбъекты = СтрСоединить(Блокируемые, ",");

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

// Параметры:
// 	Параметры - см. ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке
//
Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт
	
	ПараметрыВыборки = Параметры.ПараметрыВыборки;
	ПараметрыВыборки.ПолныеИменаОбъектов = ПустаяСсылка().Метаданные().ПолноеИмя();
	ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиСсылки();
	
	ИспользуютсяДопЯзыки = Ложь;
	Для Каждого ИспользуетсяДопЯзык Из МультиязычностьСервер.СведенияОЯзыках().Используется Цикл
		
		Если ИспользуетсяДопЯзык.Значение = Истина Тогда
			
			ИспользуютсяДопЯзыки = Истина;
			Прервать;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Если Не ИспользуютсяДопЯзыки Тогда
		
		Возврат;
		
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	Склады.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Склады КАК Склады
	|ГДЕ
	|	НЕ Склады.Наименование = """"
	|	И Склады.НаименованиеЯзык1 = """"
	|	
	|ОБЪЕДИНИТЬ 
	|
	|ВЫБРАТЬ
	|	Склады.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Склады КАК Склады
	|ГДЕ
	|	НЕ Склады.Наименование = """"
	|	И Склады.НаименованиеЯзык2 = """"
	|";
	
	ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"));
	
КонецПроцедуры

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

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

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

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

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