Обмен серий: учитывать маппинг видов номенклатуры на target (1.3.0.43).

Для ПКО серий добавлен поиск существующей серии по владельцу вида с приоритетом Номер+ГоденДо и fallback по сроку при пустом номере; исключено создание дублей при несовпадении GUID.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mihailkudravcev
2026-07-21 12:17:20 +03:00
parent a83f23d16c
commit 997b7fe110
5 changed files with 109 additions and 27 deletions
+18
View File
@@ -4,6 +4,24 @@
---
## 1.3.0.43 (2026-07-21)
### Серии номенклатуры — подбор по владельцу вида и сроку
Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`.
- Для ПКО `Справочник_СерииНоменклатуры` добавлен подбор существующей серии с учетом
владельца серий вида номенклатуры в целевой ИБ:
- `ВладелецВида + Номер + ГоденДо`,
- `ВладелецВида + Номер`,
- при пустом номере: `ВладелецВида + ГоденДо`.
- Поиск теперь опирается на маппинг видов номенклатуры на target (через
`РК_ВладелецСерийДляВидаНоменклатуры`), что снимает конфликт, когда вид в source и target различается.
- При найденной серии с другим GUID создается предупреждение и запись из пакета пропускается
(без создания дубликата).
---
## 1.3.0.42 (2026-07-15)
### Обмен — этапы графика оплаты ЗаказКлиента (Д1.2)
+1 -1
View File
@@ -52,7 +52,7 @@
| **Номенклатура** (новая) | заполнение учёта по виду номенклатуры **целевой** ИБ |
| **Виды номенклатуры** (существует) | пропуск обновления (сопоставление по GUID сохраняется) |
| **Склады** (существует) | пропуск перезаписи реквизитов |
| **Серии номенклатуры** | проверка владельца серий по настройкам вида в целевой ИБ |
| **Серии номенклатуры** | проверка владельца + подбор по `Номер/ГоденДо` в рамках владельца вида (v1.3.0.43+) |
| **Ставки НДС** | ПКПД: `НДС22`, `НДС22_122` |
Защищаемые реквизиты номенклатуры: `ВидНоменклатуры`, `ОсобенностьУчета`, `ТипНоменклатуры`, `ИспользованиеХарактеристик`, `ВладелецСерий`, `ВладелецХарактеристик`, `ГруппаФинансовогоУчета`, `СкладскаяГруппа`.
+1 -1
View File
@@ -1 +1 @@
1.3.0.42
1.3.0.43
@@ -329,6 +329,85 @@
КонецФункции
// Подбор существующей серии в целевой ИБ по владельцу вида номенклатуры.
// Приоритет:
// 1) Вид + Номер + СрокГодности (если номер и срок заполнены)
// 2) Вид + Номер (если номер заполнен)
// 3) Вид + СрокГодности (если номер пустой и срок заполнен)
//
// Параметры:
// ВладелецСерий - СправочникСсылка.ВидыНоменклатуры
// НомерСерии - Строка
// СрокГодности - Дата, Неопределено
//
// Возвращаемое значение:
// СправочникСсылка.СерииНоменклатуры, Неопределено
//
Функция РК_НайтиСериюПоВладельцуНомерСроку(ВладелецСерий, НомерСерии, СрокГодности)
Если Не ЗначениеЗаполнено(ВладелецСерий) Тогда
Возврат Неопределено;
КонецЕсли;
НомерСерии = СокрЛП(Строка(НомерСерии));
СрокЗаполнен = ЗначениеЗаполнено(СрокГодности) И СрокГодности <> '00010101';
Если Не ПустаяСтрока(НомерСерии) Тогда
Запрос = Новый Запрос;
Если СрокЗаполнен Тогда
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Серии.Ссылка КАК Ссылка
|ИЗ
| Справочник.СерииНоменклатуры КАК Серии
|ГДЕ
| Серии.ВидНоменклатуры = &Владелец
| И НЕ Серии.ПометкаУдаления
| И Серии.Номер = &Номер
| И Серии.ГоденДо = &Срок";
Запрос.УстановитьПараметр("Срок", СрокГодности);
Иначе
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Серии.Ссылка КАК Ссылка
|ИЗ
| Справочник.СерииНоменклатуры КАК Серии
|ГДЕ
| Серии.ВидНоменклатуры = &Владелец
| И НЕ Серии.ПометкаУдаления
| И Серии.Номер = &Номер";
КонецЕсли;
Запрос.УстановитьПараметр("Владелец", ВладелецСерий);
Запрос.УстановитьПараметр("Номер", НомерСерии);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
КонецЕсли;
Если СрокЗаполнен Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Серии.Ссылка КАК Ссылка
|ИЗ
| Справочник.СерииНоменклатуры КАК Серии
|ГДЕ
| Серии.ВидНоменклатуры = &Владелец
| И НЕ Серии.ПометкаУдаления
| И Серии.ГоденДо = &Срок";
Запрос.УстановитьПараметр("Владелец", ВладелецСерий);
Запрос.УстановитьПараметр("Срок", СрокГодности);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции
// &После ДобавитьПКО_Справочник_СерииНоменклатуры.
// Подключает обработчик проверки владельца серии при получении из пакета обмена.
//
@@ -377,6 +456,8 @@
КонецЕсли;
СсылкаДляЖурнала = ?(ДанныеИБ = Неопределено, ПолученныеДанные.ПолучитьСсылкуНового(), ДанныеИБ.Ссылка);
НомерСерии = СокрЛП(Строка(ПолученныеДанные.Номер));
СрокГодности = ПолученныеДанные.ГоденДо;
Если ДанныеИБ <> Неопределено Тогда
@@ -406,33 +487,16 @@
Иначе
ПолученныеДанные.ВидНоменклатуры = КорректныйВладелец;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Серии.Ссылка КАК Ссылка
|ИЗ
| Справочник.СерииНоменклатуры КАК Серии
|ГДЕ
| Серии.ВидНоменклатуры = &Владелец
| И НЕ Серии.ПометкаУдаления
| И (Серии.Наименование = &Наименование
| ИЛИ Серии.Номер = &Номер
| И &НомерЗаполнен)";
Запрос.УстановитьПараметр("Владелец", КорректныйВладелец);
Запрос.УстановитьПараметр("Наименование", ПолученныеДанные.Наименование);
Запрос.УстановитьПараметр("Номер", ПолученныеДанные.Номер);
Запрос.УстановитьПараметр("НомерЗаполнен", ЗначениеЗаполнено(ПолученныеДанные.Номер));
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий()
И Выборка.Ссылка <> СсылкаДляЖурнала Тогда
СуществующаяСерия = РК_НайтиСериюПоВладельцуНомерСроку(КорректныйВладелец, НомерСерии, СрокГодности);
Если ЗначениеЗаполнено(СуществующаяСерия)
И СуществующаяСерия <> СсылкаДляЖурнала Тогда
ТекстОшибки = СтрШаблон(
"Серия с наименованием ""%1"" уже существует у владельца %2 (%3), GUID отличается от пакета.",
ПолученныеДанные.Наименование,
"Серия уже существует у владельца %1 (%2), GUID отличается от пакета. Номер=""%3"", годен до=""%4"".",
КорректныйВладелец,
Выборка.Ссылка);
СуществующаяСерия,
НомерСерии,
?(ЗначениеЗаполнено(СрокГодности), Формат(СрокГодности, "ДФ=yyyy-MM-dd"), ""));
ЗаписатьОшибкуВЖурналРегистрации(СсылкаДляЖурнала, ТекстОшибки, КомпонентыОбмена,
НСтр("ru = 'создать серию номенклатуры'"), УровеньЖурналаРегистрации.Предупреждение);
ПолученныеДанные = Неопределено;
+1 -1
View File
@@ -62,7 +62,7 @@
<xr:Item xsi:type="xr:MDObjectRef">Role.РК_ОсновнаяРоль</xr:Item>
</DefaultRoles>
<Vendor/>
<Version>1.3.0.42</Version>
<Version>1.3.0.43</Version>
<DefaultStyle/>
<DefaultLanguage>Language.Русский</DefaultLanguage>
<BriefInformation/>