diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f1af31..7c84714 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ --- +## 1.3.1.66 (2026-08-14) + +### РК_ЗагрузкаОстатков — дерево групп и отбор (#7) + +- Таблица групп номенклатуры — `Representation=Tree` с вложенностью из `parent_guid`. +- Колонки **Отметка** и **Рекурсивно** (булево, по умолчанию Ложь). +- При загрузке остатков отмеченные группы уходят в `nomenclature_groups` / + `nomenclature_groups_recursive` (нужен **ws-rhana ≥ 0.0.0.42**). + ## 1.3.1.65 (2026-08-14) ### РК_ЗагрузкаОстатков — исправление XML формы diff --git a/VERSION b/VERSION index c041031..8c07a96 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.1.65 +1.3.1.66 diff --git a/src/ConfigDumpInfo.xml b/src/ConfigDumpInfo.xml index 24d0c0e..98ff7a9 100644 --- a/src/ConfigDumpInfo.xml +++ b/src/ConfigDumpInfo.xml @@ -88,6 +88,7 @@ + diff --git a/src/Configuration.xml b/src/Configuration.xml index 4eec460..bba42c5 100644 --- a/src/Configuration.xml +++ b/src/Configuration.xml @@ -62,7 +62,7 @@ Role.РК_ОсновнаяРоль - 1.3.1.65 + 1.3.1.66 Language.Русский diff --git a/src/DataProcessors/РК_ЗагрузкаОстатков.xml b/src/DataProcessors/РК_ЗагрузкаОстатков.xml index f57088f..a01318a 100644 --- a/src/DataProcessors/РК_ЗагрузкаОстатков.xml +++ b/src/DataProcessors/РК_ЗагрузкаОстатков.xml @@ -4885,7 +4885,7 @@ xs:string - 10 + 0 Variable @@ -4936,7 +4936,7 @@ false - + false DontCheck Items @@ -4957,13 +4957,9 @@ Рекурсивно - + Включать вложенные группы исходной базы при отборе остатков - xs:string - - 10 - Variable - + xs:boolean false @@ -4976,7 +4972,43 @@ false - + false + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + РодительИдентификатор + + + ru + Родитель + + + GUID родительской группы в исходной ИБ + + v8:UUID + + false + + + + false + + false + false + + + false + DontCheck Items diff --git a/src/DataProcessors/РК_ЗагрузкаОстатков/Forms/Форма/Ext/Form.xml b/src/DataProcessors/РК_ЗагрузкаОстатков/Forms/Форма/Ext/Form.xml index 79ed647..ff0254e 100644 --- a/src/DataProcessors/РК_ЗагрузкаОстатков/Forms/Форма/Ext/Form.xml +++ b/src/DataProcessors/РК_ЗагрузкаОстатков/Forms/Форма/Ext/Form.xml @@ -159,10 +159,14 @@ - true - true - true - Объект.ОтборГруппНоменклатур + Tree + false + false + false + ExpandAllLevels + false + false + ОтборГруппНоменклатурДерево @@ -200,33 +204,27 @@ - - Объект.ОтборГруппНоменклатур.LineNumber - EnterOnInput - - - - - Объект.ОтборГруппНоменклатур.Наименование - EnterOnInput - true - - - - Объект.ОтборГруппНоменклатур.Отметка + ОтборГруппНоменклатурДерево.Отметка EnterOnInput Auto - - Объект.ОтборГруппНоменклатур.Рекурсивно + + ОтборГруппНоменклатурДерево.Наименование + true EnterOnInput - true + + + + + ОтборГруппНоменклатурДерево.Рекурсивно + EnterOnInput + Auto - +
@@ -1258,6 +1256,67 @@ + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группы номенклатуры</v8:content> + </v8:item> + + + v8:ValueTree + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Отметка</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Наименование</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Рекурсивно</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор</v8:content> + </v8:item> + + + v8:UUID + + + + <v8:item> diff --git a/src/DataProcessors/РК_ЗагрузкаОстатков/Forms/Форма/Ext/Form/Module.bsl b/src/DataProcessors/РК_ЗагрузкаОстатков/Forms/Форма/Ext/Form/Module.bsl index 77d4ebc..e5c31bf 100644 --- a/src/DataProcessors/РК_ЗагрузкаОстатков/Forms/Форма/Ext/Form/Module.bsl +++ b/src/DataProcessors/РК_ЗагрузкаОстатков/Forms/Форма/Ext/Form/Module.bsl @@ -21,6 +21,8 @@ Объект.ДатаДокументовВвода = Объект.ДатаОстатков; КонецЕсли; + ПостроитьДеревоГруппИзТабличнойЧасти(); + КонецПроцедуры #КонецОбласти @@ -251,6 +253,8 @@ Объект.ОтборСкладовВнешнейБазы.Очистить(); Объект.ОтборОрганизацийВнешнейБазы.Очистить(); + Объект.ОтборГруппНоменклатур.Очистить(); + ОтборГруппНоменклатурДерево.ПолучитьЭлементы().Очистить(); Объект.ВходящиеСобственныеТовары.Очистить(); Объект.ВходящиеКомиссионныеТовары.Очистить(); Объект.СозданныеДокументы.Очистить(); @@ -311,6 +315,8 @@ &НаСервере Функция ЗагрузитьОстаткиНаСервере() + СинхронизироватьТабличнуюЧастьГруппИзДерева(); + СкладыGUID = Новый Массив; Для Каждого Стр Из Объект.ОтборСкладовВнешнейБазы Цикл Если Стр.Отметка Тогда @@ -337,12 +343,14 @@ ФильтрыСобственные.Вставить("organizations", ОрганизацииGUID); КонецЕсли; ФильтрыСобственные.Вставить("only_nonzero", Истина); + ДобавитьФильтрГруппНоменклатуры(ФильтрыСобственные); ФильтрыКомиссия = Новый Структура; Если ОрганизацииGUID.Количество() > 0 Тогда ФильтрыКомиссия.Вставить("organizations", ОрганизацииGUID); КонецЕсли; ФильтрыКомиссия.Вставить("only_nonzero", Истина); + ДобавитьФильтрГруппНоменклатуры(ФильтрыКомиссия); ПолныйОбходКомиссии = (ОрганизацииGUID.Количество() = 0); СтрокиСобственные = ЗагрузитьСтраницыОстатков("combined", ФильтрыСобственные, Ложь); @@ -518,6 +526,7 @@ Ответ = РК_ОбменСВнешнейБазой.СписокГруппНоменклатурыВнешнейБазы(Объект.ПодключениеКСтороннейБазе); ЗаполнитьТаблицуГруппНоменклатурИзОтветаAPI(Объект.ОтборГруппНоменклатур, Ответ); + ПостроитьДеревоГруппИзТабличнойЧасти(); КонецПроцедуры @@ -546,20 +555,134 @@ Продолжить; КонецЕсли; НовСтр = ТаблицаОтбора.Добавить(); - ИмяОтображение = СокрЛП(Строка(ЗначениеСвойстваОтвета(СтрокаAPI, "name_display"))); - Если ПустаяСтрока(ИмяОтображение) Тогда - ИмяОтображение = СокрЛП(Строка(ЗначениеСвойстваОтвета(СтрокаAPI, "name"))); - КонецЕсли; - НовСтр.Наименование = ИмяОтображение; + НовСтр.Наименование = СокрЛП(Строка(ЗначениеСвойстваОтвета(СтрокаAPI, "name"))); Попытка НовСтр.Идентификатор = Новый УникальныйИдентификатор(ГуидТекст); Исключение Продолжить; КонецПопытки; + РодительТекст = СокрЛП(Строка(ЗначениеСвойстваОтвета(СтрокаAPI, "parent_guid"))); + Если Не ПустаяСтрока(РодительТекст) Тогда + Попытка + НовСтр.РодительИдентификатор = Новый УникальныйИдентификатор(РодительТекст); + Исключение + КонецПопытки; + КонецЕсли; СтараяОтметка = БылиОтметки.Получить(Строка(НовСтр.Идентификатор)); НовСтр.Отметка = ?(СтараяОтметка = Неопределено, Ложь, СтараяОтметка = Истина); СтароеРекурсивно = БылоРекурсивно.Получить(Строка(НовСтр.Идентификатор)); - НовСтр.Рекурсивно = ?(СтароеРекурсивно = Неопределено, Истина, СтароеРекурсивно = Истина); + НовСтр.Рекурсивно = ?(СтароеРекурсивно = Неопределено, Ложь, СтароеРекурсивно = Истина); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ПостроитьДеревоГруппИзТабличнойЧасти() + + ОтборГруппНоменклатурДерево.ПолучитьЭлементы().Очистить(); + Если Объект.ОтборГруппНоменклатур.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + УзлыПоGUID = Новый Соответствие; + Корни = Новый Массив; + + Для Каждого СтрТЧ Из Объект.ОтборГруппНоменклатур Цикл + ДанныеУзла = Новый Структура; + ДанныеУзла.Вставить("СтрокаТЧ", СтрТЧ); + ДанныеУзла.Вставить("Дети", Новый Массив); + УзлыПоGUID.Вставить(Строка(СтрТЧ.Идентификатор), ДанныеУзла); + КонецЦикла; + + Для Каждого СтрТЧ Из Объект.ОтборГруппНоменклатур Цикл + ДанныеУзла = УзлыПоGUID.Получить(Строка(СтрТЧ.Идентификатор)); + КлючРодителя = Строка(СтрТЧ.РодительИдентификатор); + РодительУзел = Неопределено; + Если Не ПустаяСтрока(КлючРодителя) И КлючРодителя <> "00000000-0000-0000-0000-000000000000" Тогда + РодительУзел = УзлыПоGUID.Получить(КлючРодителя); + КонецЕсли; + Если РодительУзел = Неопределено Тогда + Корни.Добавить(ДанныеУзла); + Иначе + РодительУзел.Дети.Добавить(ДанныеУзла); + КонецЕсли; + КонецЦикла; + + ДобавитьУзлыДереваГрупп(ОтборГруппНоменклатурДерево.ПолучитьЭлементы(), Корни); + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьУзлыДереваГрупп(КоллекцияСтрок, Узлы) + + Для Каждого ДанныеУзла Из Узлы Цикл + СтрТЧ = ДанныеУзла.СтрокаТЧ; + СтрокаДерева = КоллекцияСтрок.Добавить(); + СтрокаДерева.Отметка = СтрТЧ.Отметка; + СтрокаДерева.Наименование = СтрТЧ.Наименование; + СтрокаДерева.Рекурсивно = СтрТЧ.Рекурсивно; + СтрокаДерева.Идентификатор = СтрТЧ.Идентификатор; + Если ДанныеУзла.Дети.Количество() > 0 Тогда + ДобавитьУзлыДереваГрупп(СтрокаДерева.ПолучитьЭлементы(), ДанныеУзла.Дети); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура СинхронизироватьТабличнуюЧастьГруппИзДерева() + + Объект.ОтборГруппНоменклатур.Очистить(); + ЗаписатьСтрокиДереваГруппВТЧ(ОтборГруппНоменклатурДерево.ПолучитьЭлементы(), + Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); + +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьСтрокиДереваГруппВТЧ(КоллекцияСтрок, РодительИдентификатор) + + Для Каждого СтрокаДерева Из КоллекцияСтрок Цикл + НовСтр = Объект.ОтборГруппНоменклатур.Добавить(); + НовСтр.Отметка = СтрокаДерева.Отметка; + НовСтр.Наименование = СтрокаДерева.Наименование; + НовСтр.Рекурсивно = СтрокаДерева.Рекурсивно; + НовСтр.Идентификатор = СтрокаДерева.Идентификатор; + НовСтр.РодительИдентификатор = РодительИдентификатор; + ЗаписатьСтрокиДереваГруппВТЧ(СтрокаДерева.ПолучитьЭлементы(), СтрокаДерева.Идентификатор); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьФильтрГруппНоменклатуры(Фильтры) + + ГруппыПрямые = Новый Массив; + ГруппыРекурсивно = Новый Массив; + СобратьОтмеченныеГруппыИзДерева(ОтборГруппНоменклатурДерево.ПолучитьЭлементы(), + ГруппыПрямые, ГруппыРекурсивно); + Если ГруппыПрямые.Количество() > 0 Тогда + Фильтры.Вставить("nomenclature_groups", ГруппыПрямые); + КонецЕсли; + Если ГруппыРекурсивно.Количество() > 0 Тогда + Фильтры.Вставить("nomenclature_groups_recursive", ГруппыРекурсивно); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура СобратьОтмеченныеГруппыИзДерева(КоллекцияСтрок, ГруппыПрямые, ГруппыРекурсивно) + + Для Каждого СтрокаДерева Из КоллекцияСтрок Цикл + Если СтрокаДерева.Отметка Тогда + ГуидТекст = Строка(СтрокаДерева.Идентификатор); + Если СтрокаДерева.Рекурсивно Тогда + ГруппыРекурсивно.Добавить(ГуидТекст); + Иначе + ГруппыПрямые.Добавить(ГуидТекст); + КонецЕсли; + КонецЕсли; + СобратьОтмеченныеГруппыИзДерева(СтрокаДерева.ПолучитьЭлементы(), + ГруппыПрямые, ГруппыРекурсивно); КонецЦикла; КонецПроцедуры