Обновление

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
// Задает типы предметов взаимодействий, например: заказы, вакансии и т.п. // Задает типы предметов взаимодействий, например: заказы, вакансии и т.п.
// Используется, если в конфигурации определен хотя бы один предмет взаимодействий. // Используется, если в конфигурации определен хотя бы один предмет взаимодействий.
// //
@ -27,123 +171,107 @@ 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>