1.3.1.136: ввод остатков делится по родителю номенклатуры.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mihailkudravcev
2026-10-14 15:48:03 +03:00
parent c30dac7f2a
commit bce27b0499
4 changed files with 79 additions and 31 deletions
+8
View File
@@ -4,6 +4,14 @@
--- ---
## 1.3.1.136 (2026-10-14)
### Ввод остатков: документ на группу-родителя номенклатуры
- Собственные товары: отдельный документ на склад и родителя номенклатуры.
- Комиссия 2.5: отдельный документ на партнёра, соглашение, договор и родителя номенклатуры.
- В комментарии документа есть имя этой группы. Номенклатура без родителя собирается в группу «без группы».
## 1.3.1.135 (2026-10-14) ## 1.3.1.135 (2026-10-14)
### Ввод остатков: серия по UUID со сроком 01.01.2001 ### Ввод остатков: серия по UUID со сроком 01.01.2001
+1 -1
View File
@@ -1 +1 @@
1.3.1.135 1.3.1.136
+1 -1
View File
@@ -62,7 +62,7 @@
<xr:Item xsi:type="xr:MDObjectRef">Role.РК_ОсновнаяРоль</xr:Item> <xr:Item xsi:type="xr:MDObjectRef">Role.РК_ОсновнаяРоль</xr:Item>
</DefaultRoles> </DefaultRoles>
<Vendor/> <Vendor/>
<Version>1.3.1.135</Version> <Version>1.3.1.136</Version>
<DefaultStyle/> <DefaultStyle/>
<DefaultLanguage>Language.Русский</DefaultLanguage> <DefaultLanguage>Language.Русский</DefaultLanguage>
<BriefInformation/> <BriefInformation/>
@@ -471,8 +471,9 @@
СтрокиПоСкладу = СгруппироватьСопоставленныеСтрокиПоСкладу(); СтрокиПоСкладу = СгруппироватьСопоставленныеСтрокиПоСкладу();
СтрокиКомиссии = СгруппироватьСопоставленныеСтрокиКомиссии(); СтрокиКомиссии = СгруппироватьСопоставленныеСтрокиКомиссии();
ДобавитьСтрокуПротокола(Результат, "Групп own (складов): " + Формат(СтрокиПоСкладу.Количество(), "ЧН=0; ЧГ=0") ДобавитьСтрокуПротокола(Результат, "Групп own (склад и родитель номенклатуры): "
+ "; групп comm: " + Формат(СтрокиКомиссии.Количество(), "ЧН=0; ЧГ=0")); + Формат(СтрокиПоСкладу.Количество(), "ЧН=0; ЧГ=0")
+ "; групп comm (партнёр и родитель): " + Формат(СтрокиКомиссии.Количество(), "ЧН=0; ЧГ=0"));
Если СтрокиПоСкладу.Количество() = 0 И СтрокиКомиссии.Количество() = 0 Тогда Если СтрокиПоСкладу.Количество() = 0 И СтрокиКомиссии.Количество() = 0 Тогда
ДобавитьСтрокуПротокола(Результат, ДобавитьСтрокуПротокола(Результат,
"[WARN] Нет сопоставленных строк с количеством > 0 — документы не создаются. Сначала «Сопоставить»."); "[WARN] Нет сопоставленных строк с количеством > 0 — документы не создаются. Сначала «Сопоставить».");
@@ -501,20 +502,22 @@
Для Каждого ЭлементСклада Из СтрокиПоСкладу Цикл Для Каждого ЭлементСклада Из СтрокиПоСкладу Цикл
СкладДок = ЭлементСклада.Ключ;
СтрокиСклада = ЭлементСклада.Значение; СтрокиСклада = ЭлементСклада.Значение;
Если СтрокиСклада.Количество() = 0 Тогда Если СтрокиСклада.Количество() = 0 Тогда
Продолжить; Продолжить;
КонецЕсли; КонецЕсли;
СкладДок = СтрокиСклада[0].Склад;
КомментарийГруппы = КомментарийДокументаСобственных(ТекстТега, СкладДок, СтрокиСклада);
Контекст = "own / склад " + СокрЛП(Строка(СкладДок)) Контекст = "own / склад " + СокрЛП(Строка(СкладДок))
+ " / группа " + ИмяГруппыРодителя(СтрокиСклада[0].Номенклатура)
+ " / строк " + Формат(СтрокиСклада.Количество(), "ЧН=0; ЧГ=0"); + " / строк " + Формат(СтрокиСклада.Количество(), "ЧН=0; ЧГ=0");
Попытка Попытка
Если РежимТест Тогда Если РежимТест Тогда
Результат.СозданоДокументов = Результат.СозданоДокументов + 1; Результат.СозданоДокументов = Результат.СозданоДокументов + 1;
Результат.СтрокВДокументах = Результат.СтрокВДокументах + СтрокиСклада.Количество(); Результат.СтрокВДокументах = Результат.СтрокВДокументах + СтрокиСклада.Количество();
ДобавитьВСозданныеДокументы(Неопределено, "Собственные", СкладДок, ДобавитьВСозданныеДокументы(Неопределено, "Собственные", СкладДок,
Неопределено, Неопределено, СтрокиСклада, ТекстТега + ", склад " + СокрЛП(Строка(СкладДок)), Истина, Результат); Неопределено, Неопределено, СтрокиСклада, КомментарийГруппы, Истина, Результат);
ДобавитьСтрокуПротокола(Результат, "[TEST] " + Контекст); ДобавитьСтрокуПротокола(Результат, "[TEST] " + Контекст);
ДобавитьСтрокиCSVДокументаИзВходящих(СтрокиCSVДокументов, "own", Неопределено, СкладДок, ДобавитьСтрокиCSVДокументаИзВходящих(СтрокиCSVДокументов, "own", Неопределено, СкладДок,
Неопределено, Неопределено, Неопределено, СтрокиСклада, Истина); Неопределено, Неопределено, Неопределено, СтрокиСклада, Истина);
@@ -527,7 +530,7 @@
КонецЕсли; КонецЕсли;
ДобавитьСтрокуПротокола(Результат, "[FILL] " + Контекст); ДобавитьСтрокуПротокола(Результат, "[FILL] " + Контекст);
Док = СоздатьДокументПоСкладу(СкладДок, СтрокиСклада, ТекстТега, ПартияВвода); Док = СоздатьДокументПоСкладу(СкладДок, СтрокиСклада, КомментарийГруппы, ПартияВвода);
Если ДокументВводаСозданУспешно(Док) Тогда Если ДокументВводаСозданУспешно(Док) Тогда
Результат.СозданоДокументов = Результат.СозданоДокументов + 1; Результат.СозданоДокументов = Результат.СозданоДокументов + 1;
Результат.СтрокВДокументах = Результат.СтрокВДокументах + Док.Товары.Количество(); Результат.СтрокВДокументах = Результат.СтрокВДокументах + Док.Товары.Количество();
@@ -560,9 +563,11 @@
КонецЕсли; КонецЕсли;
Первая = СтрокиГруппы[0]; Первая = СтрокиГруппы[0];
КомментарийГруппы = КомментарийДокументаКомиссии(ТекстТега, СтрокиГруппы);
Контекст = "comm / партнёр " + СокрЛП(Строка(Первая.Партнер)) Контекст = "comm / партнёр " + СокрЛП(Строка(Первая.Партнер))
+ " / соглашение " + СокрЛП(Строка(Первая.Соглашение)) + " / соглашение " + СокрЛП(Строка(Первая.Соглашение))
+ " / договор " + СокрЛП(Строка(Первая.Договор)) + " / договор " + СокрЛП(Строка(Первая.Договор))
+ " / группа " + ИмяГруппыРодителя(Первая.Номенклатура)
+ " / строк " + Формат(СтрокиГруппы.Количество(), "ЧН=0; ЧГ=0"); + " / строк " + Формат(СтрокиГруппы.Количество(), "ЧН=0; ЧГ=0");
Попытка Попытка
Если РежимТест Тогда Если РежимТест Тогда
@@ -570,7 +575,7 @@
Результат.СтрокКомиссии = Результат.СтрокКомиссии + СтрокиГруппы.Количество(); Результат.СтрокКомиссии = Результат.СтрокКомиссии + СтрокиГруппы.Количество();
ДобавитьВСозданныеДокументы(Неопределено, "Комиссия 2.5", Неопределено, ДобавитьВСозданныеДокументы(Неопределено, "Комиссия 2.5", Неопределено,
Первая.Соглашение, Первая.Партнер, СтрокиГруппы, Первая.Соглашение, Первая.Партнер, СтрокиГруппы,
ТекстТега + ", комиссия 2.5, " + СокрЛП(Строка(Первая.Партнер)), Истина, Результат); КомментарийГруппы, Истина, Результат);
ДобавитьСтрокуПротокола(Результат, "[TEST] " + Контекст); ДобавитьСтрокуПротокола(Результат, "[TEST] " + Контекст);
ДобавитьСтрокиCSVДокументаИзВходящих(СтрокиCSVДокументов, "comm", Неопределено, Неопределено, ДобавитьСтрокиCSVДокументаИзВходящих(СтрокиCSVДокументов, "comm", Неопределено, Неопределено,
Первая.Партнер, Первая.Соглашение, Первая.Договор, СтрокиГруппы, Истина); Первая.Партнер, Первая.Соглашение, Первая.Договор, СтрокиГруппы, Истина);
@@ -583,7 +588,7 @@
КонецЕсли; КонецЕсли;
ДобавитьСтрокуПротокола(Результат, "[FILL] " + Контекст); ДобавитьСтрокуПротокола(Результат, "[FILL] " + Контекст);
Док = СоздатьДокументКомиссии(СтрокиГруппы, ТекстТега, ПартияВвода); Док = СоздатьДокументКомиссии(СтрокиГруппы, КомментарийГруппы, ПартияВвода);
Если ДокументВводаСозданУспешно(Док) Тогда Если ДокументВводаСозданУспешно(Док) Тогда
Результат.СозданоДокументовКомиссии = Результат.СозданоДокументовКомиссии + 1; Результат.СозданоДокументовКомиссии = Результат.СозданоДокументовКомиссии + 1;
Результат.СтрокКомиссии = Результат.СтрокКомиссии + Док.Товары.Количество(); Результат.СтрокКомиссии = Результат.СтрокКомиссии + Док.Товары.Количество();
@@ -1029,6 +1034,53 @@
КонецФункции КонецФункции
Функция ГруппаРодительНоменклатуры(Номенклатура)
Если Не ЗначениеЗаполнено(Номенклатура) Тогда
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура, "Родитель");
КонецФункции
Функция КлючГруппыРодителя(Номенклатура)
Группа = ГруппаРодительНоменклатуры(Номенклатура);
Если Не ЗначениеЗаполнено(Группа) Тогда
Возврат "без группы";
КонецЕсли;
Возврат Строка(Группа.УникальныйИдентификатор());
КонецФункции
Функция ИмяГруппыРодителя(Номенклатура)
Группа = ГруппаРодительНоменклатуры(Номенклатура);
Если Не ЗначениеЗаполнено(Группа) Тогда
Возврат "без группы";
КонецЕсли;
Возврат СокрЛП(Строка(Группа));
КонецФункции
Функция КомментарийДокументаСобственных(ТекстТега, СкладДок, СтрокиСклада)
ИмяГруппы = "без группы";
Если СтрокиСклада.Количество() > 0 Тогда
ИмяГруппы = ИмяГруппыРодителя(СтрокиСклада[0].Номенклатура);
КонецЕсли;
Возврат ТекстТега + ", склад " + СокрЛП(Строка(СкладДок)) + ", группа " + ИмяГруппы;
КонецФункции
Функция КомментарийДокументаКомиссии(ТекстТега, СтрокиГруппы)
Первая = СтрокиГруппы[0];
Возврат ТекстТега + ", комиссия 2.5, " + СокрЛП(Строка(Первая.Партнер))
+ ", группа " + ИмяГруппыРодителя(Первая.Номенклатура);
КонецФункции
Функция СгруппироватьСопоставленныеСтрокиПоСкладу() Функция СгруппироватьСопоставленныеСтрокиПоСкладу()
Группы = Новый Соответствие; Группы = Новый Соответствие;
@@ -1042,28 +1094,15 @@
Если СтрТ.Количество <= 0 Тогда Если СтрТ.Количество <= 0 Тогда
Продолжить; Продолжить;
КонецЕсли; КонецЕсли;
КлючСклада = Строка(СтрТ.Склад.УникальныйИдентификатор()); Ключ = Строка(СтрТ.Склад.УникальныйИдентификатор()) + "|" + КлючГруппыРодителя(СтрТ.Номенклатура);
СтрокиСклада = Группы.Получить(КлючСклада); СтрокиСклада = Группы.Получить(Ключ);
Если СтрокиСклада = Неопределено Тогда Если СтрокиСклада = Неопределено Тогда
СтрокиСклада = Новый Массив; СтрокиСклада = Новый Массив;
Группы.Вставить(КлючСклада, СтрокиСклада); Группы.Вставить(Ключ, СтрокиСклада);
КонецЕсли; КонецЕсли;
СтрокиСклада.Добавить(СтрТ); СтрокиСклада.Добавить(СтрТ);
КонецЦикла; КонецЦикла;
Возврат Группы;
// Переключить ключи на ссылки складов для удобства обхода.
Результат = Новый Соответствие;
Для Каждого СтрТ Из ВходящиеСобственныеТовары Цикл
Если Не СтрТ.Сопоставлено Или Не ЗначениеЗаполнено(СтрТ.Склад) Тогда
Продолжить;
КонецЕсли;
КлючСклада = Строка(СтрТ.Склад.УникальныйИдентификатор());
СтрокиСклада = Группы.Получить(КлючСклада);
Если СтрокиСклада <> Неопределено И Результат.Получить(СтрТ.Склад) = Неопределено Тогда
Результат.Вставить(СтрТ.Склад, СтрокиСклада);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции КонецФункции
@@ -1082,7 +1121,8 @@
КонецЕсли; КонецЕсли;
КлючГруппы = Строка(СтрТ.Соглашение.УникальныйИдентификатор()) КлючГруппы = Строка(СтрТ.Соглашение.УникальныйИдентификатор())
+ "|" + Строка(СтрТ.Партнер.УникальныйИдентификатор()) + "|" + Строка(СтрТ.Партнер.УникальныйИдентификатор())
+ "|" + Строка(СтрТ.Договор.УникальныйИдентификатор()); + "|" + Строка(СтрТ.Договор.УникальныйИдентификатор())
+ "|" + КлючГруппыРодителя(СтрТ.Номенклатура);
СтрокиГруппы = Группы.Получить(КлючГруппы); СтрокиГруппы = Группы.Получить(КлючГруппы);
Если СтрокиГруппы = Неопределено Тогда Если СтрокиГруппы = Неопределено Тогда
СтрокиГруппы = Новый Массив; СтрокиГруппы = Новый Массив;
@@ -1127,14 +1167,14 @@
КонецФункции КонецФункции
Функция СоздатьДокументПоСкладу(СкладДок, СтрокиСклада, ТекстТега, ПартияВвода) Функция СоздатьДокументПоСкладу(СкладДок, СтрокиСклада, Комментарий, ПартияВвода)
Док = Документы.ВводОстатковТоваров.СоздатьДокумент(); Док = Документы.ВводОстатковТоваров.СоздатьДокумент();
Док.Дата = ДатаДокументовВвода; Док.Дата = ДатаДокументовВвода;
Док.Организация = Организация; Док.Организация = Организация;
Док.Склад = СкладДок; Док.Склад = СкладДок;
Док.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВводОстатковСобственныхТоваров; Док.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВводОстатковСобственныхТоваров;
Док.Комментарий = ТекстТега + ", склад " + СокрЛП(Строка(СкладДок)); Док.Комментарий = Комментарий;
Док.Партия = ПартияВвода; Док.Партия = ПартияВвода;
Док.РК_НеПересчитыватьСуммуРеглПоКурсу = Истина; Док.РК_НеПересчитыватьСуммуРеглПоКурсу = Истина;
Док.ОтражатьВОперативномУчете = Истина; Док.ОтражатьВОперативномУчете = Истина;
@@ -1195,7 +1235,7 @@
КонецФункции КонецФункции
Функция СоздатьДокументКомиссии(СтрокиГруппы, ТекстТега, ПартияВвода) Функция СоздатьДокументКомиссии(СтрокиГруппы, Комментарий, ПартияВвода)
Первая = СтрокиГруппы[0]; Первая = СтрокиГруппы[0];
ДоговорШапки = Первая.Договор; ДоговорШапки = Первая.Договор;
@@ -1215,7 +1255,7 @@
Док.Партнер = Первая.Партнер; Док.Партнер = Первая.Партнер;
Док.Контрагент = Первая.Контрагент; Док.Контрагент = Первая.Контрагент;
Док.Договор = ДоговорШапки; Док.Договор = ДоговорШапки;
Док.Комментарий = ТекстТега + ", комиссия 2.5, " + СокрЛП(Строка(Первая.Партнер)); Док.Комментарий = Комментарий;
Док.Партия = ПартияВвода; Док.Партия = ПартияВвода;
Док.РК_НеПересчитыватьСуммуРеглПоКурсу = Истина; Док.РК_НеПересчитыватьСуммуРеглПоКурсу = Истина;
Док.ОтражатьВОперативномУчете = Истина; Док.ОтражатьВОперативномУчете = Истина;