Генерация топологии склада / Форма / Модуль формы

файл

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

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

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

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

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

&НаКлиенте
Процедура СкладПриИзменении(Элемент)
	
	СкладПомещениеПриИзмененииСервер();
	
КонецПроцедуры

&НаКлиенте
Процедура ПомещениеПриИзменении(Элемент)
	
	СкладПомещениеПриИзмененииСервер();
	
КонецПроцедуры

&НаКлиенте
Процедура ИспользованиеПриИзменении(Элемент)
	
	ИмяУровня = Элемент.Имя;
	
	Если Элемент.Имя <> "Позиции" Тогда
		Объект[ИмяРеквизитаПоЧастиАдреса("СоздаватьГруппы", ИмяУровня)] = Объект[ИмяУровня];
	КонецЕсли;
	
	Если Не Объект[ИмяУровня] Тогда
		Объект[ИмяРеквизитаПоЧастиАдреса("Количество", ИмяУровня)] = 1;
	Иначе
		РасчитатьКоличествоЭлементовУровня(ИмяУровня);
	КонецЕсли;
	
	УстановитьВидимостьПоИспользованию(ИмяУровня);
	ПостроитьПример();
	РасчитатьКоличествоЭлементов();
	
КонецПроцедуры

&НаКлиенте
Процедура РазделительПриИзменении(Элемент)
	
	ПостроитьПример();
	
КонецПроцедуры

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

&НаКлиенте
Процедура ДиапазонБуквОтПриИзменении(Элемент)
	
	ИмяУровня = ИмяУровняПоИмениРеквизита(Элементы, Элемент.Имя);
	
	ПостроитьШаблонПоНомеруОт(ИмяУровня);
	ПроверитьНомерДоПоНомеруОт(ИмяУровня);
	
	ПостроитьПример();
	РасчитатьКоличествоЭлементовУровня(ИмяУровня);
	РасчитатьКоличествоЭлементов();
	
КонецПроцедуры

&НаКлиенте
Процедура ДиапазонБуквДоПриИзменении(Элемент)
	
	ИмяУровня = ИмяУровняПоИмениРеквизита(Элементы, Элемент.Имя);
	
	ПроверитьНомерДоПоНомеруОт(ИмяУровня);
	
	ПостроитьПример();
	РасчитатьКоличествоЭлементовУровня(ИмяУровня);
	РасчитатьКоличествоЭлементов();
	
КонецПроцедуры

&НаКлиенте
Процедура ДиапазонЧиселОтПриИзменении(Элемент)
	
	ИмяУровня = ИмяУровняПоИмениРеквизита(Элементы, Элемент.Имя);
	
	ИмяДиапазонЧиселОт = ИмяРеквизитаПоЧастиАдреса("ДиапазонЧиселОт", ИмяУровня);
	ИмяДиапазонЧиселДо = ИмяРеквизитаПоЧастиАдреса("ДиапазонЧиселДо", ИмяУровня);
	
	Если Объект[ИмяДиапазонЧиселОт] > Объект[ИмяДиапазонЧиселДо] Тогда
		Объект[ИмяДиапазонЧиселДо] = Объект[ИмяДиапазонЧиселОт];
	КонецЕсли;
	
	ПроверитьКоличествоЦифр(ИмяУровня);
	
	ПостроитьПример();
	РасчитатьКоличествоЭлементовУровня(ИмяУровня);
	РасчитатьКоличествоЭлементов();
	
КонецПроцедуры

&НаКлиенте
Процедура ДиапазонЧиселДоПриИзменении(Элемент)
	
	ИмяУровня = ИмяУровняПоИмениРеквизита(Элементы, Элемент.Имя);
	
	ИмяДиапазонЧиселОт = ИмяРеквизитаПоЧастиАдреса("ДиапазонЧиселОт", ИмяУровня);
	ИмяДиапазонЧиселДо = ИмяРеквизитаПоЧастиАдреса("ДиапазонЧиселДо", ИмяУровня);
	
	Если Объект[ИмяДиапазонЧиселОт] > Объект[ИмяДиапазонЧиселДо] Тогда
		Объект[ИмяДиапазонЧиселДо] = Объект[ИмяДиапазонЧиселОт];
	КонецЕсли;
	
	ПроверитьКоличествоЦифр(ИмяУровня);
	
	РасчитатьКоличествоЭлементовУровня(ИмяУровня);
	РасчитатьКоличествоЭлементов();
	
