При разработке на платформе 1С часто возникает задача разделить функциональность на несколько независимых блоков с помощью расширений. Это повышает модульность системы и упрощает ее поддержку. Однако сразу встает вопрос: как заставить эти модули "общаться" друг с другом? Например, как из кода в Расширении А открыть форму, которая создана в Расширении Б, или вызвать оттуда какую-либо функцию. Рассмотрим подробно, какими способами это можно реализовать.
Ключевой момент, который нужно понять: в режиме исполнения (когда пользователь работает в программе) платформа 1С "собирает" основную конфигурацию и все подключенные к ней активные расширения в единое целое. Для системы это выглядит как одна большая конфигурация. Это означает, что из одного расширения можно программно обратиться к объектам и методам другого, как если бы они находились в основной конфигурации.
Однако при разработке в стандартном Конфигураторе мы сталкиваемся с ограничениями: он не предоставляет контекстную подсказку и проверку синтаксиса для объектов из "соседних" расширений. Это усложняет написание кода, но не делает его невозможным. Чтобы минимизировать риск ошибок в таких условиях, разработчики часто используют статический анализатор кода проектов, который помогает выявить проблемы еще до запуска системы.
Самый простой и распространенный способ — это прямое обращение к объектам по их полному имени. Разберем по шагам, как это работает для разных сценариев.
Для этого используется стандартная функция ОткрытьФорму(). Главное — правильно указать полное имя формы. Оно строится по шаблону: ИмяРасширения.ТипОбъекта.ИмяОбъекта.Форма.ИмяФормы.
Посмотрим на пример. Допустим, у нас есть РасширениеА и РасширениеБ. В РасширенииБ создан справочник "ДополнительныеМатериалы" с формой элемента "ФормаЭлемента". Чтобы открыть эту форму из кода в РасширенииА, нужно написать:
ОткрытьФорму("РасширениеБ.Справочник.ДополнительныеМатериалы.Форма.ФормаЭлемента");
Система корректно найдет эту форму и откроет ее, несмотря на то, что вызов происходит из другого расширения.
Аналогично можно вызывать функции и процедуры из общих модулей других расширений. Предположим, в РасширенииБ есть общий модуль "РасчетныеМеханизмы" с экспортной функцией РассчитатьДополнительнуюСтоимость(). Вызов из РасширенияА будет выглядеть так:
Результат = РасширениеБ_РасчетныеМеханизмы.РассчитатьДополнительнуюСтоимость(Параметр1, Параметр2);
Важно: убедитесь, что в свойствах общего модуля установлены флаги "Клиент", "Сервер", "Внешнее соединение". Имя модуля при вызове формируется как ИмяРасширения_ИмяМодуля. Для контроля корректности таких вызовов рекомендуется проводить регулярный анализ конфигураций и расширений на наличие ошибок при обращении к экспортным методам — для этого есть архитектурный анализ конфигураций 1С и расширений.
Вы также можете создавать и обрабатывать экземпляры объектов (справочников, документов), определенных в другом расширении. Например, создать новый элемент справочника "ДополнительныеМатериалы" из РасширенияБ:
НовыйМатериал = Справочники.ДополнительныеМатериалы.СоздатьЭлемент();
НовыйМатериал.Наименование = "Новый материал из Расширения А";
НовыйМатериал.Записать();
Платформа найдет менеджер нужного справочника в контексте объединенной конфигурации и выполнит код.
Основной недостаток программного метода при работе в Конфигураторе — отсутствие помощи со стороны IDE. Вы пишете код "вслепую", и об ошибке в имени объекта или метода узнаете только при исполнении. Эту проблему решает современная среда разработки 1C:EDT.
В отличие от Конфигуратора, EDT работает с концепцией проекта. В один проект можно включить основную конфигурацию и все связанные с ней расширения. EDT анализирует метаданные всех этих частей как единое целое. В результате вы получаете полноценную контекстную подсказку и проверку синтаксиса на лету.
Таким образом, если вы планируете серьезную модульную разработку, переход на EDT является крайне рекомендованным шагом. А для более быстрого погружения в возможности среды советуем изучить начало работы в 1С:EDT с использованием ИИ 1С:Напарник, что значительно упростит написание связанного кода — для этого подойдёт инструмент статического анализа кода и метаданных.
В новых версиях платформы появляются более гибкие инструменты для связи расширений, которые позволяют не просто вызывать код, а изменять поведение объектов.
&Вместо, &До, &После.
Эти аннотации позволяют перехватывать вызовы методов модулей, в том числе и тех, что находятся в другом расширении. Например, с помощью аннотации &После в РасширенииА вы можете добавить свою логику к документу из РасширенияБ. Если же ваша задача — оперативно исправить ошибку в расширении, можно использовать конвертер расширения конфигурации в патч для создания быстрого исправления.
Платформа позволяет назначать обработчики событий, расположенные в одном расширении, для элементов управления из другого. Чтобы стандартизировать этот процесс и ускорить написание кода, разработчики часто применяют специальный модуль для программного изменения форм, содержащий вспомогательные функции для добавления элементов и команд.
Несмотря на широкие возможности, беспорядочные вызовы между десятками расширений могут превратить систему в сложный и неподдерживаемый "монолит". Проанализируем, как этого избежать.
Попытка
// Пытаемся получить доступ к общему модулю из другого расширения
МодульБ = ОбщегоНазначения.ОбщийМодуль("РасширениеБ_РасчетныеМеханизмы");
МодульБ.ВыполнитьРасчет();
Исключение
// Обрабатываем ситуацию, если расширение или модуль отключены
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Функциональность из Расширения Б недоступна.";
Сообщение.Сообщить();
КонецПопытки;
Таким образом, платформа 1С предоставляет все необходимые инструменты для создания сложных модульных систем. Главное — использовать их осознанно, выбирая между прямыми вызовами для простых задач и полноценной средой EDT с продуманной архитектурой для крупных проектов.