fix(bitra-patch): email через JOIN к ТЧ.КонтактнаяИнформация.АдресЭП (кастомное поле BIT.RA)

This commit is contained in:
Roman Chesnokov
2026-05-15 19:47:16 +05:00
parent 6fd8388071
commit a10cb3e32b
@@ -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", Выборка.ДолженЗаполнятьОтчет);
Результат.Добавить(Запись);
КонецЦикла;