Обновление

This commit is contained in:
wakadakawaka 2025-08-19 19:49:24 +05:00
parent 160559530b
commit 67d6bb2c06
2 changed files with 249 additions and 121 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -2,22 +2,166 @@
title: Подключение к подсистеме Взаимодействия title: Подключение к подсистеме Взаимодействия
slug: общие-бсп-стандартные-подсистемы-3-1-10-взаимодействия/подключение-к-подсистеме-взаимодействия slug: общие-бсп-стандартные-подсистемы-3-1-10-взаимодействия/подключение-к-подсистеме-взаимодействия
--- ---
# Настройка объекта
Создаем новый документ/справочник. В документе должны быть реквизит `Ответственный` (СправочникСсылка.Пользователи) и табличная часть `ПартнерыИКонтактныеЛица`.
Табличная часть со следующими реквизитами: ## Настройка **определяемых типов**
В определяемый тип `КонтактВзаимодействия` необходимо включить справочники, элементы которых будут выступать контактами - `Контрагенты`, `Пользователи`, `КонтактныеЛицаКонтрагентов` и прочее. **`КонтактВзаимодействия` должен быть подключен к подсистеме `Контактная информация`**
- `Партнер` (СправочникСсылка.Партнеры) В определяемый тип `ПредметВзаимодействия` необходимо включить справочники/документы, элементы которых будут выступать предметами взаимодействий - `ЗаказКлиента`, `ЗаказПоставщику`, `КоммерческоеПредложение` и прочее.
- `РольПартнера` (СправочникСсылка.РолиПартнеровВСделкахИПроектах)
- `КонтактноеЛицо` (СправочникСсылка.КонтактныеЛицаПартнеров)
- `РольКонтактногоЛица` (СправочникСсылка.РолиКонтактныхЛицВСделакахИПроектах)
- `Комментарий` (Строка)
Добавляем этот документ в определяемый тип `ПредметВзаимодействия` ## Настройка модуля менеджера **предметов взаимодействий**
# Общие модули В модуле менеджера должны быть определены 2 экспортные функции:
В общем модуле `ВзаимодействияКлиентСерверПереопределяемый` в процедуре `ПриОпределенииВозможныхПредметов` добавляем наш документ - `ПолучитьКонтакты` - возвращает список контактов
- `ТекстЗапросаПоКонтактам` - возвращает текст запроса, который позволяет получить `КонтактыВзаимодействия` из предмета взаимодействия.
```bsl ```bsl
// СтандартныеПодсистемы.Взаимодействия
// Получить контакты.
//
// Параметры:
// Ссылка - См.ОпределяемыйТип.ПредметВзаимодействия - объект, контакты которого необходимо получить.
//
// Возвращаемое значение:
// Массив - массив, содержащий контакты документа.
//
Функция ПолучитьКонтакты(Ссылка) Экспорт
Если НЕ ЗначениеЗаполнено(Ссылка) Тогда
Возврат Новый Массив;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапросаПоКонтактам();
Запрос.УстановитьПараметр("Предмет", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Новый Массив;
КонецЕсли;
Возврат РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Контакт");
КонецФункции
// Возвращает текст запроса по контактам взаимодействий, содержащимся в документе.
//
// Возвращаемое значение:
// Строка
//
Функция ТекстЗапросаПоКонтактам(ЭтоФрагментЗапроса = Ложь) Экспорт
ТекстЗапроса = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЗаказКлиента.Контрагент КАК Контакт
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
| ЗаказКлиента.Ссылка = &Предмет
| И (НЕ ЗаказКлиента.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка))
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЗаказКлиента.КонтактноеЛицо
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
| ЗаказКлиента.Ссылка = &Предмет
| И (НЕ ЗаказКлиента.КонтактноеЛицо = ЗНАЧЕНИЕ(Справочник.КонтактныеЛицаКонтрагентов.ПустаяСсылка))";
Если ЭтоФрагментЗапроса Тогда
ТекстЗапроса = "
| ОБЪЕДИНИТЬ ВСЕ
|" + ТекстЗапроса;
КонецЕсли;
Возврат ТекстЗапроса;
КонецФункции
// Конец СтандартныеПодсистемы.Взаимодействия
```
<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
<summary style="font-weight: bold; cursor: pointer;">Об аргументе ЭтоФрагментЗапроса</summary>
Аргумент `ЭтоФрагментЗапроса` функции `ТекстЗапросаПоКонтактам` необходим при вызове этого метода в момент открытия формы добавления `участников взаимодействия` (по стеку из процедуры `ВзаимодействияПереопределяемый.ПриПоискеКонтактов`) - система автоматически подставляет к предопределенным источникам контактов взаимодействия те, которые указаны в конкретном предмете:
```bsl
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
КонтактыВзаимодействия.Контакт КАК Контакт
ПОМЕСТИТЬ ТаблицаКонтактов
ИЗ
Документ.Встреча.Участники КАК КонтактыВзаимодействия
ГДЕ
...
...
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ РАЗЛИЧНЫЕ
КонтактыВзаимодействия.Контакт
ИЗ
Документ.ЗапланированноеВзаимодействие.Участники КАК КонтактыВзаимодействия
ГДЕ
...
...
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ РАЗЛИЧНЫЕ
КонтактыВзаимодействия.АбонентКонтакт
ИЗ
Документ.ТелефонныйЗвонок КАК КонтактыВзаимодействия
ГДЕ
...
...
ОБЪЕДИНИТЬ ВСЕ
...
```
> и еще много источников, которые подсистема собирает
```bsl
...
// Это наша реализация
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ РАЗЛИЧНЫЕ
ЗаказКлиента.Контрагент
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента
ГДЕ
ЗаказКлиента.Ссылка = &Предмет
И НЕ ЗаказКлиента.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ЗаказКлиента.КонтактноеЛицо
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента
ГДЕ
ЗаказКлиента.Ссылка = &Предмет
И НЕ ЗаказКлиента.КонтактноеЛицо = ЗНАЧЕНИЕ(Справочник.КонтактныеЛицаКонтрагентов.ПустаяСсылка)
```
![Изображение](/bsp-vzaimodeystviya/1.png)
</details>
## Настройка переопределяемых модулей
При необходимости можно вписать реализацию в функции переопределяемых модулей подсистемы:
- `ВзаимодействияКлиентСерверПереопределяемый` (Обязательно),
- `ВзаимодействияПереопределяемый` (Обязательно),
- `ВзаимодействияКлиентПереопределяемый` (опционально)
### Общий модуль ВзаимодействияКлиентСерверПереопределяемый
Дополнить код процедур:
- `ПриОпределенииВозможныхПредметов` - добавляем предметы, которые были добавлены в определяемый тип `ПредметВзаимодействия` (кроме стандартных)
- `ПриОпределенииВозможныхКонтактов` - добавляем описание контактов (из определяемого типа `КонтактВзаимодействия`). Контакт должен быть подключен к подсистеме `КонтактнаяИнформация`
```bsl
// Задает типы предметов взаимодействий, например: заказы, вакансии и т.п. // Задает типы предметов взаимодействий, например: заказы, вакансии и т.п.
// Используется, если в конфигурации определен хотя бы один предмет взаимодействий. // Используется, если в конфигурации определен хотя бы один предмет взаимодействий.
// //
@ -26,124 +170,108 @@ slug: общие-бсп-стандартные-подсистемы-3-1-10-вз
// например, "ДокументСсылка.ЗаказПокупателя" и т.п. // например, "ДокументСсылка.ЗаказПокупателя" и т.п.
// //
Процедура ПриОпределенииВозможныхПредметов(ТипыПредметов) Экспорт Процедура ПриОпределенииВозможныхПредметов(ТипыПредметов) Экспорт
ТипыПредметов.Добавить("ДокументСсылка.ТестовыйДокумент"); // _Демо начало примера
ТипыПредметов.Добавить("ДокументСсылка._ДемоЗаказПокупателя");
КонецПроцедуры // _Демо конец примера
```
# Настройка формы объекта
На форме документа создаем реквизит `ВзаимодействиеОснование` с составным типом `ДокументСсылка.ЭлектронноеПисьмоИсходящее, ДокументСсылка.ЗапланированноеВзаимодействие, ДокументСсылка.ЭлектронноеПисьмоВходящее, ДокументСсылка.ТелефонныйЗвонок, ДокументСсылка.Встреча`; реквизит `НеобходимоОповещение` типа `Булево`
В обработчиках `ПриСозданииНаСервере`, `ПриЗаписиНаСервере` и `ПослеЗаписи` определяем вызовы стандартных процедур
```bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// СтандартныеПодсистемы.Взаимодействия
Взаимодействия.ПодготовитьОповещения(ЭтотОбъект,Параметры);
// Конец СтандартныеПодсистемы.Взаимодействия
КонецПроцедуры КонецПроцедуры
&НаСервере // Задает описания возможных типов контактов взаимодействий, например: партнеры, контактные лица и т.п.
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) // Используется, если в конфигурации определен хотя бы один тип контактов взаимодействий,
// помимо справочника Пользователи.
// СтандартныеПодсистемы.Взаимодействия
Если ЗначениеЗаполнено(ВзаимодействиеОснование) Тогда
Взаимодействия.ПриЗаписиПредметаИзФормы(
ТекущийОбъект.Ссылка, ВзаимодействиеОснование, Отказ);
КонецЕсли;
// Конец СтандартныеПодсистемы.Взаимодействия
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
// СтандартныеПодсистемы.Взаимодействия
ВзаимодействияКлиент.ВзаимодействиеПредметПослеЗаписи(ЭтотОбъект,Объект,ПараметрыЗаписи,"ТестовыйДокумент");
// Конец СтандартныеПодсистемы.Взаимодействия
КонецПроцедуры
```
# Настройка модуля менеджера
В модуле менеджера должна быть реализована экспортная функция `ПолучитьКонтакты`, которая будет возвращать список контактных лиц для заполнения в документе взаимодействия. Например:
```bsl
// Получить партнера и контактных лиц сделки.
// //
// Параметры: // Параметры:
// Ссылка - ДокументСсылка._ДемоЗаказПокупателя - документ, контакты которого необходимо получить. // ТипыКонтактов - Массив - содержит описания типов контактов взаимодействий (Структура) и их свойства:
// * Тип - Тип - тип ссылки контакта.
// * Имя - Строка - имя типа контакта , как оно определено в метаданных.
// * Представление - Строка - представление типа контакта для отображения пользователю.
// * Иерархический - Булево - признак того, является ли справочник иерархическим.
// * ЕстьВладелец - Булево - признак того, что у контакта есть владелец.
// * ИмяВладельца - Строка - имя владельца контакта, как оно определено в метаданных.
// * ИскатьПоДомену - Булево - признак того, что контакты данного типа будет подбираться
// по совпадению домена, а не по полному адресу электронной почты.
// * Связь - Строка - описывает возможную связь данного контакта с другим контактом, в
// случае когда текущий контакт является реквизитом другого контакта.
// Описывается следующей строкой "ИмяТаблицы.ИмяРеквизита".
// * ИмяРеквизитаПредставлениеКонтакта - Строка - имя реквизита контакта, из которого будет получено
// представление контакта. Если не указано, то используется
// стандартный реквизит Наименование.
// * ВозможностьИнтерактивногоСоздания - Булево - признак возможности интерактивного создания контакта из
// документов - взаимодействий.
// * ИмяФормыНовогоКонтакта - Строка - полное имя формы для создания нового контакта.
// Например, "Справочник.Партнеры.Форма.ПомощникНового".
// Если не заполнено, то открывается форма элемента по умолчанию.
// //
// Возвращаемое значение: Процедура ПриОпределенииВозможныхКонтактов(ТипыКонтактов) Экспорт
// Массив - массив, содержащий контакты документа.
// // _Демо начало примера
Функция ПолучитьКонтакты(Ссылка) Экспорт Контакт = ВзаимодействияКлиентСервер.НовоеОписаниеКонтакта();
Контакт.Тип = Тип("СправочникСсылка._ДемоПартнеры");
Если НЕ ЗначениеЗаполнено(Ссылка) Тогда Контакт.Имя = "_ДемоПартнеры";
Возврат Новый Массив; Контакт.Представление = НСтр("ru = 'Демо: Партнеры'");
КонецЕсли; Контакт.Иерархический = Истина;
ТипыКонтактов.Добавить(Контакт);
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапросаПоКонтактам(); Контакт = ВзаимодействияКлиентСервер.НовоеОписаниеКонтакта();
Запрос.УстановитьПараметр("Предмет", Ссылка); Контакт.Тип = Тип("СправочникСсылка._ДемоКонтактныеЛицаПартнеров");
РезультатЗапроса = Запрос.Выполнить(); Контакт.Имя = "_ДемоКонтактныеЛицаПартнеров";
Контакт.Представление = НСтр("ru = 'Демо: Контактные лица партнеров'");
Если РезультатЗапроса.Пустой() Тогда Контакт.ЕстьВладелец = Истина;
Возврат Новый Массив; Контакт.ИмяВладельца = "_ДемоПартнеры";
КонецЕсли; ТипыКонтактов.Добавить(Контакт);
Контакт = ВзаимодействияКлиентСервер.НовоеОписаниеКонтакта();
Контакт.Тип = Тип("СправочникСсылка._ДемоКонтрагенты");
Контакт.Имя = "_ДемоКонтрагенты";
Контакт.Представление = НСтр("ru = 'Демо: Контрагенты'");
ТипыКонтактов.Добавить(Контакт);
// _Демо конец примера
КонецПроцедуры
Возврат РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Контакт");
КонецФункции
``` ```
> Но эта функция может возвращать и пустой массив
# Опционально ### Общий модуль ВзаимодействияПереопределяемый
В модуле менеджера каждого объекта метаданных, определенного как «`предмет взаимодействий`», необходимо реализовать экспортную функцию `ТекстЗапросаПоКонтактам`, в которой сформировать текст запроса по контактам, содержащимся в предмете взаимодействий. Например, ссылки на контакты взаимодействий могут иметься в реквизитах шапки и табличных частей предметов взаимодействий. Дополнить процедуру `ПриПоискеКонтактов`
Функция принимает необязательный параметр `ЭтоФрагментЗапроса` типа `Булево`, указывающий на режим формирования запроса. Если данный параметр имеет значение `Истина`, то формируемый в функции запрос является частью другого запроса и должен начинаться с конструкции `ОБЪЕДИНИТЬ`. Возвращаемое значение  `Строка`, содержащая в себе текст запроса по контактам предмета взаимодействий. Например
```bsl ```bsl
Функция ТекстЗапросаПоКонтактам(ЭтоФрагментЗапроса = Ложь) Экспорт
// Вызывается для получения контактов (участников) по указанному предмету взаимодействия.
ТекстЗапроса = " // Используется, если в конфигурации определен хотя бы один предмет взаимодействий.
|ВЫБРАТЬ РАЗЛИЧНЫЕ //
| _ДемоЗаказПокупателя.Партнер КАК Контакт // Параметры:
|ИЗ // ИмяТаблицыКонтактов - Строка - имя таблицы предмета взаимодействий, в котором требуется выполнить поиск.
| Документ._ДемоЗаказПокупателя КАКемоЗаказПокупателя // Например, "Документы.ЗаказПокупателя".
|ГДЕ // ТекстЗапросаДляПоиска - Строка - в этот параметр указать фрагмент запроса для поиска. При выполнении запроса
| _ДемоЗаказПокупателя.Ссылка = &Предмет // в параметр запроса &Предмет подставляется ссылка на предмет взаимодействия.
| И (НЕемоЗаказПокупателя.Партнер = ЗНАЧЕНИЕ(Справочник._ДемоПартнеры.ПустаяСсылка)) //
| Процедура ПриПоискеКонтактов(Знач ИмяТаблицыКонтактов, ТекстЗапросаДляПоиска) Экспорт
|ОБЪЕДИНИТЬ ВСЕ
| Если ИмяТаблицыКонтактов = Метаданные.Документы.ЗаказКлиента.ПолноеИмя() Тогда
|ВЫБРАТЬ РАЗЛИЧНЫЕ ТекстЗапросаДляПоиска = Документы.ЗаказКлиента.ТекстЗапросаПоКонтактам(Истина);
| _ДемоЗаказПокупателяПартнерыИКонтактныеЛица.Партнер КонецЕсли;
|ИЗ
| Документ._ДемоЗаказПокупателя.ПартнерыИКонтактныеЛица КАКемоЗаказПокупателяПартнерыИКонтактныеЛица КонецПроцедуры
|ГДЕ
| _ДемоЗаказПокупателяПартнерыИКонтактныеЛица.Ссылка = &Предмет ```
| И (НЕемоЗаказПокупателяПартнерыИКонтактныеЛица.Партнер = ЗНАЧЕНИЕ(Справочник._ДемоПартнеры.ПустаяСсылка))
| И _ДемоЗаказПокупателяПартнерыИКонтактныеЛица.КонтактноеЛицо = ЗНАЧЕНИЕ(Справочник._ДемоКонтактныеЛицаПартнеров.ПустаяСсылка) ## Если не добавлена подсистема "Настройки программы"
|
|ОБЪЕДИНИТЬ ВСЕ <details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
| <summary style="font-weight: bold; cursor: pointer;">Подробнее</summary>
|ВЫБРАТЬ
| _ДемоЗаказПокупателяПартнерыИКонтактныеЛица.КонтактноеЛицо Если в конфигурации не используется подсистема Настройки программы, то на рабочем месте администратора приложения необходимо разместить константы:
|ИЗ
| Документ._ДемоЗаказПокупателя.ПартнерыИКонтактныеЛица КАКемоЗаказПокупателяПартнерыИКонтактныеЛица - `ИспользоватьПочтовыйКлиент`,
|ГДЕ - `ОтправлятьПисьмаВФорматеHTML`,
| _ДемоЗаказПокупателяПартнерыИКонтактныеЛица.Ссылка = &Предмет - `ИспользоватьПрочиеВзаимодействия`,
| И (НЕемоЗаказПокупателяПартнерыИКонтактныеЛица.КонтактноеЛицо = ЗНАЧЕНИЕ(Справочник._ДемоКонтактныеЛицаПартнеров.ПустаяСсылка))"; - `ИспользоватьПризнакРассмотрено`.
См. пример в форме `Органайзер` обработки `ПанельАдминистрированияБСП`.
Если ЭтоФрагментЗапроса Тогда
ТекстЗапроса = " В форме персональных настроек разместить вызов команды `ЖурналДокументов.Взаимодействия.Команда.НастройкиРаботыСПочтой`. Пример размещения см. в демонстрационной конфигурации в общей форме `_ДемоМоиНастройки`.
| ОБЪЕДИНИТЬ ВСЕ
|" + ТекстЗапроса; Разместить в командном интерфейсе пользователей, использующих подсистему, журнал документов `Взаимодействия`.
КонецЕсли;
</details>
Возврат ТекстЗапроса;
КонецФункции
```