КонецПроцедуры

&НаКлиенте
Процедура ЛидирующиеНулиПриИзменении(Элемент)
	
	ИмяУровня = ИмяУровняПоИмениРеквизита(Элементы, Элемент.Имя);
	
	ПроверитьКоличествоЦифр(ИмяУровня);
	
	УстановитьДоступностьПоЛидирующимНулям(ИмяУровня);
	ПостроитьПример();
	
КонецПроцедуры

&НаКлиенте
Процедура КоличествоЦифрПриИзменении(Элемент)
	
	ИмяУровня = ИмяУровняПоИмениРеквизита(Элементы, Элемент.Имя);
	
	ПроверитьКоличествоЦифр(ИмяУровня);
	ПостроитьПример();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура СгенерироватьМассивУровня(ИмяУровня, МассивУровня, Счетчик)
	
	Если Объект[ИмяУровня] Тогда
		ТекНомер	= "";
		СтарыйНомер	= "старый";
		
		Пока Истина Цикл
			ТекНомер = СледующийНомерУровня(ТекНомер,ИмяУровня);
			
			Если СтарыйНомер <> ТекНомер Тогда
				МассивУровня.Добавить(ТекНомер);
				
				СтарыйНомер = ТекНомер;
				
				Счетчик = Счетчик + 1;
			Иначе
				Прервать;
			КонецЕсли;
		КонецЦикла;
	Иначе
		МассивУровня.Добавить("");
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция СледующийНомерУровня(ТекНомер, ИмяУровня, УчитыватьДиапазоны = Истина)
	
	НовыйНомер = "";
	
	Код0 = 48;
	Код9 = 57;
	
	Если Объект[ИмяРеквизитаПоЧастиАдреса("ТипНомера", ИмяУровня)] = "Числовой" Тогда
		
		Если УчитыватьДиапазоны Тогда
			ЧислоОт = Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонЧиселОт", ИмяУровня)];
			ЧислоДо = Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонЧиселДо", ИмяУровня)];
		Иначе
			ЧислоОт = 0;
			ЧислоДо = Pow(10,КоличествоЦифрУровня(ИмяУровня)) - 1;
		КонецЕсли;
		
		ЛидирНули	= Объект[ИмяРеквизитаПоЧастиАдреса("ЛидирующиеНули", ИмяУровня)];
		ДлинаНомера	= Объект[ИмяРеквизитаПоЧастиАдреса("КоличествоЦифр", ИмяУровня)];
		
		Если ПустаяСтрока(ТекНомер) Тогда
			НовыйНомер = Формат(ЧислоОт, "ЧЦ=" + Строка(ДлинаНомера) + "; ЧН=; " + ?(ЛидирНули, "ЧВН=;", "")+ "ЧГ=0");
		Иначе
			ТекЧисло = Число(ТекНомер)+ 1;
			Если ТекЧисло <= ЧислоДо Тогда 
				НовыйНомер = Формат(ТекЧисло, "ЧЦ=" + Строка(ДлинаНомера) + "; ЧН=; " + ?(ЛидирНули, "ЧВН=;", "") + "ЧГ=0");
			Иначе
				НовыйНомер = ТекНомер;
			КонецЕсли;
		КонецЕсли;
		
	Иначе
		
		Шаблон = Объект[ИмяРеквизитаПоЧастиАдреса("Шаблон", ИмяУровня)];
		ДлинаНомера = СтрДлина(Шаблон);
		
		НомерОт = Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонБуквОт", ИмяУровня)];
		НомерДо = Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонБуквДо", ИмяУровня)];
		
		Если ПустаяСтрока(ТекНомер) Тогда //Генерация первого номера
			НовыйНомер = НомерОт;
		Иначе //Генерация следующего номера
			
			НадоУвеличивать	= Истина;
			ТекРазряд		= ДлинаНомера;
			НовыйНомер		= ТекНомер;
			НаборБукв		= Объект[ИмяРеквизитаПоЧастиАдреса("НаборБукв", ИмяУровня)];
			
			Пока ТекРазряд > 0
				И НадоУвеличивать Цикл
				
				Если УчитыватьДиапазоны Тогда
					СимволОт = КодСимвола(Сред(НомерОт, ТекРазряд, 1));
					СимволДо = КодСимвола(Сред(НомерДо, ТекРазряд, 1));
				Иначе
					Если КодСимвола(Сред(НомерОт, ТекРазряд, 1)) > КодСимвола("9") Тогда
						СимволОт = МинимальнаяБукваУровня(НаборБукв);
						СимволДо = МаксимальнаяБукваУровня(НаборБукв);
					Иначе
						СимволОт = КодСимвола("1");
						СимволДо = КодСимвола("9");
					КонецЕсли;
				КонецЕсли;
				
				КодТекСимвола = КодСимвола(Сред(НовыйНомер, ТекРазряд, 1));
				
				Если ТекРазряд > 1 Тогда
					КодСледующегоСимвола = КодСимвола(Сред(НовыйНомер, ТекРазряд - 1, 1));
					СимволСледующийДо = КодСимвола(Сред(НомерДо, ТекРазряд - 1, 1));
				Иначе
					КодСледующегоСимвола = -1;
					СимволСледующийДо = -1;
				КонецЕсли;
				
				Если КодСледующегоСимвола < 0 
					Или Не ЭтоЦифра(КодСледующегоСимвола)
					Или Не ЭтоЦифра(КодТекСимвола) Тогда
					
					Если КодТекСимвола < СимволДо Тогда
						// Если можно, увеличиваем текущий разряд
						НовыйНомер = Лев(НовыйНомер, ТекРазряд - 1) + Символ(КодТекСимвола + 1)
										+ Прав(НовыйНомер, ДлинаНомера - ТекРазряд);
						НадоУвеличивать = Ложь;
					Иначе
						// иначе обнуляем текущий разряд и переходим к более страшему разряду
						НовыйНомер = Лев(НовыйНомер, ТекРазряд - 1) + Символ(СимволОт)
										+ Прав(НовыйНомер, ДлинаНомера - ТекРазряд);
					КонецЕсли;
					
				Иначе
					Если КодСледующегоСимвола < СимволСледующийДо Тогда
						
						Если КодТекСимвола < Код9 Тогда
							// Если можно, увеличиваем текущий разряд
							НовыйНомер = Лев(НовыйНомер, ТекРазряд - 1) + Символ(КодТекСимвола + 1)
											+ Прав(НовыйНомер, ДлинаНомера - ТекРазряд);
							НадоУвеличивать = Ложь;
						Иначе
							// иначе обнуляем текущий разряд и переходим к более страшему разряду
							НовыйНомер = Лев(НовыйНомер, ТекРазряд - 1) + Символ(Код0)
											+ Прав(НовыйНомер, ДлинаНомера - ТекРазряд);
						КонецЕсли;
						
					Иначе
						Если КодТекСимвола < СимволДо Тогда
							// Если можно, увеличиваем текущий разряд
							НовыйНомер = Лев(НовыйНомер, ТекРазряд - 1) + Символ(КодТекСимвола + 1)
											+ Прав(НовыйНомер, ДлинаНомера - ТекРазряд);
							НадоУвеличивать = Ложь;
						Иначе
							// иначе обнуляем текущий разряд и переходим к более страшему разряду
							НовыйНомер = Лев(НовыйНомер, ТекРазряд - 1) + Символ(СимволОт)
											+ Прав(НовыйНомер, ДлинаНомера - ТекРазряд);
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
				
				ТекРазряд = ТекРазряд - 1;
				
			КонецЦикла;
			
			Если НадоУвеличивать Тогда
				НовыйНомер = ТекНомер;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат НовыйНомер;
	
