Разработка и кастомизация решения Контур.Диадок часто требует добавления уникальной бизнес-логики. Одной из распространенных задач является создание дополнительных кнопок в интерфейсе Диадока, по нажатию на которые должна открываться форма объекта 1С (например, задача исполнителя, документ или справочник). Однако программисты часто сталкиваются с проблемой: основной код подключаемого модуля (ПМ) выполняется в модуле объекта на стороне сервера, где методы ОткрытьФорму() или ПоказатьВопрос() недоступны. В этой статье мы подробно разберем, как реализовать клиентскую логику в закрытой экосистеме Диадока.
Рассмотрим стандартную ситуацию: вы используете внешнюю обработку в качестве подключаемого модуля. В модуле объекта этой обработки вы описываете функцию НастроитьДополнительныеКнопки, и кнопка успешно появляется в подменю «Действия». Однако, когда дело доходит до обработки нажатия в функции НажатиеДополнительнойКнопки, выясняется, что этот код выполняется на сервере. Попытка вызвать клиентские методы приводит к ошибке или отсутствию реакции интерфейса. Нам необходимо найти способ передать управление на сторону клиента.
Для начала проанализируем, как кнопка регистрируется в системе. В модуле объекта подключаемого модуля должна присутствовать функция, которая сообщает основной обработке Диадока о наличии новой команды. Рассмотрим пример кода:
Функция НастроитьДополнительныеКнопки(Контекст) Экспорт
Кнопки = Новый СписокЗначений;
Кнопки.Добавить("СформироватьЗадачуВНСИ", "Сформировать задачу в НСИ");
Возврат Кнопки;
КонецФункции
После этого система будет знать, что при работе с документами нужно отображать вашу кнопку. Теперь нам нужно сделать так, чтобы обработка нажатия уходила не в модуль объекта, а в специальную форму.
Выясним главную особенность архитектуры Диадока: основная обработка при выполнении действий ищет в файле подключаемого модуля форму с конкретным именем. Рассмотрим алгоритм действий:
ПодключаемыйМодуль.Система спроектирована так, что при определенных событиях она инициализирует эту форму на клиенте и вызывает в ней экспортные функции. Это и есть наш «мост» между сервером и интерфейсом пользователя.
Разберем, как именно форма перехватывает нажатие кнопки. В модуле созданной формы ПодключаемыйМодуль необходимо создать экспортную функцию ОбработатьСобытие. Именно она является универсальной точкой входа для всех клиентских вызовов из основной обработки Диадока.
Проанализируем пример реализации такой функции:
&НаКлиенте
Функция ОбработатьСобытие(ИмяСобытия, Параметры) Экспорт
Если ИмяСобытия = "НажатиеДополнительнойКнопки" Тогда
Если Параметры.ИмяКнопки = "СформироватьЗадачуВНСИ" Тогда
// Определяем параметры для открытия формы
ПараметрыФормы = Новый Структура;
// Здесь можно передать данные из выделенных строк Диадока
Если Параметры.Свойство("ВыделенныеСтроки") И Параметры.ВыделенныеСтроки.Количество() > 0 Тогда
ПараметрыФормы.Вставить("ДокументДиадок", Параметры.ВыделенныеСтроки[0]);
КонецЕсли;
// Теперь мы на клиенте и можем свободно открывать формы
ОткрытьФорму("Задача.ЗадачаИсполнителя.Форма.ФормаЗадачиБП", ПараметрыФормы);
Возврат Истина; // Сообщаем системе, что событие обработано
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции
Посмотрим подробнее на структуру Параметры, которая приходит в функцию. Она содержит важные данные о текущем состоянии интерфейса Диадока:
Если вы все написали, но код «не попадает» в функцию ОбработатьСобытие, проанализируем возможные причины:
ПодключаемыйМодуль. Ошибка в одной букве сделает форму «невидимой» для основной обработки.ПМ.epf.Разберем, что еще мы можем сделать, имея доступ к клиенту через форму ПодключаемыйМодуль. Кроме открытия форм, вам становятся доступны:
1. Интерактивные вопросы:
Вы можете спросить пользователя о подтверждении действия перед тем, как запускать тяжелый серверный процесс.
ПоказатьВопрос(Новый ОписаниеОповещения("ПослеВопроса", ЭтотОбъект), "Вы уверены?", РежимДиалогаВопрос.ДаНет);
2. Работа с файловой системой:
Выбор файлов на диске для последующей загрузки или прикрепления к документам Диадока.
3. Динамическое управление интерфейсом:
Используя событие ПослеОткрытияФормыСписокДокументов, вы можете на клиенте управлять видимостью стандартных элементов управления Диадока в зависимости от прав текущего пользователя или других условий.
Таким образом, использование формы-посредника в подключаемом модуле позволяет обойти ограничения серверного контекста и реализовать полноценный интерактивный интерфейс, интегрированный в экосистему электронного документооборота.