From 997b7fe110456e3e7320a369581228fdcb904e23 Mon Sep 17 00:00:00 2001 From: mihailkudravcev Date: Tue, 21 Jul 2026 12:17:20 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BC=D0=B5=D0=BD=20=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B8=D0=B9:=20=D1=83=D1=87=D0=B8=D1=82=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BC=D0=B0=D0=BF=D0=BF=D0=B8=D0=BD=D0=B3?= =?UTF-8?q?=20=D0=B2=D0=B8=D0=B4=D0=BE=D0=B2=20=D0=BD=D0=BE=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BA=D0=BB=D0=B0=D1=82=D1=83=D1=80=D1=8B=20=D0=BD=D0=B0?= =?UTF-8?q?=20target=20(1.3.0.43).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Для ПКО серий добавлен поиск существующей серии по владельцу вида с приоритетом Номер+ГоденДо и fallback по сроку при пустом номере; исключено создание дублей при несовпадении GUID. Co-authored-by: Cursor --- CHANGELOG.md | 18 +++ README.md | 2 +- VERSION | 2 +- .../Ext/Module.bsl | 112 ++++++++++++++---- src/Configuration.xml | 2 +- 5 files changed, 109 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d118f2a..7606341 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,24 @@ --- +## 1.3.0.43 (2026-07-21) + +### Серии номенклатуры — подбор по владельцу вида и сроку + +Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`. + +- Для ПКО `Справочник_СерииНоменклатуры` добавлен подбор существующей серии с учетом + владельца серий вида номенклатуры в целевой ИБ: + - `ВладелецВида + Номер + ГоденДо`, + - `ВладелецВида + Номер`, + - при пустом номере: `ВладелецВида + ГоденДо`. +- Поиск теперь опирается на маппинг видов номенклатуры на target (через + `РК_ВладелецСерийДляВидаНоменклатуры`), что снимает конфликт, когда вид в source и target различается. +- При найденной серии с другим GUID создается предупреждение и запись из пакета пропускается + (без создания дубликата). + +--- + ## 1.3.0.42 (2026-07-15) ### Обмен — этапы графика оплаты ЗаказКлиента (Д1.2) diff --git a/README.md b/README.md index a782d5a..6c4512a 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ | **Номенклатура** (новая) | заполнение учёта по виду номенклатуры **целевой** ИБ | | **Виды номенклатуры** (существует) | пропуск обновления (сопоставление по GUID сохраняется) | | **Склады** (существует) | пропуск перезаписи реквизитов | -| **Серии номенклатуры** | проверка владельца серий по настройкам вида в целевой ИБ | +| **Серии номенклатуры** | проверка владельца + подбор по `Номер/ГоденДо` в рамках владельца вида (v1.3.0.43+) | | **Ставки НДС** | ПКПД: `НДС22`, `НДС22_122` | Защищаемые реквизиты номенклатуры: `ВидНоменклатуры`, `ОсобенностьУчета`, `ТипНоменклатуры`, `ИспользованиеХарактеристик`, `ВладелецСерий`, `ВладелецХарактеристик`, `ГруппаФинансовогоУчета`, `СкладскаяГруппа`. diff --git a/VERSION b/VERSION index 6a61bcd..fdf3631 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.0.42 +1.3.0.43 diff --git a/src/CommonModules/МенеджерОбменаЧерезУниверсальныйФормат/Ext/Module.bsl b/src/CommonModules/МенеджерОбменаЧерезУниверсальныйФормат/Ext/Module.bsl index 810c704..96fb7aa 100644 --- a/src/CommonModules/МенеджерОбменаЧерезУниверсальныйФормат/Ext/Module.bsl +++ b/src/CommonModules/МенеджерОбменаЧерезУниверсальныйФормат/Ext/Module.bsl @@ -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 = 'создать серию номенклатуры'"), УровеньЖурналаРегистрации.Предупреждение); ПолученныеДанные = Неопределено; diff --git a/src/Configuration.xml b/src/Configuration.xml index b284caf..2b34eed 100644 --- a/src/Configuration.xml +++ b/src/Configuration.xml @@ -62,7 +62,7 @@ Role.РК_ОсновнаяРоль - 1.3.0.42 + 1.3.0.43 Language.Русский