КонецФункции

&НаСервере
Функция ПредыдущийНомерУровня(ТекНомер, ИмяУровня, УчитыватьДиапазоны = Истина)
	
	НовыйНомер = "";
	
	Код0 = 48;
	Код9 = 57;
	
	Если Объект[ИмяРеквизитаПоЧастиАдреса("ТипНомера", ИмяУровня)] = "Числовой" Тогда
		
		ЧислоОт		= ?(УчитыватьДиапазоны, Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонЧиселОт", ИмяУровня)], 0);
		ЛидирНули	= Объект[ИмяРеквизитаПоЧастиАдреса("ЛидирующиеНули", ИмяУровня)];
		ДлинаНомера	= Объект[ИмяРеквизитаПоЧастиАдреса("КоличествоЦифр", ИмяУровня)];
		
		Если ПустаяСтрока(ТекНомер) Тогда
			НовыйНомер = Формат(ЧислоОт, "ЧЦ=" + Строка(ДлинаНомера) + "; ЧН=; " + ?(ЛидирНули, "ЧВН=;", "") + "ЧГ=0");
		Иначе
			ТекЧисло = Число(ТекНомер)- 1;
			Если ТекЧисло >= ЧислоОт Тогда 
				НовыйНомер = Формат(ТекЧисло,"ЧЦ="+Строка(ДлинаНомера)+"; ЧН=; " + ?(ЛидирНули, "ЧВН=;", "")+ "ЧГ=0");
			Иначе
				НовыйНомер = ТекНомер;
			КонецЕсли;
		КонецЕсли;
		
	Иначе
		
		Шаблон = Объект[ИмяРеквизитаПоЧастиАдреса("Шаблон", ИмяУровня)];
		ДлинаНомера = СтрДлина(Шаблон); 
		
		НомерОт = Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонБуквОт", ИмяУровня)];
		НомерДо = Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонБуквДо", ИмяУровня)];
		
		Если ПустаяСтрока(ТекНомер) Тогда //Генерация первого номера
			НовыйНомер = НомерОт;
		Иначе //Генерация предыдущего номера
			
			НадоУменьшать	= Истина;
			ТекРазряд		= ДлинаНомера;
			НовыйНомер		= ТекНомер;
			НаборБукв		= Объект[ИмяРеквизитаПоЧастиАдреса("НаборБукв", ИмяУровня)];

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

&НаСервере
Процедура ПостроитьПример()
	
	СтрПримера = "";
	
	Для Каждого УровеньАдреса Из ЧастиАдреса Цикл
		Если Объект[УровеньАдреса] Тогда
			НовыйНомер = СледующийНомерУровня("", УровеньАдреса);
			СтрПримера = СтрПримера + СокрЛП(НовыйНомер) + РазделительУровня(УровеньАдреса);
		КонецЕсли;
	КонецЦикла;
	
	УдалитьРазделительВКонце(СтрПримера, СтрокаРазделителей);
	
	Объект.Пример = СтрПримера;
	
КонецПроцедуры

&НаСервере
Функция РазделительУровня(ИмяУровня)
	
	Разделитель = "";
	
	Если ИмяУровня <> "Позиции" Тогда
		Разделитель = СокрЛП(Объект[ИмяРеквизитаПоЧастиАдреса("Разделитель", ИмяУровня)]);
		
		Если Не ПустаяСтрока(Разделитель) Тогда
			Если Разделитель = "П" Тогда
				Разделитель = " ";
			ИначеЕсли Разделитель = "Н" Тогда
				Разделитель = "";
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Возврат Разделитель;
	
КонецФункции

&НаСервере
Функция АдресПоНомерам(Секция, Линия, Стеллаж = Неопределено, Ярус = Неопределено, Позиция = Неопределено)
	
	Адрес = "";
	
	Если ЗначениеЗаполнено(Секция) Тогда
		Адрес = Адрес + СокрЛП(Секция) + РазделительУровня("Секции");
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Линия) Тогда
		Адрес = Адрес + СокрЛП(Линия) + РазделительУровня("Линии");
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Стеллаж) Тогда
		Адрес = Адрес + СокрЛП(Стеллаж) + РазделительУровня("Стеллажи");
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Ярус) Тогда
		Адрес = Адрес + СокрЛП(Ярус) + РазделительУровня("Ярусы");
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Позиция) Тогда
		Адрес = Адрес + СокрЛП(Позиция);
	КонецЕсли;
	
	УдалитьРазделительВКонце(Адрес, СтрокаРазделителей);
	
	Возврат Адрес;
	
