Как в подключаемом модуле Контур.Диадок открыть форму 1С по нажатию кнопки?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка и кастомизация решения Контур.Диадок часто требует добавления уникальной бизнес-логики. Одной из распространенных задач является создание дополнительных кнопок в интерфейсе Диадока, по нажатию на которые должна открываться форма объекта 1С (например, задача исполнителя, документ или справочник). Однако программисты часто сталкиваются с проблемой: основной код подключаемого модуля (ПМ) выполняется в модуле объекта на стороне сервера, где методы ОткрытьФорму() или ПоказатьВопрос() недоступны. В этой статье мы подробно разберем, как реализовать клиентскую логику в закрытой экосистеме Диадока.

В чем заключается основная проблема?

Рассмотрим стандартную ситуацию: вы используете внешнюю обработку в качестве подключаемого модуля. В модуле объекта этой обработки вы описываете функцию НастроитьДополнительныеКнопки, и кнопка успешно появляется в подменю «Действия». Однако, когда дело доходит до обработки нажатия в функции НажатиеДополнительнойКнопки, выясняется, что этот код выполняется на сервере. Попытка вызвать клиентские методы приводит к ошибке или отсутствию реакции интерфейса. Нам необходимо найти способ передать управление на сторону клиента.

Шаг 1: Подготовка серверной части модуля

Для начала проанализируем, как кнопка регистрируется в системе. В модуле объекта подключаемого модуля должна присутствовать функция, которая сообщает основной обработке Диадока о наличии новой команды. Рассмотрим пример кода:


Функция НастроитьДополнительныеКнопки(Контекст) Экспорт
    Кнопки = Новый СписокЗначений;
    Кнопки.Добавить("СформироватьЗадачуВНСИ", "Сформировать задачу в НСИ");
    Возврат Кнопки;
КонецФункции

После этого система будет знать, что при работе с документами нужно отображать вашу кнопку. Теперь нам нужно сделать так, чтобы обработка нажатия уходила не в модуль объекта, а в специальную форму.

Шаг 2: Создание клиентского «моста» через форму

Выясним главную особенность архитектуры Диадока: основная обработка при выполнении действий ищет в файле подключаемого модуля форму с конкретным именем. Рассмотрим алгоритм действий:

  1. В вашей внешней обработке (ПМ) создайте новую произвольную форму.
  2. Критически важно: установите имя формы — ПодключаемыйМодуль.
  3. В модуле этой формы мы будем прописывать всю клиентскую логику.

Система спроектирована так, что при определенных событиях она инициализирует эту форму на клиенте и вызывает в ней экспортные функции. Это и есть наш «мост» между сервером и интерфейсом пользователя.

Шаг 3: Реализация функции ОбработатьСобытие

Разберем, как именно форма перехватывает нажатие кнопки. В модуле созданной формы ПодключаемыйМодуль необходимо создать экспортную функцию ОбработатьСобытие. Именно она является универсальной точкой входа для всех клиентских вызовов из основной обработки Диадока.

Проанализируем пример реализации такой функции:


&НаКлиенте
Функция ОбработатьСобытие(ИмяСобытия, Параметры) Экспорт
    
    Если ИмяСобытия = "НажатиеДополнительнойКнопки" Тогда
        
        Если Параметры.ИмяКнопки = "СформироватьЗадачуВНСИ" Тогда
            
            // Определяем параметры для открытия формы
            ПараметрыФормы = Новый Структура;
            // Здесь можно передать данные из выделенных строк Диадока
            Если Параметры.Свойство("ВыделенныеСтроки") И Параметры.ВыделенныеСтроки.Количество() > 0 Тогда
                ПараметрыФормы.Вставить("ДокументДиадок", Параметры.ВыделенныеСтроки[0]);
            КонецЕсли;
            
            // Теперь мы на клиенте и можем свободно открывать формы
            ОткрытьФорму("Задача.ЗадачаИсполнителя.Форма.ФормаЗадачиБП", ПараметрыФормы);
            
            Возврат Истина; // Сообщаем системе, что событие обработано
            
        КонецЕсли;
        
    КонецЕсли;
    
    Возврат Ложь;
    
КонецФункции

Шаг 4: Дополнительные параметры и контекст

Посмотрим подробнее на структуру Параметры, которая приходит в функцию. Она содержит важные данные о текущем состоянии интерфейса Диадока:

Почему решение может не работать? Разбор типовых ошибок

Если вы все написали, но код «не попадает» в функцию ОбработатьСобытие, проанализируем возможные причины:

  1. Имя формы: Проверьте, что форма называется именно ПодключаемыйМодуль. Ошибка в одной букве сделает форму «невидимой» для основной обработки.
  2. Ключевое слово Экспорт: Функция в модуле формы обязательно должна быть экспортной.
  3. Кэширование: 1С и Диадок могут кэшировать внешние обработки. После внесения изменений в ПМ рекомендуется полностью закрыть окно Диадока, а иногда и перезапустить сеанс 1С.
  4. Версия обработки: Убедитесь, что вы используете актуальную версию основной обработки Контур.Диадок (4.0 и выше), так как в старых версиях механизм работы с клиентскими формами ПМ мог отличаться или отсутствовать.
  5. Имя файла: Хотя это не всегда обязательно, разработчики Контура часто рекомендуют называть файл самого подключаемого модуля ПМ.epf.

Расширенные возможности клиентского модуля

Разберем, что еще мы можем сделать, имея доступ к клиенту через форму ПодключаемыйМодуль. Кроме открытия форм, вам становятся доступны:

1. Интерактивные вопросы:
Вы можете спросить пользователя о подтверждении действия перед тем, как запускать тяжелый серверный процесс.


ПоказатьВопрос(Новый ОписаниеОповещения("ПослеВопроса", ЭтотОбъект), "Вы уверены?", РежимДиалогаВопрос.ДаНет);

2. Работа с файловой системой:
Выбор файлов на диске для последующей загрузки или прикрепления к документам Диадока.

3. Динамическое управление интерфейсом:
Используя событие ПослеОткрытияФормыСписокДокументов, вы можете на клиенте управлять видимостью стандартных элементов управления Диадока в зависимости от прав текущего пользователя или других условий.

Таким образом, использование формы-посредника в подключаемом модуле позволяет обойти ограничения серверного контекста и реализовать полноценный интерактивный интерфейс, интегрированный в экосистему электронного документооборота.

← На главную