From 6a61479ba2215716362a40e705a210ad7d0c1524 Mon Sep 17 00:00:00 2001 From: Michael BAG Date: Wed, 8 Jul 2026 19:04:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BC=D0=B5=D0=BD:=20=D0=B4=D0=BE?= =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2=20=D1=80=D0=B0=D1=81=D1=87?= =?UTF-8?q?=D1=91=D1=82=D0=BE=D0=B2=20=D0=BF=D0=BE=20=D0=B4=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=D0=B2=D0=BE=D1=80=D0=B0=D0=BC=20(1.3.0.40).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Типовой механизм UT 11.5 может не создать ОР при обмене crm3-dev→crm3-26; добавлен fallback через СоздатьЭлемент после отложенной обработки. Co-authored-by: Cursor --- CHANGELOG.md | 19 ++ VERSION | 2 +- .../Ext/Module.bsl | 224 +++++++++++++++++- src/Configuration.xml | 4 +- 4 files changed, 245 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 826d76e..419a9c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,25 @@ --- +## 1.3.0.40 (2026-07-08) + +### Обмен — объекты расчётов по договорам + +Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`. + +В UT 11.5 `ОбъектыРасчетов` — отдельный справочник; в XDTO 1.8 не передаётся. Типовой `ВзаиморасчетыСервер.ПередЗаписью` при обмене crm3-dev → crm3-26 может не создать ОР (пустой партнёр на договоре, сбой `СоздатьПоКлючу`). + +| Процедура/функция | Назначение | +|-------------------|------------| +| `РК_ПартнерКонтрагентДляДоговора` | партнёр/контрагент из договора, подсказок заказа или последнего заказа | +| `РК_ОбеспечитьОбъектРасчетовПоДоговору` | создание ОР через `СоздатьЭлемент`, если не найден | +| `РК_ПКО_ДоговорыКонтрагентов_ДозаполнитьПартнера` | `&После` ПКО договора — дозаполнение партнёра из контрагента | +| `РК_ОтложеннаяОбработка_ДосоздатьОбъектыРасчетов` | `&После` типовой отложенной обработки — досоздание ОР по договорам из пакета | + +Применяется только к узлу «Рабочая CRM3» (`РК_ЭтоОбменС_Crm3Dev`). + +--- + ## 1.3.0.39 (2026-07-06) ### Контрагенты — уникальность ИНН/КПП diff --git a/VERSION b/VERSION index 122b2b5..2a5bd15 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.0.39 +1.3.0.40 diff --git a/src/CommonModules/МенеджерОбменаЧерезУниверсальныйФормат/Ext/Module.bsl b/src/CommonModules/МенеджерОбменаЧерезУниверсальныйФормат/Ext/Module.bsl index 3c547df..708fb1d 100644 --- a/src/CommonModules/МенеджерОбменаЧерезУниверсальныйФормат/Ext/Module.bsl +++ b/src/CommonModules/МенеджерОбменаЧерезУниверсальныйФормат/Ext/Module.bsl @@ -1,4 +1,4 @@ -#Область СлужебныйПрограммныйИнтерфейс +#Область СлужебныйПрограммныйИнтерфейс #Область ПКПД // &После ЗаполнитьПравилаКонвертацииПредопределенныхДанных. // Дополняет правило ПКПД «Перечисление_СтавкиНДС» значениями НДС22 и НДС22_122 @@ -443,4 +443,226 @@ КонецПроцедуры +// --- Объекты расчётов (crm3-dev → crm3-26) --- +// В UT 11.5 ОбъектыРасчетов — отдельный справочник; в XDTO 1.8 не передаётся. +// Типовой ВзаиморасчетыСервер.ПередЗаписью может не создать ОР (СоздатьПоКлючу, пустой партнёр). +// См. docs/transfer/План_синхронизации_2026-07-06_Учет.md (У1.1), Код_создания_объектов_расчетов_договоров.bsl. + +// Возвращает партнёра и контрагента для договора: из договора, подсказок или последнего заказа. +// +// Параметры: +// ДоговорСсылка - СправочникСсылка.ДоговорыКонтрагентов. +// ПартнерПодсказка - СправочникСсылка.Партнеры, Неопределено. +// КонтрагентПодсказка - СправочникСсылка.Контрагенты, Неопределено. +// +// Возвращаемое значение: +// Структура - Партнер, Контрагент (могут остаться пустыми). +// +Функция РК_ПартнерКонтрагентДляДоговора(ДоговорСсылка, ПартнерПодсказка = Неопределено, КонтрагентПодсказка = Неопределено) + + Результат = Новый Структура("Партнер, Контрагент"); + + Если Не ЗначениеЗаполнено(ДоговорСсылка) Тогда + Возврат Результат; + КонецЕсли; + + РеквизитыДоговора = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДоговорСсылка, "Партнер, Контрагент"); + Партнер = РеквизитыДоговора.Партнер; + Контрагент = РеквизитыДоговора.Контрагент; + + Если ЗначениеЗаполнено(ПартнерПодсказка) Тогда + Партнер = ПартнерПодсказка; + КонецЕсли; + Если ЗначениеЗаполнено(КонтрагентПодсказка) Тогда + Контрагент = КонтрагентПодсказка; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Контрагент) И ЗначениеЗаполнено(Партнер) Тогда + Контрагент = ПартнерыИКонтрагенты.ПолучитьКонтрагентаПартнераПоУмолчанию(Партнер); + КонецЕсли; + Если Не ЗначениеЗаполнено(Партнер) И ЗначениеЗаполнено(Контрагент) Тогда + Партнер = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Контрагент, "Партнер"); + КонецЕсли; + + Если Не ЗначениеЗаполнено(Партнер) ИЛИ Не ЗначениеЗаполнено(Контрагент) Тогда + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Зак.Партнер КАК Партнер, + | Зак.Контрагент КАК Контрагент + |ИЗ + | Документ.ЗаказКлиента КАК Зак + |ГДЕ + | Зак.Договор = &Договор + | И НЕ Зак.ПометкаУдаления + |УПОРЯДОЧИТЬ ПО + | Зак.Дата УБЫВ"; + Запрос.УстановитьПараметр("Договор", ДоговорСсылка); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Если Не ЗначениеЗаполнено(Партнер) Тогда + Партнер = Выборка.Партнер; + КонецЕсли; + Если Не ЗначениеЗаполнено(Контрагент) Тогда + Контрагент = Выборка.Контрагент; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Контрагент) И ЗначениеЗаполнено(Партнер) Тогда + Контрагент = ПартнерыИКонтрагенты.ПолучитьКонтрагентаПартнераПоУмолчанию(Партнер); + КонецЕсли; + + Результат.Партнер = Партнер; + Результат.Контрагент = Контрагент; + Возврат Результат; + +КонецФункции + +// Создаёт элемент справочника ОбъектыРасчетов для договора, если его ещё нет. +// Использует СоздатьЭлемент (не СоздатьПоКлючу — падает на договорах из обмена). +// +// Параметры: +// ДоговорСсылка - СправочникСсылка.ДоговорыКонтрагентов. +// Партнер - СправочникСсылка.Партнеры. +// Контрагент - СправочникСсылка.Контрагенты. +// КомпонентыОбмена - Структура - контекст обмена (для журнала). +// +// Возвращаемое значение: +// СправочникСсылка.ОбъектыРасчетов - созданный или найденный ОР; пустая ссылка при ошибке. +// +Функция РК_ОбеспечитьОбъектРасчетовПоДоговору(ДоговорСсылка, Партнер, Контрагент, КомпонентыОбмена) + + ПустаяСсылкаОР = Справочники.ОбъектыРасчетов.ПустаяСсылка(); + + Если Не ЗначениеЗаполнено(ДоговорСсылка) Или Не ОбщегоНазначения.СсылкаСуществует(ДоговорСсылка) Тогда + Возврат ПустаяСсылкаОР; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Партнер) Или Не ЗначениеЗаполнено(Контрагент) Тогда + Возврат ПустаяСсылкаОР; + КонецЕсли; + + Организация = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДоговорСсылка, "Организация"); + Если Не ЗначениеЗаполнено(Организация) Тогда + Возврат ПустаяСсылкаОР; + КонецЕсли; + + Валюта = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДоговорСсылка, "ВалютаВзаиморасчетов"); + Если Не ЗначениеЗаполнено(Валюта) Тогда + Валюта = Константы.ВалютаРегламентированногоУчета.Получить(); + КонецЕсли; + + КритерииОР = ОбъектыРасчетовСервер.ДополнительныеКритерииПоиска(); + КритерииОР.Партнер = Партнер; + КритерииОР.Контрагент = Контрагент; + КритерииОР.ВалютаВзаиморасчетов = Валюта; + КритерииОР.ВернутьПервый = Истина; + + СсылкаОР = ОбъектыРасчетовСервер.ПолучитьОбъектРасчетовПоСсылке( + ДоговорСсылка, + Организация, + Перечисления.ТипыРасчетовСПартнерами.РасчетыСКлиентом, + КритерииОР); + + Если ЗначениеЗаполнено(СсылкаОР) Тогда + Возврат СсылкаОР; + КонецЕсли; + + Попытка + НовыйОР = Справочники.ОбъектыРасчетов.СоздатьЭлемент(); + НовыйОР.Объект = ДоговорСсылка; + НовыйОР.Организация = Организация; + НовыйОР.Контрагент = Контрагент; + НовыйОР.Партнер = Партнер; + НовыйОР.ТипРасчетов = Перечисления.ТипыРасчетовСПартнерами.РасчетыСКлиентом; + НовыйОР.ВалютаВзаиморасчетов = Валюта; + НовыйОР.Договор = ДоговорСсылка; + НовыйОР.Записать(); + Возврат НовыйОР.Ссылка; + Исключение + ТекстОшибки = СтрШаблон( + "Не удалось создать объект расчётов для договора %1: %2", + ДоговорСсылка, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьОшибкуВЖурналРегистрации(ДоговорСсылка, ТекстОшибки, КомпонентыОбмена, + НСтр("ru = 'создать объект расчётов по договору'"), УровеньЖурналаРегистрации.Предупреждение); + Возврат ПустаяСсылкаОР; + КонецПопытки; + +КонецФункции + +// &После ПКО_Справочник_ДоговорыКонтрагентов_Получение_ПередЗаписьюПолученныхДанных. +// Дозаполняет партнёра на договоре из контрагента до записи в ИБ. +// +&После("ПКО_Справочник_ДоговорыКонтрагентов_Получение_ПередЗаписьюПолученныхДанных") +Процедура РК_ПКО_ДоговорыКонтрагентов_ДозаполнитьПартнера(ПолученныеДанные, ДанныеИБ, КонвертацияСвойств, КомпонентыОбмена) + + Если Не РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена) Тогда + Возврат; + КонецЕсли; + + Если ПолученныеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ПолученныеДанные.Партнер) И ЗначениеЗаполнено(ПолученныеДанные.Контрагент) Тогда + ПолученныеДанные.Партнер = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПолученныеДанные.Контрагент, "Партнер"); + КонецЕсли; + + Если Не ЗначениеЗаполнено(ПолученныеДанные.Контрагент) И ЗначениеЗаполнено(ПолученныеДанные.Партнер) Тогда + ПолученныеДанные.Контрагент = ПартнерыИКонтрагенты.ПолучитьКонтрагентаПартнераПоУмолчанию(ПолученныеДанные.Партнер); + КонецЕсли; + +КонецПроцедуры + +// &После ОтложеннаяОбработка_СоздатьОбновитьОбъектыРасчетов. +// Досоздаёт объекты расчётов по договорам из пакета обмена, если типовой механизм их пропустил. +// +&После("ОтложеннаяОбработка_СоздатьОбновитьОбъектыРасчетов") +Процедура РК_ОтложеннаяОбработка_ДосоздатьОбъектыРасчетов(КомпонентыОбмена) + + Если Не РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена) Тогда + Возврат; + КонецЕсли; + + ДоговорыКОбработке = Новый Соответствие; + + Для Каждого ЗагруженныйОбъект Из КомпонентыОбмена.ЗагруженныеОбъекты Цикл + + СсылкаНаОбъект = ЗагруженныйОбъект.СсылкаНаОбъект; + ТипСсылки = ТипЗнч(СсылкаНаОбъект); + + Если ТипСсылки = Тип("СправочникСсылка.ДоговорыКонтрагентов") Тогда + ДоговорыКОбработке.Вставить(СсылкаНаОбъект, Новый Структура("Партнер, Контрагент")); + ИначеЕсли ТипСсылки = Тип("ДокументСсылка.ЗаказКлиента") Тогда + РеквизитыЗаказа = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаОбъект, "Договор, Партнер, Контрагент"); + Если ЗначениеЗаполнено(РеквизитыЗаказа.Договор) Тогда + Подсказки = Новый Структура("Партнер, Контрагент", РеквизитыЗаказа.Партнер, РеквизитыЗаказа.Контрагент); + ДоговорыКОбработке.Вставить(РеквизитыЗаказа.Договор, Подсказки); + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + Для Каждого КлючИЗначение Из ДоговорыКОбработке Цикл + + ДоговорСсылка = КлючИЗначение.Ключ; + Подсказки = КлючИЗначение.Значение; + + Участники = РК_ПартнерКонтрагентДляДоговора( + ДоговорСсылка, + Подсказки.Партнер, + Подсказки.Контрагент); + + РК_ОбеспечитьОбъектРасчетовПоДоговору( + ДоговорСсылка, + Участники.Партнер, + Участники.Контрагент, + КомпонентыОбмена); + + КонецЦикла; + +КонецПроцедуры + #КонецОбласти diff --git a/src/Configuration.xml b/src/Configuration.xml index 84a7293..1698bcb 100644 --- a/src/Configuration.xml +++ b/src/Configuration.xml @@ -1,4 +1,4 @@ - + @@ -62,7 +62,7 @@ Role.РК_ОсновнаяРоль - 1.3.0.39 + 1.3.0.40 Language.Русский