КонецФункции

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

	Если ВТабличныйДокумент Тогда
		ТабДок.ЗакончитьАвтогруппировкуСтрок();
		
		Возврат ТабДок;
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции

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

&НаСервере
Процедура СкладПомещениеПриИзмененииСервер()
	
	УстановитьПараметрыФункциональныхОпцийФормы(Новый Структура("Склад, Помещение", Объект.Склад, Объект.Помещение));
	
	ИспользоватьАдресноеХранение = СкладыСервер.ИспользоватьАдресноеХранение(Объект.Склад, Объект.Помещение, ,Ложь);
	
	Элементы.МаксимальныйКоэффициентНаполненностиПоВесуПроцент.Видимость	= ИспользоватьАдресноеХранение;
	Элементы.МаксимальныйКоэффициентНаполненностиПоОбъемуПроцент.Видимость	= ИспользоватьАдресноеХранение;
	
КонецПроцедуры

&НаСервере
Функция ЭтоЦифра(КодСимвола)
	
	Код0 = 48;
	Код9 = 57;
	
	Если КодСимвола >= Код0
		И КодСимвола <= Код9 Тогда
		
		Возврат Истина;
		
	Иначе
		Возврат Ложь;
	КонецЕсли;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста 
Функция МаксимальнаяБукваУровня(НаборБукв)
	
	Если НаборБукв = "РУС" Тогда
		КодКонечногоСимвола = 1071;
	Иначе
		КодКонечногоСимвола = 90;
	КонецЕсли;
	
	Возврат КодКонечногоСимвола;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста 
