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

Публикация № 1418931

Разработка - Практика программирования

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

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

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

ВАЖНО: все нижеописанное работает на конфигурациях на управляемых формах в режиме совместимости 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. Профит! Можно создавать процедуру ДобавитьКомандыПечати, процедуру Печать и все как обычно - кнопки появятся где надо! 

 

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

Наименование Файл Версия Размер
Менеджер пакетов

.epf 14,81Kb
30
.epf 14,81Kb 30 Скачать бесплатно
ПриветМир - простой пример

.cfe 8,32Kb
22
.cfe 8,32Kb 22 Скачать бесплатно
ПриветМир - пример для пункта 7

.cfe 9,84Kb
21
.cfe 9,84Kb 21 Скачать бесплатно

Специальные предложения

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

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

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



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


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

См. также

Модульная (open source) конфигурация "INFOSTART ERP community edition" Промо

Практика программирования Infostart ERP community v8 1cv8.cf БУ УУ Бесплатно (free)

Учетная модульная конфигурация "INFOSTART ERP community edition" для ведения комплексного учета на предприятии.

31.08.2020    7180    506    33lab    90    

Работа с кодом и его выполнение в режиме 1С: Предприятие (обычные формы)

Практика программирования v8 1cv8.cf Бесплатно (free)

С помощью этой простой обработки теперь можно выполнять код не только в конфигураторе. Код в режиме Предприятия имеет вид как в конфигураторе.

11.03.2021    1416    79    Nik_Name    8    

Вызов демонов в 1С

Практика программирования v8 1cv8.cf Бесплатно (free)

Вызываем демонов прямо из 1С!

28.01.2021    6404    151    the1    30    

Простая конфигурация для заполнения школьного расписания

Практика программирования v8 Россия Бесплатно (free)

Решение задачи контрольной работы.

12.12.2020    1660    36    vova-1c    29    

DaJet Studio: расширенный язык запросов 1С, очереди сообщений и web сервисы Промо

Прочие инструменты разработчика Администрирование СУБД v8 Бесплатно (free)

DaJet Studio - разработка и управление скриптами, хранимыми процедурами и функциями, написанными на расширенном языке запросов 1С, а также очередями сообщений и web сервисами, основанными на использовании Microsoft SQL Server.

10.11.2020    3802    60    zhichkin    13    

Ввод по строке для управляемых форм

Практика программирования v8::УФ 1cv8.cf Россия Бесплатно (free)

Ввод по строке с поиском по номеру телефона и наименованию контрагента с помощью обработчика "АвтоПодбор".

08.10.2020    2098    34    anrahell    1    

Получение ссылки из форматированной строки

Практика программирования v8 Россия Бесплатно (free)

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

05.06.2020    3158    0    VZhulanov    1    

Как сохранить данные табличного поля в табличный документ / файл Excel программно

Практика программирования v8 Бесплатно (free)

Пример сохранения табличного поля в табличный документ не через ПКМ -> Вывести список, с автоподбором ширины по содержимому.

31.05.2020    5027    0    rpashkovsky    15    

Генерация кода управляемой формы (декомпиляция элементов) Промо

Инструментарий разработчика Практика программирования Работа с интерфейсом v8 v8::УФ 1cv8.cf Бесплатно (free)

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

29.09.2014    109949    9101    ekaruk    134    

Загрузка, редактирование и установка цветовых схем (раскраски кода) в Конфигуратор и EDT

Работа с интерфейсом Прочие инструменты разработчика v8 1cv8.cf Бесплатно (free)

В современных IDE и текстовых редакторах есть удобная работа с цветовыми схемами: их можно загружать из файлов, выбирать из списка и сразу устанавливать в оболочку. К сожалению, в Конфигураторе и EDT цвета кода можно настроить только вручную. Этой разработкой хочу исправить эту проблему.

14.05.2020    8956    316    CyberCerber    32    

v77. Робот

Практика программирования v7.7 1cv7.md Россия Бесплатно (free)

Исполнитель Робот. Учебное пособие по программированию для детей дошкольного возраста. Без внешних компонент.

09.04.2012    13359    54    item    18    

Пример работы MiracleV8.dll в режиме Управляемого приложения (тонкий клиент)

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Пример конфигурации Управляемое приложение с использованием MiracleV8.dll

09.04.2012    20907    219    Abadonna    26    

Вывод текста в окно сообщений (Теперь и для 8.2 !!!) Промо

Практика программирования Россия Бесплатно (free)

Позволяет вывести любой текст набранный с клавиатуры в окно сообщений. Теперь работает для любых конфигураций 1с предприятие!!!

29.05.2009    42964    1251    Ёпрст    208    

v77. Тип данных "Месяц"

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Нет такого в 1С типа данных. Но если очень хочется...

12.03.2012    10008    6    item    2    

v77. Закладки в многоуровневом справочнике аля Total Commander

Практика программирования v7.7 1cv7.md Россия Бесплатно (free)

В больших многоуровневых справочниках можно ускорить доступ пользователю к наиболее популярным группам.

09.03.2012    12040    57    item    17    

v77. Паинт

Практика программирования v7.7 1cv7.md Россия Бесплатно (free)

v77. 1С:Паинт :) Такая вот игрушка. Без внешних компонент.

06.03.2012    15809    90    item    38    

Исправление ошибки 1С:Предприятие 7.7/8.0 - 100% загрузка процессора при ожидании блокировки Промо

Практика программирования v8 Россия Бесплатно (free)

