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

07.04.21

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

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

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

Наименование Файл Версия Размер
Менеджер пакетов
.epf 14,81Kb
68
.epf 14,81Kb 68 Скачать бесплатно
ПриветМир - простой пример
.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 паттерн

См. также

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

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

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

12000 руб.

02.09.2020    101654    563    385    

608

Онлайн-интенсив "DevOps для 1С". с 5 февраля по 19 марта 2024 г.

Инструментарий разработчика DevOps и автоматизация разработки DevOps для 1С Платные (руб)

Данный онлайн-курс (интенсив) предусматривает изучение процессов, инструментов и методик DevOps, их применение при разработке на платформе 1С. 

25000 руб.

20.06.2023    11484    3    2    

142

PowerTools

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

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

3600 руб.

14.01.2013    172943    1042    0    

815

Infostart PrintWizard

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

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

18000 руб.

06.10.2023    3493    3    0    

17

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

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

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

10000 руб.

10.11.2023    1381    3    1    

20

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

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

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

5000 руб.

07.02.2018    97573    237    97    

287

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

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

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

2400 руб.

24.09.2019    22375    14    15    

27

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

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

Программист - это человек, непрерывно принимающий решения. Написание кода не является процессом принятия решения - это всего лишь трансляция ваших желаний. Если вас периодически тяготит написание сотен строк кода ради решения задач, то прошу обратить внимание. Данный продукт позволит существенно сократить время на рутинные операции при разработке. За счет библиотечной реализации сокращается объём кода, а его читаемость повышается. К библиотеке прилагается документация API и шаблоны кода для наиболее популярных методов.

4200 руб.

16.04.2021    13834    5    9    

12
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. milkers 2804 07.04.21 12:37 Сейчас в теме
Ставлю плюс за проделанную работу. Но прежде всего хочу напомнить коллегам о безопасности кода. Перед внедрением подобных механизмов придется потратить кучу времени на проверку кода на вредоносные вкрапления. Тем более, что часть кода может подгружаться из внешних источников.
Shmell; RustIG; infosoft-v; +3 Ответить
2. Enigma 305 07.04.21 12:57 Сейчас в теме
(1) На всякий случай сразу уточняю, что все, что скачивается, выложено на githib под открытой лицензией MIT. Можно посмотреть там, или же скачать и открыть в конфигураторе (есть отдельная кнопка).
9. pparshin 493 14.04.21 12:32 Сейчас в теме
(1) Согласен по поводу безопасности. Считаю, что в тексте публикации должны быть предупреждения по поводу загрузки стороннего кода. А на github может быть выложено что угодно. К тому код не "может подгружаться", а подгружается в обязательном порядке в пункте 2.
10. Enigma 305 14.04.21 13:11 Сейчас в теме
(9) Согласен, отредактирую статью с уточнением.
3. noprogrammer 234 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 305 12.04.21 10:45 Сейчас в теме
(3) Замечу, что приведенный выше код был взят с сайта ИТС. Но я согласен, что Ваш вариант лучше. Исправлю в ближайшей версии.
5. Ambakollajder 12.04.21 10:35 Сейчас в теме
"Все нужное просто, все сложное не нужно." - простым и нужным такое может сделать только платформа 1С, вычислить выполнить, запустить в фоне конфигуратор - все это сложно.
7. itoptimum 24 13.04.21 14:02 Сейчас в теме
На самом деле, данная идея может оказаться полезной для оБСПечевания конфигурации на обычных формах как раз за счет отсутствия многих фишек УФ. Прикручивая последние БСП к обычным формам, приходит в голову подобная мысль.)
8. Enigma 305 13.04.21 15:23 Сейчас в теме
(7) К сожалению, весь существующий код завязан на УФ. Я даже не знаю, возможна ли выгрузка обычных форм в XML, чтобы их можно было программно редактировать.
11. VKislitsin 931 17.07.22 18:30 Сейчас в теме
Арсений, очень интересный подход. Хотел бы уточнить некоторые детали.
Не понял каким образом происходит публикация событий. Скажем, описанное в примере событие формы ПриСозданииНаСервере().
Скажем, у нас есть расширение А. И есть расширение Б, реализующее некий дополнительный функционал. Необходимо чтобы в формах объектов (выборочных) расширения А появилась кнопка от расширения Б. Не понимаю, каким образом можно вклиниться в событие без добавления в него кода вызова общего модуля.
В статье есть спойлер с текстом:
А1ЭМ генерируется программно (установка включает в себя пакетный запуск конфигуратора), подключается к каждому справочнику/документу и от них публикует в механизмы основные события модулей объектов и модулей форм

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