diff --git a/CHANGELOG.md b/CHANGELOG.md index 33ff822..826d76e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,29 @@ --- +## 1.3.0.39 (2026-07-06) + +### Контрагенты — уникальность ИНН/КПП + +Модуль: `ПартнерыИКонтрагентыЛокализация` (заимствован). + +В целевой конфигурации (crm3-26) проверка уникальности ИНН/КПП реализована в модуле локализации, а не в `ПартнерыИКонтрагенты` (как в crm3-dev). Функция возвращает структуру `НайденныеСовпадения` / `ДоступноСоздание` и учитывает `ЮрФизЛицо` (различение ИП и физлица). + +| Процедура/функция | Изменение | +|-------------------|-----------| +| `ИННКППУжеИспользуетсяВИнформационнойБазе` | при поиске дублей исключаются контрагенты с `ПометкаУдаления = Истина` | +| `ПроверитьКорректностьЗаполненияКонтрагента` | для записываемого контрагента с `ПометкаУдаления` проверка уникальности ИНН/КПП **не выполняется** | + +**Поведение** — аналогично `crm3-dev.rhana` v1.0.1.333: + +- обычная запись — уникальность среди непомеченных на удаление; +- запись с пометкой удаления — проверка уникальности ИНН/КПП пропускается; +- дубль только у помеченного контрагента не блокирует активную карточку. + +**Примечание:** отдельная CRM-функция `CRM_КлиентыСервер.ИННКППУжеИспользуетсяВИнформационнойБазе` (поиск по `Партнеры.CRM_ИНН`) не затронута — она относится к сценариям CRM, не к типовой записи справочника `Контрагенты`. + +--- + ## 1.3.0.38 (2026-07-06) ### Обмен — фильтр узла «Рабочая CRM3» diff --git a/VERSION b/VERSION index 913e646..122b2b5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.0.38 +1.3.0.39 diff --git a/src/CommonModules/ПартнерыИКонтрагентыЛокализация.xml b/src/CommonModules/ПартнерыИКонтрагентыЛокализация.xml new file mode 100644 index 0000000..bf64c56 --- /dev/null +++ b/src/CommonModules/ПартнерыИКонтрагентыЛокализация.xml @@ -0,0 +1,23 @@ + + + + + + Module + Extended + + + + Adopted + ПартнерыИКонтрагентыЛокализация + + c7ca240a-541d-4f86-8e30-0e63aafcd5fa + false + false + true + true + true + false + + + diff --git a/src/CommonModules/ПартнерыИКонтрагентыЛокализация/Ext/Module.bsl b/src/CommonModules/ПартнерыИКонтрагентыЛокализация/Ext/Module.bsl new file mode 100644 index 0000000..cbc32d6 --- /dev/null +++ b/src/CommonModules/ПартнерыИКонтрагентыЛокализация/Ext/Module.bsl @@ -0,0 +1,175 @@ + +&ИзменениеИКонтроль("ИННКППУжеИспользуетсяВИнформационнойБазе") +Функция РК_ИННКППУжеИспользуетсяВИнформационнойБазе(ИНН, КПП, ИсключаяСсылку = Неопределено, ЮрФизЛицо = Неопределено) Экспорт + + РезультатПоиска = Новый Структура; + РезультатПоиска.Вставить("НайденныеСовпадения", Новый Массив); + РезультатПоиска.Вставить("ДоступноСоздание", Истина); + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + #Удаление + Запрос.Текст = " + |ВЫБРАТЬ + | Контрагенты.Ссылка КАК Ссылка, + | Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо, + | Партнеры.Ссылка КАК Партнер, + | Партнеры.Код КАК Код, + | ПРЕДСТАВЛЕНИЕ(Партнеры.ОсновнойМенеджер) КАК ОсновнойМенеджер + |ИЗ + | Справочник.Контрагенты КАК Контрагенты + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры КАК Партнеры + | ПО Контрагенты.Партнер = Партнеры.Ссылка + |ГДЕ + | Контрагенты.ИНН = &ИНН + | И Контрагенты.КПП = &КПП + | И Контрагенты.Ссылка <> &Ссылка"; + #КонецУдаления + #Вставка + // {{ [+] (фрагмент ДОБАВЛЕН), уникальность ИНН/КПП только среди непомеченных на удаление контрагентов + Запрос.Текст = " + |ВЫБРАТЬ + | Контрагенты.Ссылка КАК Ссылка, + | Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо, + | Партнеры.Ссылка КАК Партнер, + | Партнеры.Код КАК Код, + | ПРЕДСТАВЛЕНИЕ(Партнеры.ОсновнойМенеджер) КАК ОсновнойМенеджер + |ИЗ + | Справочник.Контрагенты КАК Контрагенты + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры КАК Партнеры + | ПО Контрагенты.Партнер = Партнеры.Ссылка + |ГДЕ + | Контрагенты.ИНН = &ИНН + | И Контрагенты.КПП = &КПП + | И Контрагенты.Ссылка <> &Ссылка + | И НЕ Контрагенты.ПометкаУдаления"; + // }} + #КонецВставки + + Запрос.УстановитьПараметр("ИНН",ИНН); + Запрос.УстановитьПараметр("КПП",КПП); + Запрос.УстановитьПараметр("Ссылка",ИсключаяСсылку); + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Количество() = 1 Тогда + + Выборка.Следующий(); + + Если ЗначениеЗаполнено(ИсключаяСсылку) + И Выборка.Ссылка = ИсключаяСсылку Тогда + + Возврат РезультатПоиска; + + ИначеЕсли ЗначениеЗаполнено(ЮрФизЛицо) Тогда + + Если ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель + И Выборка.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо Тогда + + ДобавитьДанныеНайденногоКонтрагента(Выборка, РезультатПоиска.НайденныеСовпадения); + + ИначеЕсли ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо + И Выборка.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель Тогда + + ДобавитьДанныеНайденногоКонтрагента(Выборка, РезультатПоиска.НайденныеСовпадения); + + Иначе + + ДобавитьДанныеНайденногоКонтрагента(Выборка, РезультатПоиска.НайденныеСовпадения); + РезультатПоиска.ДоступноСоздание = Ложь; + + КонецЕсли; + + Иначе + + ДобавитьДанныеНайденногоКонтрагента(Выборка, РезультатПоиска.НайденныеСовпадения); + РезультатПоиска.ДоступноСоздание = Ложь; + + КонецЕсли; + + ИначеЕсли Выборка.Количество() > 1 Тогда + + РезультатПоиска.ДоступноСоздание = Ложь; + + Пока Выборка.Следующий() Цикл + + ДобавитьДанныеНайденногоКонтрагента(Выборка, РезультатПоиска.НайденныеСовпадения); + + КонецЦикла; + + КонецЕсли; + + Возврат РезультатПоиска; + +КонецФункции + +&ИзменениеИКонтроль("ПроверитьКорректностьЗаполненияКонтрагента") +Процедура РК_ПроверитьКорректностьЗаполненияКонтрагента(Объект, Контрагент, Отказ) Экспорт + //++ Локализация + КлючДанных = ?(ТипЗнч(Объект) = Тип("ФормаКлиентскогоПриложения"), Неопределено, Объект); + Если Объект.ОбособленноеПодразделение И ЗначениеЗаполнено(Объект.ГоловнойКонтрагент) Тогда + + Если Объект.ГоловнойКонтрагент <> Контрагент Тогда + + СвойстваГоловногоКонтрагента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта( + Объект.ГоловнойКонтрагент, "Наименование, ИНН"); + + Если ЗначениеЗаполнено(СвойстваГоловногоКонтрагента.ИНН) И СвойстваГоловногоКонтрагента.ИНН <> Объект.ИНН Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'ИНН контрагента не равен указанному в головном подразделении'"), + СвойстваГоловногоКонтрагента.Наименование); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, КлючДанных, "ИНН", , Отказ); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если ЗначениеЗаполнено(Объект.ИНН) Тогда + + #Вставка + // {{ [+] (фрагмент ДОБАВЛЕН), для помеченных на удаление уникальность ИНН/КПП не проверяется + Если НЕ Объект.ПометкаУдаления Тогда + // }} + #КонецВставки + + РезультатПоиска = ИННКППУжеИспользуетсяВИнформационнойБазе(Объект.ИНН, Объект.КПП, Контрагент, Объект.ЮрФизЛицо) ; + + Если Не РезультатПоиска.ДоступноСоздание Тогда + + ДанныеКонтрагента = РезультатПоиска.НайденныеСовпадения[0]; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Данные ИНН и КПП уже указаны для другого контрагента, ответственный - %1.'"), + ДанныеКонтрагента.ОсновнойМенеджер), + КлючДанных, + "ИНН", + , + Отказ); + + КонецЕсли; + + #Вставка + КонецЕсли; + // }} + #КонецВставки + + Иначе + + Если НЕ ПартнерыИКонтрагенты.УпрощенныйВводДоступен() Тогда + + Если (Объект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель + ИЛИ Объект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Не указан ИНН'"), + КлючДанных, + "ИНН", + , + Отказ); + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + //-- Локализация +КонецПроцедуры diff --git a/src/ConfigDumpInfo.xml b/src/ConfigDumpInfo.xml index 1455694..8796662 100644 --- a/src/ConfigDumpInfo.xml +++ b/src/ConfigDumpInfo.xml @@ -9,6 +9,8 @@ + + diff --git a/src/Configuration.xml b/src/Configuration.xml index e426823..84a7293 100644 --- a/src/Configuration.xml +++ b/src/Configuration.xml @@ -62,7 +62,7 @@ Role.РК_ОсновнаяРоль - 1.3.0.38 + 1.3.0.39 Language.Русский @@ -97,6 +97,7 @@ РК_ОбщегоНазначенияВызовСервера ОбщегоНазначенияКлиентСервер МенеджерОбменаЧерезУниверсальныйФормат + ПартнерыИКонтрагентыЛокализация EnterpriseData_1_8_7 EnterpriseData_1_8_6 РК_ФункциональнаяОпцияРежимаОтладки