Цель использования: разгрузить процессор, когда два или более пользователей пытаются провести документ. 1С пытается заблокировать таблицы, но делает это без пауз, и загружает процессор на 100%. При этом пользователи практически "встают", и нормальная работа прекращается. Компонента (или патч) позволяет решить эту проблему и нормализовать работу пользователей. Особенно актуально при работе в режиме сервера терминалов.

13.12.2007    54224    7759    romix    79    

v77. Как ИспользоватьСубконто

Практика программирования Оборотно-сальдовая ведомость, Анализ счета Оборотно-сальдовая ведомость, Анализ счета v7.7 1cv7.md Россия БУ Бесплатно (free)

Как ИспользоватьСубконто или почему операция - "любимый" инструмент бухгалтера.

05.03.2012    13399    13    item    3    

v77. Календарь на форме.

Практика программирования v7.7 1cv7.md Россия Бесплатно (free)

v77. Календарь на форме. В помощь разработчику.

05.03.2012    12441    73    item    17    

v77. Таблица символов.

Практика программирования v7.7 1cv7.md Россия Бесплатно (free)

v77. Таблица символов. В помощь разработчику.

05.03.2012    17430    195    item    10    

Задача: Программа, выводящая на экран свой исходный код (куайн)

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Программа, выводящая свой исходный код на экран, не пользуясь внешними источниками данных.

27.07.2011    11030    344    archie    17    

Информация по реквизитам объекта метаданных на полную глубину

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Дерево реквизитов объектов метаданных. На всю глубину (т.е. смотрит реквизиты у реквизитов).

10.06.2011    14602    163    kosmo0    5    

Особенности сортировки в 1С:Предприятие 7.7

Практика программирования v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Бесплатно (free)

Подобная "разработка" использовалась для анализа/сравнения порядка индексов таблиц БД в различных СУБД: "родные" DBF, MS SQL, CodeBase 6.5, Advantage 7.x/8.x/9.x. Тогда было выяснено, что в этих СУБД разный порядок сортировки индекса.

29.05.2011    18893    70    hogik    4    

Обработка поиска дублей кода. Исходного кода модулей 1С

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

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

12.04.2011    7472    206    bk-81    37    

[Скрипт] Чтение EXIF данных

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Скрипт на C# для чтения Exif-данных из jpg-файла. Упакован в обработки для 8.1 и 8.2 (управляемые формы)

18.02.2011    23141    282    Душелов    14    

Исполнение кода в модуле формы при разработке в 1С 8.2

Практика программирования Работа с интерфейсом v8 1cv8.cf Россия Бесплатно (free)

Немного теории о новом подходе к программированию форм в 1С 8.2 Рассматриваются директивы компиляции процедур и функций, которые определяются в модуле формы.

15.01.2011    27234    166    1cNike    19    

Запрос против рекурсии или разузлование номенклатуры

Практика программирования Учет ТМЦ Учет ТМЦ v8 КА1 Россия БУ Бесплатно (free)

В задаче "разузлования" номенклатуры в БП 1.6 (2.0) покажем , что запрос более эффективен, чем рекурсия.

23.11.2010    52597    839    Ish_2    258    

Выполнение кода C# из 1С

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Обработка показывает возможности выполнения кода С# из программы 1С.

23.11.2010    12025    251    AlkB    9    

Загрузка справочника в объект FormEx "Дерево+Таблица"

Практика программирования v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Бесплатно (free)

Загрузка справочника в объект FormEx "Дерево+Таблица".

17.11.2010    6350    164    Kot31    7    

Экспорт встроенных XML-схем описаний типов 1С:Предприятия

Обмен через XML Практика программирования v8 1cv8.cf Бесплатно (free)

Экспорт встроенных XML-схем описаний типов 1С:Предприятия

01.11.2010    22549    201    Dmitryiv    7    

ЗиК.300 Загогулина

Практика программирования Зарплата Зарплата v77::Расчет 1С7:ЗиК Россия ФОМС, ПФ, ФСС Бесплатно (free)

В конфигурации ЗиК.300 при использовании при расчетах любого единовременного пособия из соцстраха (рождение, погребение…) - возможна ошибка в своде проводок...

24.08.2010    16820    0    UV2    14    

Конструктор шаблона подобия для строк

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

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

17.08.2010    14000    35    YVolohov    11    

Конструктор "Собери сам"

Практика программирования v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Бесплатно (free)

Создание простого отчета по метаданным конфигурации.

05.08.2010    13586    467    diletant    14    

Организация быстрого подбора

Практика программирования openconf v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Бесплатно (free)

Организация быстрого подбора, что бы отфильтрованные позиции справочника "вылетали" по нажатии символов, причём не важно, в каком позиции начинается слово в названии элемента.

15.06.2010    8328    120    DeAmon2K    13    

Подключение через OLE к базе 1С 77 из 1С 77

Практика программирования 1С7.7<->1C7.7 v7.7 1cv7.md Бесплатно (free)

Пример подключения через OLE к базе 1С 77 из 1С 77

07.05.2010    11367    427    ildareshka    6    

Упаковщик двоичных файлов os7764

Практика программирования v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Бесплатно (free)

Помещает любые файлы (драйвера, внешние компоненты, видеоролики) в конфигурацию или внешнюю обработку и обеспечивает их распаковку.

18.04.2010    15263    208    nafa    27    

Коллекционер - упорядочиваем свои файлы.

Практика программирования Инструментарий разработчика v8 1cv8.cf Россия Бесплатно (free)

Ещё один менеджер обработок - но для разработчика)

09.04.2010    12394    149    Lancelot-2M    5