From a10cb3e32b09628f41b04382caa06af3a6030910 Mon Sep 17 00:00:00 2001 From: Roman Chesnokov Date: Fri, 15 May 2026 19:47:16 +0500 Subject: [PATCH] =?UTF-8?q?fix(bitra-patch):=20email=20=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=20JOIN=20=D0=BA=20=D0=A2=D0=A7.=D0=9A=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D0=BA=D1=82=D0=BD=D0=B0=D1=8F=D0=98=D0=BD=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D1=8F.=D0=90=D0=B4=D1=80?= =?UTF-8?q?=D0=B5=D1=81=D0=AD=D0=9F=20(=D0=BA=D0=B0=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=BC=D0=BD=D0=BE=D0=B5=20=D0=BF=D0=BE=D0=BB=D0=B5=20BIT.RA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bfd_IntegrationAPI/Module.bsl | 69 +++++++++---------- 1 file changed, 31 insertions(+), 38 deletions(-) diff --git a/bitra-patch/HTTPServices/bfd_IntegrationAPI/Module.bsl b/bitra-patch/HTTPServices/bfd_IntegrationAPI/Module.bsl index e898ec7..aefb7b0 100644 --- a/bitra-patch/HTTPServices/bfd_IntegrationAPI/Module.bsl +++ b/bitra-patch/HTTPServices/bfd_IntegrationAPI/Module.bsl @@ -25,13 +25,15 @@ // GET /v1/employees // -// Email получаем через стандартную БСП-функцию УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(), -// которая делает один массовый запрос на массив ссылок (не N+1). +// Email — через JOIN к табличной части КонтактнаяИнформация. +// В BIT.RA у ТЧ есть кастомное поле АдресЭП (адрес электронной почты) — +// это специфика данной БСП, заполняется при сохранении объекта. // Функция EmployeesGet(Запрос) Экспорт Попытка Запрос1С = Новый Запрос; + Запрос1С.УстановитьПараметр("ТипEmail", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты); Запрос1С.Текст = "ВЫБРАТЬ | Пользователи.Ссылка КАК Ссылка, @@ -41,51 +43,42 @@ | Пользователи.Подразделение КАК Подразделение, | Пользователи.Ставка КАК Ставка, | Пользователи.Недействителен КАК Недействителен, - | Пользователи.ДолженЗаполнятьОтчет КАК ДолженЗаполнятьОтчет + | Пользователи.ДолженЗаполнятьОтчет КАК ДолженЗаполнятьОтчет, + | МАКСИМУМ(КИ.АдресЭП) КАК Email |ИЗ | Справочник.Пользователи КАК Пользователи + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи.КонтактнаяИнформация КАК КИ + | ПО КИ.Ссылка = Пользователи.Ссылка + | И КИ.Тип = &ТипEmail |ГДЕ | НЕ Пользователи.ПометкаУдаления + |СГРУППИРОВАТЬ ПО + | Пользователи.Ссылка, + | Пользователи.Наименование, + | Пользователи.EVA_ID, + | Пользователи.Офис, + | Пользователи.Подразделение, + | Пользователи.Ставка, + | Пользователи.Недействителен, + | Пользователи.ДолженЗаполнятьОтчет |УПОРЯДОЧИТЬ ПО | Пользователи.Наименование"; - ТаблицаПользователей = Запрос1С.Выполнить().Выгрузить(); - - // Массовый запрос email через БСП. - МассивСсылок = ТаблицаПользователей.ВыгрузитьКолонку("Ссылка"); - ТипEmail = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты; - EmailПоПользователю = Новый Соответствие; - Попытка - ТЗКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(МассивСсылок, ТипEmail); - Для Каждого СтрКИ Из ТЗКИ Цикл - // у разных версий БСП колонка может называться 'Объект' / 'СсылкаНаОбъект' / 'Объект'. - // Достаём через структурный доступ безопасно: - Объект = ?(СтрКИ.Колонки.Найти("Объект") <> Неопределено, СтрКИ.Объект, Неопределено); - Если Объект = Неопределено И СтрКИ.Колонки.Найти("СсылкаНаОбъект") <> Неопределено Тогда - Объект = СтрКИ.СсылкаНаОбъект; - КонецЕсли; - Представление = ?(СтрКИ.Колонки.Найти("Представление") <> Неопределено, СтрКИ.Представление, ""); - Если Объект <> Неопределено И НЕ ПустаяСтрока(Представление) И EmailПоПользователю.Получить(Объект) = Неопределено Тогда - EmailПоПользователю.Вставить(Объект, Представление); - КонецЕсли; - КонецЦикла; - Исключение - // Если у БСП другая сигнатура — оставляем email пустыми (не критично для MVP). - КонецПопытки; - + Выборка = Запрос1С.Выполнить().Выбрать(); Результат = Новый Массив; - Для Каждого СтрПольз Из ТаблицаПользователей Цикл - Email = EmailПоПользователю.Получить(СтрПольз.Ссылка); + + Пока Выборка.Следующий() Цикл + Email = ?(Выборка.Email = Null, "", Строка(Выборка.Email)); Запись = Новый Структура; - Запись.Вставить("id", bfd_IntegrationAPIHelpers.UUID(СтрПольз.Ссылка)); - Запись.Вставить("full_name", СтрПольз.ФИО); - Запись.Вставить("email", ?(Email = Неопределено, "", НРег(Строка(Email)))); - Запись.Вставить("eva_id", СтрПольз.EvaID); - Запись.Вставить("office", Строка(СтрПольз.Офис)); - Запись.Вставить("department", Строка(СтрПольз.Подразделение)); - Запись.Вставить("rate", СтрПольз.Ставка); - Запись.Вставить("is_active", НЕ СтрПольз.Недействителен); - Запись.Вставить("should_fill_report", СтрПольз.ДолженЗаполнятьОтчет); + Запись.Вставить("id", bfd_IntegrationAPIHelpers.UUID(Выборка.Ссылка)); + Запись.Вставить("full_name", Выборка.ФИО); + Запись.Вставить("email", НРег(Email)); + Запись.Вставить("eva_id", Выборка.EvaID); + Запись.Вставить("office", Строка(Выборка.Офис)); + Запись.Вставить("department", Строка(Выборка.Подразделение)); + Запись.Вставить("rate", Выборка.Ставка); + Запись.Вставить("is_active", НЕ Выборка.Недействителен); + Запись.Вставить("should_fill_report", Выборка.ДолженЗаполнятьОтчет); Результат.Добавить(Запись); КонецЦикла;