Функция МинимальнаяБукваУровня(НаборБукв)
	
	Если НаборБукв = "РУС" Тогда
		КодНачальногоСимвола = 1040;
	Иначе
		КодНачальногоСимвола = 65;
	КонецЕсли;
	
	Возврат КодНачальногоСимвола;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура УдалитьРазделительВКонце(Адрес, СтрокаРазделителей)
	
	Адрес = СокрЛП(Адрес);
	ДлинаАдреса = СтрДлина(Адрес);
	
	Если ДлинаАдреса > 0 Тогда
		ПоследнийСимвол = Прав(Адрес, 1);
		
		Если СтрНайти(СтрокаРазделителей, ПоследнийСимвол) <> 0 Тогда
			Адрес = Лев(Адрес,ДлинаАдреса - 1);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция КоличествоЦифрУровня(ИмяУровня)
	
	Если ИмяУровня = "Позиции" Тогда
		ДлинаМакс = 2;
	ИначеЕсли ИмяУровня = "Стеллажи" Тогда
		ДлинаМакс = 5;
	Иначе
		ДлинаМакс = 3;
	КонецЕсли;
	
	Возврат ДлинаМакс;
	
КонецФункции

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

&НаКлиенте
Функция ИмяРеквизитаЛидирующиеНули(ИмяУровня)
	
	Если ИмяУровня = "Секции" Тогда
		Возврат "ЛидирующиеНулиСекции";
	ИначеЕсли ИмяУровня = "Линии" Тогда
		Возврат "ЛидирующиеНулиЛинии";
	ИначеЕсли ИмяУровня = "Стеллажи" Тогда
		Возврат "ЛидирующиеНулиСтеллажи";
	ИначеЕсли ИмяУровня = "Ярусы" Тогда
		Возврат "ЛидирующиеНулиЯрусы";
	ИначеЕсли ИмяУровня = "Позиции" Тогда
		Возврат "ЛидирующиеНулиПозиции";
	КонецЕсли;
	
КонецФункции

&НаКлиенте
Процедура УстановитьДоступностьПоЛидирующимНулям(ИмяУровня)
	
	ЭлементУровня = Элементы[ИмяРеквизитаПоЧастиАдреса("КоличествоЦифр", ИмяУровня)]; // ПолеФормы
	ЭлементУровня.Доступность = Объект[ИмяРеквизитаПоЧастиАдреса("ЛидирующиеНули", ИмяУровня)];

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

