А1Э_Механизмы - паттерн publisher/subscriber, расширение расширений, БСП без головной боли и прочие вкусности

07.04.21

Разработка - Инструментарий разработчика

Вы хотели бы иметь возможность разработать функциональный блок, а потом подключать его к документам одной строкой кода, без многочисленных вставок в модули и формы? А как насчет возможности доработки расширений другими расширениями? Как насчет возможности создавать механизмы с хуками, на которые смогут подписаться другие разработчики и дополнить их? В нормальных ЯП одним из способов реализации всего этого является паттерн "Издатель/подписчик" (publisher/subscriber, pub/sub). В этой статье мы поговорим о том, как сделать это в 1С.

Бесплатные

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Узнавайте о новых бесплатных решениях в нашей телеграм-группе Инфостарт БЕСПЛАТНО

Наименование Скачано Бесплатно
Менеджер пакетов
.epf 14,81Kb
74 Скачать бесплатно
ПриветМир - простой пример
.cfe 8,32Kb
47 Скачать бесплатно
ПриветМир - пример для пункта 7
.cfe 9,84Kb
44 Скачать бесплатно

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.
 
 Зачем все это?

Эта статья будет выполнена в виде пошаговой инструкции, в рамках которой вы сможете сделать расширение, которое при открытии ЛЮБОЙ карточки (формы элемента) будет выводить сообщение "Привет мир!". Это очень упрощенный пример, но мне он кажется необходимым для понимания того, как все это работает.

ВАЖНО: все нижеописанное работает на конфигурациях на управляемых формах в режиме совместимости 8.3.12 и выше. В продуктивном окружении рекомендуется использовать 8.3.14 для повышения производительности. Установка и выполнение протестированы на конфигурации Бухгалтерия Предприятия 3.0.82.24 на платформе 8.3.18.1289, но должны работать на платформе 8.3.13+ и любой конфигурации, включая самописные.

 

Итак, приступим:

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

2. Откройте её с помощью "Файл - Открыть". В появившемся списке пакетов (расширений) отметьте флажком "А1Э" и нажмите "Установить отмеченные". В результате должно быть выдано сообщение что расширение А1Э соответствующей версии установлено.

 
 Картинка для наглядности
 
 Про А1Э

 А1Э - это доступное по лицензии MIT расширение моей разработки с большим количеством методов, облегчающих жизнь программистам. Само по себе оно не приводит ни к каким изменениям в логике работы системы 1С. А1Э начинает действовать или при вызове функций, или при подключении механизмов (эта статья).

3. Перезайдите в информационную базу. Если база была запущена через веб-соединение, то потребуется отказаться от него и зайти в базу через файловый/клиент-серверный вариант напрямую. Снова откройте менеджер пакетов и перейдите на страницу "Механизмы". Там должна быть надпись "Механизмы готовы к установке." и кнопка "Установить". Нажимаем и ждем - процедура может занять несколько минут. В результате этой процедуры в конфигурации появится расширение А1ЭМ (Экспортные Механизмы).

 
 Картинка для наглядности
 
 Про А1ЭМ

