Обновление

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,78 +2,25 @@
title: Подключение к подсистеме Взаимодействия
slug: общие-бсп-стандартные-подсистемы-3-1-10-взаимодействия/подключение-к-подсистеме-взаимодействия
---
# Настройка объекта
Создаем новый документ/справочник. В документе должны быть реквизит `Ответственный` (СправочникСсылка.Пользователи) и табличная часть `ПартнерыИКонтактныеЛица`.
Табличная часть со следующими реквизитами:
## Настройка **определяемых типов**
В определяемый тип `КонтактВзаимодействия` необходимо включить справочники, элементы которых будут выступать контактами - `Контрагенты`, `Пользователи`, `КонтактныеЛицаКонтрагентов` и прочее. **`КонтактВзаимодействия` должен быть подключен к подсистеме `Контактная информация`**
- `Партнер` (СправочникСсылка.Партнеры)
- `РольПартнера` (СправочникСсылка.РолиПартнеровВСделкахИПроектах)
- `КонтактноеЛицо` (СправочникСсылка.КонтактныеЛицаПартнеров)
- `РольКонтактногоЛица` (СправочникСсылка.РолиКонтактныхЛицВСделакахИПроектах)
- `Комментарий` (Строка)
В определяемый тип `ПредметВзаимодействия` необходимо включить справочники/документы, элементы которых будут выступать предметами взаимодействий - `ЗаказКлиента`, `ЗаказПоставщику`, `КоммерческоеПредложение` и прочее.
Добавляем этот документ в определяемый тип `ПредметВзаимодействия`
## Настройка модуля менеджера **предметов взаимодействий**
В модуле менеджера должны быть определены 2 экспортные функции:
- `ПолучитьКонтакты` - возвращает список контактов
- `ТекстЗапросаПоКонтактам` - возвращает текст запроса, который позволяет получить `КонтактыВзаимодействия` из предмета взаимодействия.
# Общие модули
В общем модуле `ВзаимодействияКлиентСерверПереопределяемый` в процедуре `ПриОпределенииВозможныхПредметов` добавляем наш документ
```bsl
// Задает типы предметов взаимодействий, например: заказы, вакансии и т.п.
// Используется, если в конфигурации определен хотя бы один предмет взаимодействий.
// СтандартныеПодсистемы.Взаимодействия
// Получить контакты.
//
// Параметры:
// ТипыПредметов - Массив - предметы взаимодействий (Строка),
// например, "ДокументСсылка.ЗаказПокупателя" и т.п.
//
Процедура ПриОпределенииВозможныхПредметов(ТипыПредметов) Экспорт
ТипыПредметов.Добавить("ДокументСсылка.ТестовыйДокумент");
КонецПроцедуры
```
# Настройка формы объекта
На форме документа создаем реквизит `ВзаимодействиеОснование` с составным типом `ДокументСсылка.ЭлектронноеПисьмоИсходящее, ДокументСсылка.ЗапланированноеВзаимодействие, ДокументСсылка.ЭлектронноеПисьмоВходящее, ДокументСсылка.ТелефонныйЗвонок, ДокументСсылка.Встреча`; реквизит `НеобходимоОповещение` типа `Булево`
В обработчиках `ПриСозданииНаСервере`, `ПриЗаписиНаСервере` и `ПослеЗаписи` определяем вызовы стандартных процедур
```bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// СтандартныеПодсистемы.Взаимодействия
Взаимодействия.ПодготовитьОповещения(ЭтотОбъект,Параметры);
// Конец СтандартныеПодсистемы.Взаимодействия
КонецПроцедуры
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// СтандартныеПодсистемы.Взаимодействия
Если ЗначениеЗаполнено(ВзаимодействиеОснование) Тогда
Взаимодействия.ПриЗаписиПредметаИзФормы(
ТекущийОбъект.Ссылка, ВзаимодействиеОснование, Отказ);
КонецЕсли;
// Конец СтандартныеПодсистемы.Взаимодействия
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
// СтандартныеПодсистемы.Взаимодействия
ВзаимодействияКлиент.ВзаимодействиеПредметПослеЗаписи(ЭтотОбъект,Объект,ПараметрыЗаписи,"ТестовыйДокумент");
// Конец СтандартныеПодсистемы.Взаимодействия
КонецПроцедуры
```
# Настройка модуля менеджера
В модуле менеджера должна быть реализована экспортная функция `ПолучитьКонтакты`, которая будет возвращать список контактных лиц для заполнения в документе взаимодействия. Например:
```bsl
// Получить партнера и контактных лиц сделки.
//
// Параметры:
// Ссылка - ДокументСсылка._ДемоЗаказПокупателя - документ, контакты которого необходимо получить.
// Ссылка - См.ОпределяемыйТип.ПредметВзаимодействия - объект, контакты которого необходимо получить.
//
// Возвращаемое значение:
// Массив - массив, содержащий контакты документа.
@ -96,46 +43,32 @@ slug: общие-бсп-стандартные-подсистемы-3-1-10-вз
Возврат РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Контакт");
КонецФункции
```
> Но эта функция может возвращать и пустой массив
# Опционально
В модуле менеджера каждого объекта метаданных, определенного как «`предмет взаимодействий`», необходимо реализовать экспортную функцию `ТекстЗапросаПоКонтактам`, в которой сформировать текст запроса по контактам, содержащимся в предмете взаимодействий. Например, ссылки на контакты взаимодействий могут иметься в реквизитах шапки и табличных частей предметов взаимодействий.
Функция принимает необязательный параметр `ЭтоФрагментЗапроса` типа `Булево`, указывающий на режим формирования запроса. Если данный параметр имеет значение `Истина`, то формируемый в функции запрос является частью другого запроса и должен начинаться с конструкции `ОБЪЕДИНИТЬ`. Возвращаемое значение  `Строка`, содержащая в себе текст запроса по контактам предмета взаимодействий. Например
```bsl
// Возвращает текст запроса по контактам взаимодействий, содержащимся в документе.
//
// Возвращаемое значение:
// Строка
//
Функция ТекстЗапросаПоКонтактам(ЭтоФрагментЗапроса = Ложь) Экспорт
ТекстЗапроса = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| _ДемоЗаказПокупателя.Партнер КАК Контакт
| ЗаказКлиента.Контрагент КАК Контакт
|ИЗ
| Документ._ДемоЗаказПокупателя КАКемоЗаказПокупателя
| Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
| _ДемоЗаказПокупателя.Ссылка = &Предмет
| И (НЕемоЗаказПокупателя.Партнер = ЗНАЧЕНИЕ(Справочник._ДемоПартнеры.ПустаяСсылка))
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| _ДемоЗаказПокупателяПартнерыИКонтактныеЛица.Партнер
|ИЗ
| Документ._ДемоЗаказПокупателя.ПартнерыИКонтактныеЛица КАКемоЗаказПокупателяПартнерыИКонтактныеЛица
|ГДЕ
| _ДемоЗаказПокупателяПартнерыИКонтактныеЛица.Ссылка = &Предмет
| И (НЕемоЗаказПокупателяПартнерыИКонтактныеЛица.Партнер = ЗНАЧЕНИЕ(Справочник._ДемоПартнеры.ПустаяСсылка))
| И _ДемоЗаказПокупателяПартнерыИКонтактныеЛица.КонтактноеЛицо = ЗНАЧЕНИЕ(Справочник._ДемоКонтактныеЛицаПартнеров.ПустаяСсылка)
| ЗаказКлиента.Ссылка = &Предмет
| И (НЕ ЗаказКлиента.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка))
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| _ДемоЗаказПокупателяПартнерыИКонтактныеЛица.КонтактноеЛицо
| ЗаказКлиента.КонтактноеЛицо
|ИЗ
| Документ._ДемоЗаказПокупателя.ПартнерыИКонтактныеЛица КАКемоЗаказПокупателяПартнерыИКонтактныеЛица
| Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
| _ДемоЗаказПокупателяПартнерыИКонтактныеЛица.Ссылка = &Предмет
| И (НЕемоЗаказПокупателяПартнерыИКонтактныеЛица.КонтактноеЛицо = ЗНАЧЕНИЕ(Справочник._ДемоКонтактныеЛицаПартнеров.ПустаяСсылка))";
| ЗаказКлиента.Ссылка = &Предмет
| И (НЕ ЗаказКлиента.КонтактноеЛицо = ЗНАЧЕНИЕ(Справочник.КонтактныеЛицаКонтрагентов.ПустаяСсылка))";
Если ЭтоФрагментЗапроса Тогда
ТекстЗапроса = "
@ -146,4 +79,199 @@ slug: общие-бсп-стандартные-подсистемы-3-1-10-вз
Возврат ТекстЗапроса;
КонецФункции
// Конец СтандартныеПодсистемы.Взаимодействия
```
<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
// Задает типы предметов взаимодействий, например: заказы, вакансии и т.п.
// Используется, если в конфигурации определен хотя бы один предмет взаимодействий.
//
// Параметры:
// ТипыПредметов - Массив - предметы взаимодействий (Строка),
// например, "ДокументСсылка.ЗаказПокупателя" и т.п.
//
Процедура ПриОпределенииВозможныхПредметов(ТипыПредметов) Экспорт
// _Демо начало примера
ТипыПредметов.Добавить("ДокументСсылка._ДемоЗаказПокупателя");
// _Демо конец примера
КонецПроцедуры
// Задает описания возможных типов контактов взаимодействий, например: партнеры, контактные лица и т.п.
// Используется, если в конфигурации определен хотя бы один тип контактов взаимодействий,
// помимо справочника Пользователи.
//
// Параметры:
// ТипыКонтактов - Массив - содержит описания типов контактов взаимодействий (Структура) и их свойства:
// * Тип - Тип - тип ссылки контакта.
// * Имя - Строка - имя типа контакта , как оно определено в метаданных.
// * Представление - Строка - представление типа контакта для отображения пользователю.
// * Иерархический - Булево - признак того, является ли справочник иерархическим.
// * ЕстьВладелец - Булево - признак того, что у контакта есть владелец.
// * ИмяВладельца - Строка - имя владельца контакта, как оно определено в метаданных.
// * ИскатьПоДомену - Булево - признак того, что контакты данного типа будет подбираться
// по совпадению домена, а не по полному адресу электронной почты.
// * Связь - Строка - описывает возможную связь данного контакта с другим контактом, в
// случае когда текущий контакт является реквизитом другого контакта.
// Описывается следующей строкой "ИмяТаблицы.ИмяРеквизита".
// * ИмяРеквизитаПредставлениеКонтакта - Строка - имя реквизита контакта, из которого будет получено
// представление контакта. Если не указано, то используется
// стандартный реквизит Наименование.
// * ВозможностьИнтерактивногоСоздания - Булево - признак возможности интерактивного создания контакта из
// документов - взаимодействий.
// * ИмяФормыНовогоКонтакта - Строка - полное имя формы для создания нового контакта.
// Например, "Справочник.Партнеры.Форма.ПомощникНового".
// Если не заполнено, то открывается форма элемента по умолчанию.
//
Процедура ПриОпределенииВозможныхКонтактов(ТипыКонтактов) Экспорт
// _Демо начало примера
Контакт = ВзаимодействияКлиентСервер.НовоеОписаниеКонтакта();
Контакт.Тип = Тип("СправочникСсылка._ДемоПартнеры");
Контакт.Имя = "_ДемоПартнеры";
Контакт.Представление = НСтр("ru = 'Демо: Партнеры'");
Контакт.Иерархический = Истина;
ТипыКонтактов.Добавить(Контакт);
Контакт = ВзаимодействияКлиентСервер.НовоеОписаниеКонтакта();
Контакт.Тип = Тип("СправочникСсылка._ДемоКонтактныеЛицаПартнеров");
Контакт.Имя = "_ДемоКонтактныеЛицаПартнеров";
Контакт.Представление = НСтр("ru = 'Демо: Контактные лица партнеров'");
Контакт.ЕстьВладелец = Истина;
Контакт.ИмяВладельца = "_ДемоПартнеры";
ТипыКонтактов.Добавить(Контакт);
Контакт = ВзаимодействияКлиентСервер.НовоеОписаниеКонтакта();
Контакт.Тип = Тип("СправочникСсылка._ДемоКонтрагенты");
Контакт.Имя = "_ДемоКонтрагенты";
Контакт.Представление = НСтр("ru = 'Демо: Контрагенты'");
ТипыКонтактов.Добавить(Контакт);
// _Демо конец примера
КонецПроцедуры
```
### Общий модуль ВзаимодействияПереопределяемый
Дополнить процедуру `ПриПоискеКонтактов`
```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>