Как подключить общую команду для нескольких типов документов в расширении 1С?

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

При разработке расширений конфигурации разработчики часто сталкиваются с задачей добавления параметризуемой общей команды, которая должна работать сразу с несколькими типами объектов. Типичный пример — подключение механизма прикрепления файлов или специализированных обработок к документам (например, к документам раздела КУДиР в «1С:Бухгалтерии предприятия 3.0»). Однако при попытке настроить составной тип параметра в общей команде расширения платформа может вести себя некорректно: команда либо не переопределяется в палитре свойств, либо не отображается в пользовательском интерфейсе на конкретных рабочих местах.

Проанализируем причины такого поведения платформы 1С:Предприятие 8.3 и разберем несколько вариантов решения этой задачи — от простого обходного пути до штатной интеграции через механизмы БСП.

Причины проблем при настройке общей команды в расширении

Выясним причину, почему составной тип параметра общей команды может работать нестабильно при вынесении функционала в расширение:

  1. Ограничения состава типов в расширении. Чтобы добавить объект метаданных (документ, справочник) в составной тип параметра общей команды, этот объект обязательно должен быть заимствован в расширение. Если хотя бы один из требуемых документов не заимствован, выбрать его в палитре типов невозможно.
  2. Зависимость свойства «Тип параметра команды» от свойства «Группа». Редактирование параметра команды доступно исключительно тогда, когда в свойстве Группа выбрана группа формы (например, Панель навигации формы или Командная панель формы). Для команд разделов или панели действий параметр команды платформой блокируется.
  3. Особенности и ошибки версий платформы. В линейке 8.3.24 наблюдались ошибки автогенерации интерфейса для параметризуемых команд с составным типом (команда могла не выводиться на типовые формы без их явного заимствования). Начиная с версий 8.3.25 и 8.3.26 механизм внедрения команд расширения в командный интерфейс без изменения самих форм был существенно доработан.
  4. Рассинхронизация версий и локальный кэш. Разница версий между сервером и рабочими станциями пользователей, а также устаревший кэш метаданных тонкого клиента на стороне конкретного пользователя нередко блокируют появление новых команд интерфейса.

Вариант 1. Разделение функционала на отдельные команды (быстрое решение)

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

Разберем по шагам реализацию этого способа:

  1. Создадим в расширении первую общую команду, например, ПрикрепитьФайлыДокумент1.
  2. В свойстве Группа укажем нужную область формы (например, Панель навигации формы.Обычное).
  3. В свойстве Тип параметра команды укажем только один конкретный заимствованный документ (без составного типа).
  4. Создадим вторую общую команду ПрикрепитьФайлыДокумент2 с точно такими же настройками, но в качестве параметра выберем второй заимствованный документ.
  5. Вынесем общий исполняемый алгоритм в отдельный общий модуль расширения, чтобы не дублировать код обработки.

Посмотрим на пример организации обработчика в модуле общей команды расширения:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    // ПараметрКоманды содержит ссылку на конкретный документ
    МодульФайловКлиент.ОткрытьФормуПрикрепленияФайлов(ПараметрКоманды, ПараметрыВыполненияКоманды.Источник);
КонецПроцедуры

Такой подход устраняет конфликт составного типа и гарантирует, что каждая команда надежно привяжется к своему типу документа на любой версии платформы.

Вариант 2. Использование собственного определяемого типа в расширении

Если требуется сохранить единую команду и не дублировать метаданные, рассмотрим более гибкий архитектурный подход. Вместо прямого указания составного типа непосредственно в параметре общей команды воспользуемся определяемым типом.

Разберем по шагам порядок действий:

  1. Заимствуем в расширение оба требуемых документа.
  2. Создадим в расширении новый объект метаданных: ОпределяемыйТип.ВладелецФайловКУДиР.
  3. В палитре свойств созданного определяемого типа укажем нужный составной тип, отметив флажками оба заимствованных документа.
  4. В общей команде расширения в свойстве Тип параметра команды укажем только что созданный ОпределяемыйТипСсылка.ВладелецФайловКУДиР.

Благодаря этому для общей команды тип параметра остается простым (ссылается на один определяемый тип), а вся вариативность состава типов инкапсулируется на уровне метаданных. Это предотвращает ошибки отрисовки динамического интерфейса платформы.

Вариант 3. Штатное подключение через механизмы БСП (для присоединенных файлов)

Если цель доработки заключается в прикреплении файлов к документам в типовой конфигурации («Бухгалтерия предприятия 3.0»), проанализируем штатный способ, заложенный разработчиками Библиотеки стандартных подсистем. При таком подходе создавать собственные общие команды вообще не требуется — БСП выведет типовую команду работы с файлами автоматически.

Разберем по шагам настройку механизма БСП через расширение:

  1. Заимствуем в расширение типовой определяемый тип: ОпределяемыйТип.ВладелецПрисоединенныхФайлов.
  2. Включаем в состав типов заимствованного определяемого типа необходимые документы КУДиР.
  3. Заимствуем в расширение общий модуль ПрисоединенныеФайлыПереопределяемый с установкой признака «Вызывать вместо» или «После» для процедуры определения объектов.
  4. Добавляем типы документов в список подсистемы присоединенных файлов программно.

Посмотрим на пример переопределения в общем модуле расширения:


&После("ПриОпределенииОбъектовСПрисоединеннымиФайлами")
Процедура Расш1_ПриОпределенииОбъектовСПрисоединеннымиФайлами(Список)
    Список.Добавить(Тип("ДокументСсылка.ЗаписьКнигиУчетаДоходовИРасходов"));
    Список.Добавить(Тип("ДокументСсылка.РегистрацияОплатыОсновныхСредствДляУСН"));
КонецПроцедуры

После применения такого расширения типовая команда работы с файлами автоматически появится в панели навигации форм указанных документов без необходимости ручного создания команд интерфейса.

Диагностика окружения и очистка кэша

Если настройки выполнены верно, но на рабочей машине пользователя команда по-прежнему не видна, выполним следующие диагностические действия:

  1. Проверим версии клиента и сервера. Если на сервере установлена версия 8.3.26, а на клиентском компьютере используется тонкий клиент 8.3.24, такое несоответствие приводит к сбоям в передаче схемы командного интерфейса. Необходимо выровнять релизы платформы.
  2. Очистим кэш тонкого клиента. На рабочем месте пользователя завершим работу 1С:Предприятия и удалим содержимое каталогов временных файлов:

    %LocalAppData%\1C\1Cv8

    %AppData%\1C\1Cv8

  3. Проверим видимость команды в настройках формы. В режиме «1С:Предприятие» откроем документ, нажмем Еще — Изменить форму и проверим, включена ли видимость добавленной команды в командной панели или панели навигации.
← На главную