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

07.04.21

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

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

Скачать файлы

Наименование Файл Версия Размер
Менеджер пакетов
.epf 14,81Kb
69
.epf 14,81Kb 69 Скачать бесплатно
ПриветМир - простой пример
.cfe 8,32Kb
46
.cfe 8,32Kb 46 Скачать бесплатно
ПриветМир - пример для пункта 7
.cfe 9,84Kb
42
.cfe 9,84Kb 42 Скачать бесплатно
 
 Зачем все это?

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

ВАЖНО: все нижеописанное работает на конфигурациях на управляемых формах в режиме совместимости 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 паттерн

См. также

SALE! 20%

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

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    121606    670    389    

711

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7261    21    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8000 руб.

10.11.2023    3504    11    1    

33

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

3600 2520 руб.

14.01.2013    177725    1073    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99338    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18102    6    8    

39

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28096    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23595    15    15    

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

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

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



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


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

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