4. На этом подготовка завершена! Пришло время писать код. Откроем конфигуратор, создадим новое расширение и в нем два общих модуля: "Расш1_А1СписокМеханизмов" и "Расш1_ПриветМир" (если не хотите копипастить, можно просто скачать расширение. В код модулей вставим следующее:

Расш1_А1СписокМеханизмов

//Название модуля критично - подстрока А1СписокМеханизмов сообщает механизмам, что в этом модуле объявляются и подключаются механизмы. 
//Положение подстроки некритично, название модуля может содержать произвольный префикс/суффикс.

//Модуль ДОЛЖЕН содержать две функции - "ДобавитьМеханизмы" и "ДобавитьОбъекты", каждая принимает по одному параметру.

Функция ДобавитьМеханизмы(СписокМеханизмов) Экспорт
	//Эта функция добавляет механизм "Расш1_ПриветМир", который по умолчанию располагается в одноименном общем модуле.
	А1Э_Механизмы.Добавить(СписокМеханизмов, "Расш1_ПриветМир");
КонецФункции

Функция ДобавитьОбъекты(СписокОбъектов) Экспорт
	//Эта функция подключает (активирует) механизм для определенного объекта или списка объектов.
	//А1Э_Механизмы.Адресация__ВсеОбъекты() - специальная константа для подключения механизма ко всем объектам системы.
	А1Э_Механизмы.Подключить(СписокОбъектов, А1Э_Механизмы.Адресация__ВсеОбъекты(), "Расш1_ПриветМир");	
КонецФункции

Расш1_ПриветМир 

//Модуль ДОЛЖЕН содержать функцию "НастройкиМеханизма" без параметра, возвращающую структуру настроек механизма.
//Настоятельно рекомендуется получать структуру методом А1Э_Механизмы.НовыйНастройкиМеханизма().
Функция НастройкиМеханизма() Экспорт
	Настройки = А1Э_Механизмы.НовыйНастройкиМеханизма();
	
	//Эта строка кода добавляет обработчик события "ФормаПриСозданииНаСервере", которое возникает в процедуре "ПриСозданииНаСервере" формы.
	//Все обработчики объектов ("ПередЗаписью", "ПриЗаписи", "ОбработкаПроведения" и т.д.) создают события с таким же названием.
	//Все обработчики форм ("ПриСозданииНаСервере", "ПриОткрытии" и т. д.) создают события с префиксом "Форма" перед типовым именем.
	
	//Значение <Истина> означает что обработчик расположен по умолчанию - в том же модуле, что и сам механизм, и имеет название, равное имени события.
	//Если вместо <Истина> указать строку, то механизмы воспримут её как полное имя функции, которая должна быть вызвана.
	Настройки.Обработчики.Вставить("ФормаПриСозданииНаСервере", Истина);
	
	Возврат Настройки;
КонецФункции

//Обработчик события. Должен удовлетворять нескольким требованиям:
//1. Должен быть функцией. Механизмы используют "Вычислить()" для вызова, так как 1С не поддерживает передачу функций как переменных.
//"Выполнить()" не используется т. к. недоступно в веб-клиенте.
//2. Аргументы функции соответствуют аргументам типового обработчика, но первым аргументом всегда выступает объект/форма, вызвавшая события (все остальные сдвинуты соответственно).
Функция ФормаПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
	//А1Э_Формы.ТипФормы(Форма) - удобная функция, позволяющая различить разные формы.
	Если А1Э_Формы.ТипФормы(Форма) <> "ФормаЭлемента" Тогда Возврат Неопределено; КонецЕсли;
	
	Сообщить("Привет, мир!");	
КонецФункции 
5. Применяем изменения и наслаждаемся - все работает. И ни строки кода в модулях формы! 
 
 Скриншот

6. Если Вы хотите использовать механизмы в продуктивной среде, рекомендуется использовать конфигурацию в режиме совместимости 8.3.14+ и установить расширение А1Д (используйте менеджер пакетов). В этом случае перечень механизмов и их обработчиков будет храниться в параметре сеанса, а не в функции с повторным использованием, и не будет перевычисляться каждые 15-20 минут.

7. В анонсе статьи я обещал "БСП без забот". Это несколько выходит за рамки простого примера, но желающих прошу под кат:

 
 Подключаемые команды БСП через А1Э_Механизмы.

 0.1. Эта инструкция рассчитана на то, что у Вас уже есть конфигурация с БСП, и Вы просто хотите подключить крутые фишки из БСП к своим документам. Если вы хотите иметь крутые фишки без БСП, то об этом будет следующая статья.

0.2. Если Ваши документы находятся в расширениях, то А1ЭМ не сможет подключить механизмы к ним. Алгоритм подключения механизмов к метаданным расширений будет описан в последующей статье.

0.3. Мы будем рассматривать подключение функциональности БСП "Подключаемые команды" к справочнику "Календари" ("Графики работы") типовой Бухгалтерии Предприятия.

1. Для начала нужно установить расширение "А1БСП" с помощью менеджера пакетов.

2. В созданное в базовом туториале расширение в функцию Расш1_А1СписокМеханизмов.ДобавитьОбъекты() добавим одну строку:

А1Э_Механизмы.Подключить(СписокОбъектов, "Справочник.Календари", "А1БСП_ПодключаемыеКоманды");

3. Профит! Можно создавать процедуру ДобавитьКомандыПечати, процедуру Печать и все как обычно - кнопки появятся где надо! 

 

Вступайте в нашу телеграмм-группу Инфостарт

Менеджер пакетов механизмы А1 pub/sub паттерн

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    267138    1488    421    

1177

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы, интерфейс 8.5. Может выполнять свертку одновременно в несколько потоков, а также без непосредственного участия пользователя. Решение в Реестре отечественного ПО.

24900 руб.

20.08.2024    74467    377    170    

322

Инструментарий разработчика Нейросети Платные (руб)

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданным 1С, справке синтакс-помощника и проверки синтаксиса.

15250 руб.

25.08.2025    62827    130    36    

136

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм. Обновление версии от 21.04.26

22570 руб.

06.10.2023    39941    112    54    

126

Инструментарий разработчика Разработка Администрирование веб-серверов Системный администратор Программист Бизнес-аналитик Руководитель проекта 1С 8.3 Платные (руб)

Analyzer 1C сводит выгрузку 1С — основную конфигурацию и все расширения — в единый граф знаний. Любой запрос по связям за доли секунды, с пометками «Доб.» / «Заимств.» / «Переопределено». Новое в 2.0 — обновление поставки: сравнение и объединение версий деревом «как в Конфигураторе» с выгрузкой плана решений; поиск конфликтов из-за перехватов расширений и висячих ссылок; загрузка из бинарных .cf/.cfe; циклические зависимости. Плюс анализ влияния, запросы BSL, роли и RLS, граф вызовов. Минута на развёртывание через Docker без необходимости подключения к Интернет. Любая 1С:Предприятие 8.3+.

14000 руб.

17.04.2026    8422    36    45    

51

Инструменты администратора БД Инструментарий разработчика Роли и права Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)

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

