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