&НаКлиенте
Процедура РасчитатьКоличествоЭлементовУровня(ИмяУровня)
	
	ИмяКоличество = ИмяРеквизитаПоЧастиАдреса("Количество", ИмяУровня);
	
	Объект[ИмяКоличество] = 1;
	
	Если Объект[ИмяРеквизитаПоЧастиАдреса("ТипНомера", ИмяУровня)] = "Числовой" Тогда
		Объект[ИмяКоличество] = Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонЧиселДо", ИмяУровня)]
								- Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонЧиселОт", ИмяУровня)] + 1;
	Иначе
		Шаблон = Объект[ИмяРеквизитаПоЧастиАдреса("Шаблон", ИмяУровня)];
		ДлинаНомера = СтрДлина(Шаблон); 
		
		Для ТекРазряд = 1 По ДлинаНомера Цикл
			БукваОт = КодСимвола(Сред(Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонБуквОт", ИмяУровня)], ТекРазряд, 1));
			БукваДо = КодСимвола(Сред(Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонБуквДо", ИмяУровня)] ,ТекРазряд, 1));
			
			КоличествоБукв = БукваДо - БукваОт + 1;
			
			Объект[ИмяКоличество] = Объект[ИмяКоличество] * КоличествоБукв;
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура РасчитатьКоличествоЭлементов()
	
	Если Не (Объект.Секции
		Или Объект.Линии
		Или Объект.Стеллажи
		Или Объект.Ярусы
		Или Объект.Позиции) Тогда
		
		Объект.КоличествоЯчеек = 0;
		
	Иначе
		
		Объект.КоличествоЯчеек = Объект.КоличествоСекции * Объект.КоличествоЛинии * Объект.КоличествоСтеллажи
									* Объект.КоличествоЯрусы * Объект.КоличествоПозиции;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПостроитьШаблонПоНомеруОт(ИмяУровня)
	
	НомерОт		= Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонБуквОт", ИмяУровня)];
	НаборБукв	= Объект[ИмяРеквизитаПоЧастиАдреса("НаборБукв", ИмяУровня)];
	
	НомерОт = СокрЛП(ВРег(НомерОт));
	
	КодНачальногоСимвола	= МинимальнаяБукваУровня(НаборБукв);
	КодКонечногоСимвола		= МаксимальнаяБукваУровня(НаборБукв);
	
	Код0 = 48;
	Код9 = 57;
	
	НомерОт = СокрЛП(НомерОт);
	ДлинаНомера = СтрДлина(НомерОт);
	
	НовыйШаблон = "";
	
	Для ТекРазряд = 1 По ДлинаНомера Цикл
		
		СимволОт = КодСимвола(Сред(НомерОт,ТекРазряд,1));
		
		Если СимволОт >= КодНачальногоСимвола
			И СимволОт <= КодКонечногоСимвола Тогда
			
			НовыйШаблон = НовыйШаблон + Символ(СимволОт);
			
		ИначеЕсли СимволОт >= Код0
			И СимволОт <= Код9 Тогда
			
			НовыйШаблон = НовыйШаблон + Символ(СимволОт);
			
		Иначе
			НовыйШаблон = НовыйШаблон + Символ(КодНачальногоСимвола);
			НомерОт = Лев(НомерОт, ТекРазряд - 1) + Символ(КодНачальногоСимвола) + Прав(НомерОт, ДлинаНомера - ТекРазряд);
		КонецЕсли;
		
	КонецЦикла;
	
	Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонБуквОт", ИмяУровня)] = НомерОт;
	Объект[ИмяРеквизитаПоЧастиАдреса("Шаблон", ИмяУровня)] = НовыйШаблон;
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьНомерДоПоНомеруОт(ИмяУровня)
	
	Шаблон		= Объект[ИмяРеквизитаПоЧастиАдреса("Шаблон", ИмяУровня)];
	НаборБукв	= Объект[ИмяРеквизитаПоЧастиАдреса("НаборБукв", ИмяУровня)];
	НомерОт		= Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонБуквОт", ИмяУровня)];
	НомерДо		= Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонБуквДо", ИмяУровня)];
	
	ДлинаНомера		= СтрДлина(Шаблон);
	ДлинаНомераДо	= СтрДлина(НомерДо);
	
	Если ДлинаНомераДо < ДлинаНомера  Тогда
		Для Индекс = 1 По ДлинаНомераДо - ДлинаНомера Цикл
			НомерДо = НомерДо + " ";
		КонецЦикла;
	ИначеЕсли ДлинаНомераДо > ДлинаНомера Тогда
		НомерДо = Лев(НомерОт, ДлинаНомера);
	КонецЕсли;
	
	НомерДо = ВРег(НомерДо);
	
	КодНачальногоСимвола	= МинимальнаяБукваУровня(НаборБукв);
	КодКонечногоСимвола		= МаксимальнаяБукваУровня(НаборБукв);
	
	Для ТекРазряд = 1 По ДлинаНомера Цикл
		
		СимволОт = КодСимвола(Сред(НомерОт, ТекРазряд, 1));
		КодТекСимвола = КодСимвола(Сред(НомерДо, ТекРазряд, 1));
		
		Если КодТекСимвола < СимволОт Тогда
			НомерДо = Лев(НомерДо, ТекРазряд - 1) + Символ(СимволОт) + Прав(НомерДо, ДлинаНомера - ТекРазряд);
		Иначе
			КодТекСимволШаблона = КодСимвола(Сред(Шаблон, ТекРазряд, 1));
			
			Если КодТекСимволШаблона >= КодНачальногоСимвола 
				И КодТекСимволШаблона <= КодКонечногоСимвола Тогда
				
				Если КодТекСимвола > КодКонечногоСимвола Тогда
					НомерДо = Лев(НомерДо, ТекРазряд - 1) + Символ(СимволОт) + Прав(НомерДо, ДлинаНомера - ТекРазряд);
				КонецЕсли;
				
			Иначе
				Если КодТекСимвола > 57 Тогда
					НомерДо = Лев(НомерДо, ТекРазряд - 1) + Символ(СимволОт) + Прав(НомерДо, ДлинаНомера - ТекРазряд);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
			
	КонецЦикла;
	
	Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонБуквДо", ИмяУровня)] = НомерДо;
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьКоличествоЦифр(ИмяУровня)
	
	ИмяКоличествоЦифр = ИмяРеквизитаПоЧастиАдреса("КоличествоЦифр", ИмяУровня);
	
	ДлинаНомера	= СтрДлина(Формат(Объект[ИмяРеквизитаПоЧастиАдреса("ДиапазонЧиселДо", ИмяУровня)], "ЧН=; ЧГ=0"));
	ДлинаМакс	= КоличествоЦифрУровня(ИмяУровня);
	
	Если Объект[ИмяКоличествоЦифр] < ДлинаНомера Тогда
		Объект[ИмяКоличествоЦифр] = ДлинаНомера;
	ИначеЕсли Не Объект[ИмяРеквизитаПоЧастиАдреса("ЛидирующиеНули", ИмяУровня)] Тогда
		Объект[ИмяКоличествоЦифр] = ДлинаНомера;
	ИначеЕсли Объект[ИмяКоличествоЦифр] > ДлинаМакс Тогда
		Объект[ИмяКоличествоЦифр] = ДлинаМакс;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ИмяРеквизитаПоЧастиАдреса(ИмяПараметра, ЧастьАдреса)
	
	Если ИмяПараметра = "СоздаватьГруппы" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "СоздаватьГруппыСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "СоздаватьГруппыЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "СоздаватьГруппыСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "СоздаватьГруппыЯрусы";
			
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "СоздаватьГруппыПозиции";
			
		КонецЕсли;
		
	ИначеЕсли ИмяПараметра = "ГруппаДиапазонЧисел" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "ГруппаДиапазонЧиселСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "ГруппаДиапазонЧиселЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "ГруппаДиапазонЧиселСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "ГруппаДиапазонЧиселЯрусы";
			
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "ГруппаДиапазонЧиселПозиции";
			
		КонецЕсли;
		
	ИначеЕсли ИмяПараметра = "ГруппаДиапазонБукв" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "ГруппаДиапазонБуквСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "ГруппаДиапазонБуквЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "ГруппаДиапазонБуквСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "ГруппаДиапазонБуквЯрусы";
			
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "ГруппаДиапазонБуквПозиции";
			
		КонецЕсли;
		
	ИначеЕсли ИмяПараметра = "Шаблон" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "ШаблонСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "ШаблонЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "ШаблонСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "ШаблонЯрусы";
			
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "ШаблонПозиции";
			
		КонецЕсли;
		
	ИначеЕсли ИмяПараметра = "Разделитель" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "РазделительСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "РазделительЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "РазделительСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "РазделительЯрусы";
			
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "РазделительПозиции";
			
		КонецЕсли;
		
	ИначеЕсли ИмяПараметра = "ДиапазонБуквОт" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "ДиапазонБуквОтСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "ДиапазонБуквОтЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "ДиапазонБуквОтСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "ДиапазонБуквОтЯрусы";
			
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "ДиапазонБуквОтПозиции";
			
		КонецЕсли;
		
	ИначеЕсли ИмяПараметра = "ДиапазонБуквДо" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "ДиапазонБуквДоСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "ДиапазонБуквДоЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "ДиапазонБуквДоСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "ДиапазонБуквДоЯрусы";
			
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "ДиапазонБуквДоПозиции";
			
		КонецЕсли;
		
	ИначеЕсли ИмяПараметра = "КоличествоЦифр" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "КоличествоЦифрСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "КоличествоЦифрЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "КоличествоЦифрСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "КоличествоЦифрЯрусы";
			
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "КоличествоЦифрПозиции";
			
		КонецЕсли;
		
	ИначеЕсли ИмяПараметра = "Количество" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "КоличествоСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "КоличествоЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "КоличествоСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "КоличествоЯрусы";
				
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "КоличествоПозиции";
			
		КонецЕсли;
		
	ИначеЕсли ИмяПараметра = "ДиапазонЧиселОт" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "ДиапазонЧиселОтСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "ДиапазонЧиселОтЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "ДиапазонЧиселОтСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "ДиапазонЧиселОтЯрусы";
			
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "ДиапазонЧиселОтПозиции";
			
		КонецЕсли;
		
	ИначеЕсли ИмяПараметра = "ДиапазонЧиселДо" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "ДиапазонЧиселДоСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "ДиапазонЧиселДоЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "ДиапазонЧиселДоСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "ДиапазонЧиселДоЯрусы";
			
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "ДиапазонЧиселДоПозиции";
			
		КонецЕсли;
		
	ИначеЕсли ИмяПараметра = "ЛидирующиеНули" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "ЛидирующиеНулиСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "ЛидирующиеНулиЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "ЛидирующиеНулиСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "ЛидирующиеНулиЯрусы";
			
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "ЛидирующиеНулиПозиции";
			
		КонецЕсли;
		
	ИначеЕсли ИмяПараметра = "ТипНомера" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "ТипНомераСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "ТипНомераЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "ТипНомераСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "ТипНомераЯрусы";
			
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "ТипНомераПозиции";
			
		КонецЕсли;
		
	ИначеЕсли ИмяПараметра = "НаборБукв" Тогда
		
		Если ЧастьАдреса = "Секции" Тогда
			
			Возврат "НаборБуквСекции";
			
		ИначеЕсли ЧастьАдреса = "Линии" Тогда
			
			Возврат "НаборБуквЛинии";
			
		ИначеЕсли ЧастьАдреса = "Стеллажи" Тогда
			
			Возврат "НаборБуквСтеллажи";
			
		ИначеЕсли ЧастьАдреса = "Ярусы" Тогда
			
			Возврат "НаборБуквЯрусы";
			
		ИначеЕсли ЧастьАдреса = "Позиции" Тогда
			
			Возврат "НаборБуквПозиции";
			
		КонецЕсли;
		
	КонецЕсли;
	
	ТекстИсключения = СтрШаблон(НСтр("ru = 'Отсутствует реквизит для параметра ""%1"" и части адреса ""%2"".'"),
								ИмяПараметра,
								ЧастьАдреса);
	
	ВызватьИсключение ТекстИсключения;
	
КонецФункции

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

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

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

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