17000 руб.

10.11.2023    26292    98    46    

104

Мастера заполнения Поиск данных Инструментарий разработчика Подбор и обработка объектов 1С 8.3 1С 8.5 Платные (руб)

Infostart MagicInput улучшает подбор в полях ввода 1С: ищет по любой части названия и по нескольким ключевым фрагментам, распознаёт ввод в другой раскладке и показывает иконки/статусы объектов прямо в списке. Поддерживает вставку навигационной ссылки/представления документа для автоподбора; для разработчиков доступны поиск по GUID и полному имени предопределённого. Работает в управляемых формах и подключается в большинстве конфигураций 1С 8.3/8.5.

6000 руб.

25.02.2026    4708    16    1    

20

Информационная безопасность Инструменты администратора БД Инструментарий разработчика Учет документов Системный администратор Программист Бизнес-аналитик Бухгалтер Пользователь Руководитель проекта 1С 8.3 1С 8.5 Розничная и сетевая торговля (FMCG) Платные (руб)

Контроль ввода данных в 1С: проверка заполнения реквизитов, обязательные поля, контроль перед записью и проведением, запрет проведения документа. Позволяет настраивать любые проверки данных в 1С 8.3/8.5 от обязательных полей до сложных условий – без открытия конфигуратора и написания кода. Готовое расширение, которое подключается и работает сразу.

6000 руб.

15.04.2026    2500    6    0    

