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 @@
+
+
+
+ ru
+ Группы номенклатуры
+
+
+
+ v8:ValueTree
+
+
+
+
+
+ ru
+ Отметка
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Наименование
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Рекурсивно
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Идентификатор
+
+
+
+ v8:UUID
+
+
+
+
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", ГруппыРекурсивно);
+ КонецЕсли;
+
+КонецПроцедуры
+
+&НаСервере
+Процедура СобратьОтмеченныеГруппыИзДерева(КоллекцияСтрок, ГруппыПрямые, ГруппыРекурсивно)
+
+ Для Каждого СтрокаДерева Из КоллекцияСтрок Цикл
+ Если СтрокаДерева.Отметка Тогда
+ ГуидТекст = Строка(СтрокаДерева.Идентификатор);
+ Если СтрокаДерева.Рекурсивно Тогда
+ ГруппыРекурсивно.Добавить(ГуидТекст);
+ Иначе
+ ГруппыПрямые.Добавить(ГуидТекст);
+ КонецЕсли;
+ КонецЕсли;
+ СобратьОтмеченныеГруппыИзДерева(СтрокаДерева.ПолучитьЭлементы(),
+ ГруппыПрямые, ГруппыРекурсивно);
КонецЦикла;
КонецПроцедуры