21
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. milkers 3042 07.04.21 12:37 Сейчас в теме
Ставлю плюс за проделанную работу. Но прежде всего хочу напомнить коллегам о безопасности кода. Перед внедрением подобных механизмов придется потратить кучу времени на проверку кода на вредоносные вкрапления. Тем более, что часть кода может подгружаться из внешних источников.
Shmell; RustIG; infosoft-v; +3 Ответить
2. Enigma 313 07.04.21 12:57 Сейчас в теме
(1) На всякий случай сразу уточняю, что все, что скачивается, выложено на githib под открытой лицензией MIT. Можно посмотреть там, или же скачать и открыть в конфигураторе (есть отдельная кнопка).
9. pparshin 530 14.04.21 12:32 Сейчас в теме
(1) Согласен по поводу безопасности. Считаю, что в тексте публикации должны быть предупреждения по поводу загрузки стороннего кода. А на github может быть выложено что угодно. К тому код не "может подгружаться", а подгружается в обязательном порядке в пункте 2.
10. Enigma 313 14.04.21 13:11 Сейчас в теме
(9) Согласен, отредактирую статью с уточнением.
3. noprogrammer 243 12.04.21 09:48 Сейчас в теме
Работа конечно продела очень большая, но, что бы во всем этом разобраться........

Общий модуль "А1Э_Перечисления", внутри модуль:

#Если НЕ Клиент Тогда
Функция ИмяЗначения(ПеречислениеСсылка) Экспорт
ИмяПеречисления = ПеречислениеСсылка.Метаданные().Имя;
ИндексЗначения = Перечисления[ИмяПеречисления].Индекс(ПеречислениеСсылка);
ИмяЗначения = Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления[ИндексЗначения].Имя;
Возврат ИмяЗначения;
КонецФункции
#КонецЕсли



Весь модуль заменяется одной строчкой кода
#Если НЕ Клиент Тогда
Функция ИмяЗначения(ПеречислениеСсылка) Экспорт
Возврат xmlСтрока(ПеречислениеСсылка);
КонецФункции
#КонецЕсли
Alex17; portwein; mozz; AlekseiAdamov; Enigma; NoRazum; +6 Ответить
4. NoRazum 31 12.04.21 10:29 Сейчас в теме
(3)
xmlСтрока


Всегда пользовался первым вариантом.
Благодарю.
Век живи век учись
6. Enigma 313 12.04.21 10:45 Сейчас в теме
(3) Замечу, что приведенный выше код был взят с сайта ИТС. Но я согласен, что Ваш вариант лучше. Исправлю в ближайшей версии.
5. Ambakollajder 12.04.21 10:35 Сейчас в теме
"Все нужное просто, все сложное не нужно." - простым и нужным такое может сделать только платформа 1С, вычислить выполнить, запустить в фоне конфигуратор - все это сложно.
7. itoptimum 24 13.04.21 14:02 Сейчас в теме
На самом деле, данная идея может оказаться полезной для оБСПечевания конфигурации на обычных формах как раз за счет отсутствия многих фишек УФ. Прикручивая последние БСП к обычным формам, приходит в голову подобная мысль.)
8. Enigma 313 13.04.21 15:23 Сейчас в теме
(7) К сожалению, весь существующий код завязан на УФ. Я даже не знаю, возможна ли выгрузка обычных форм в XML, чтобы их можно было программно редактировать.
11. VKislitsin 1055 17.07.22 18:30 Сейчас в теме
Арсений, очень интересный подход. Хотел бы уточнить некоторые детали.
Не понял каким образом происходит публикация событий. Скажем, описанное в примере событие формы ПриСозданииНаСервере().
Скажем, у нас есть расширение А. И есть расширение Б, реализующее некий дополнительный функционал. Необходимо чтобы в формах объектов (выборочных) расширения А появилась кнопка от расширения Б. Не понимаю, каким образом можно вклиниться в событие без добавления в него кода вызова общего модуля.
В статье есть спойлер с текстом:
А1ЭМ генерируется программно (установка включает в себя пакетный запуск конфигуратора), подключается к каждому справочнику/документу и от них публикует в механизмы основные события модулей объектов и модулей форм

Вот как раз хотелось бы понять, что скрывается под словами "подключается к каждому справочнику/документу и от них публикует в механизмы"
Для отправки сообщения требуется регистрация/авторизация