Расширяем возможности дополнительных обработок и настраиваем их отладку

07.02.24

Разработка - БСП (Библиотека стандартных подсистем)

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

  1. Вывод кастомной кнопки на форму

  2. Добавление новой команды на примере http-сервиса

  3. Удобная отладка дополнительных обработок

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

Но и тут есть ограничения. Например, для вывода кнопки на форму мы можем использовать такие виды обработок: ЗаполнениеОбъектаОтчетПечатнаяФорма и СозданиеСвязанныхОбъектов. Но не можем вывести кастомную кнопку, которая бы говорила пользователю о своем назначении. 

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

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

Версия платформы, на которой ставили эксперименты - 8.3.22.2143.

Версия БСП - 3.1.7.422

Режим совместимости - 8.3.21 

 

Вывод кастомной кнопки на форму

Задача. Реализовать алгоритм отправки табелей из ЗУП на почту ответственным лицам. Надо в форму списка и в форму документа вывести кнопку, на которую будет нажимать пользователь, вследствие чего печатные формы табеля отправятся ответственным лицам для сверки/редактирования.

Мы уже знаем из официальной документации, что вывести кнопку на форму с произвольным алгоритмом мы не можем. А значит, надо создать свой кастомный вид обработки. Для этого выносим в расширение перечисление ВидыДополнительныхОтчетовИОбработок и добавляем туда новое значение ОтправкаОбъектов. Далее выносим в расширение модуль ДополнительныеОтчетыИОбработкиКлиентСервер и добавляем туда функцию

Функция ВидОбработкиОтправкаОбъектов() Экспорт
	Возврат "ОтправкаОбъектов";	
КонецФункции

В сведениях о дополнительной обработке вид обработки и вид команды указываются строковыми значениями. Поэтому нужно написать несколько подобных функций для корректной работы механизмов библиотеки. Выносим в расширение модуль ДополнительныеОтчетыИОбработки и переопределяем метод ПолучитьВидОбработкиПоСтроковомуПредставлениюВида

&Вместо("ПолучитьВидОбработкиПоСтроковомуПредставлениюВида")
Функция РДО_ПолучитьВидОбработкиПоСтроковомуПредставлениюВида(СтроковоеПредставление)
	Если СтроковоеПредставление = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтправкаОбъектов() Тогда
		Возврат Перечисления.ВидыДополнительныхОтчетовИОбработок.ОтправкаОбъектов;		
	Иначе
		Возврат ПродолжитьВызов(СтроковоеПредставление);
	КонецЕсли;
КонецФункции

Тут мы как бы используем аннотацию &Вместо, которую не очень любят. Но в тоже время мы никак не ломаем типовой механизм, мы вызываем типовой метод, если вид обработки не Отправка объектов.

Хорошо, новый вид обработки мы добавили. НО! Эта обработка будет назначаемой. То есть мы в сведениях будем указывать объекты, в которых будет фигурировать наша кнопка. За это отвечает РС НазначениеДополнительныхОбработок.

 
 Их регистр

В ресурсах этого РС указывается, какие обработки, с каким видом, к какому объекту подключены. Для того, чтобы подключить нашу кнопку к объекту, мы также должны добавить сюда ресурс ИспользоватьОтправкуОбъектов. НО! Делать мы этого, конечно, не будем. Не потому что это плохо, а потому, что в расширениях мы не можем менять состав измерений, ресурсов и реквизитов регистров. Для регистрации нашей обработки мы создадим в расширении свой РС

 
 Наш регистр

Измерения можно просто скопировать с типового, а ресурс создаем сами с типом Булево. Теперь заглянем в ММ типового регистра и увидим там метод обновления записей. То есть типовой механизм собирает данные из подключаемой обработки и передает их в этот метод. Нам нужно повторить эти методы в своем регистре и немного их подкорректировать, ведь состав ресурсов у нас совсем другой

 
 Много скопированного кода

Отлично! Мы имитируем поведение типовой, осталось только вызвать наш метод. Метод типового вызывается в справочнике ДополнительныеОтчетыИОбработки в методе ПриЗаписиНазначаемойОбработки. Вынесем этот метод в расширение

&После("ПриЗаписиНазначаемойОбработки")
Процедура РДО_ПриЗаписиНазначаемойОбработки(Отказ)
	Если Отказ ИЛИ НЕ ДополнительныеСвойства.Свойство("СсылкиОбъектовМетаданных") Тогда
		Возврат;
	КонецЕсли;
	
	РегистрыСведений.РДО_НазначениеДополнительныхОбработок.ОбновитьДанныеПоСсылкамОбъектовМетаданных(ДополнительныеСвойства.СсылкиОбъектовМетаданных);
КонецПроцедуры

И вроде все бы ничего. НО! В типовой метод заполнения регистра, и в наш метод заполнения регистра мы передаем одну и ту же коллекцию с назначенными объектами для регистрации. И весь юмор в том, что если у вас есть обработка, например, печатная форма для табеля, и нашу кастомную обработку мы тоже делаем для табеля, то наша обработка не зарегистрируется. А все потому, что в методе ОбновитьДанныеПоСсылкамОбъектовМетаданных регистра есть такая строка

// Регистрация использующихся ссылок для последующей очистки регистра от неиспользуемых.
СсылкиОбъектовМетаданных.Удалить(СсылкиОбъектовМетаданных.Найти(ВыборкаСсылок.ОбъектНазначения));

То есть при регистрации печатной формы из коллекции пропадет ссылка на табель, и мы не сможем его зарегистрировать у себя. А значит, нам надо предварительно скопировать коллекцию объектов и передавать в типовой регистр копию. Для этого переопределим в расширении типовой метод ОбновитьДанныеПоСсылкамОбъектовМетаданных типового регистра НазначениеДополнительныхОбработок  

&Вместо("ОбновитьДанныеПоСсылкамОбъектовМетаданных")
Процедура РДО_ОбновитьДанныеПоСсылкамОбъектовМетаданных(СсылкиОбъектовМетаданных)
	ОбъектыМетаданных = ОбщегоНазначения.СкопироватьРекурсивно(СсылкиОбъектовМетаданных);
	ПродолжитьВызов(ОбъектыМетаданных);
КонецПроцедуры

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

Теперь нам нужно описать вызов нашей команды. Для этого переопределим метод ВыполнитьКомандуВнешнегоОбъекта модуля ДополнительныеОтчетыИОбработки

 
 Много кода

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

Теперь нам нужно создать саму кнопку на форме. Это делается через подключаемые команды, но само описание команды описывается в модуле ДополнительныеОтчетыИОбработки в методе ПриОпределенииКомандПодключенныхКОбъекту. Добавим его в расширение с аннотацией &После 

 
 Много кода

И тут же переопределим код метода ПодключенныеОбъектыМетаданных

 
 Тоже много кода

Это не кнопка для выполнения команды из нашей обработки, это кнопка для открытия окна, в котором мы сможем вызвать команду из нашей обработки. Осталось только добавить в это окно наш тип вызова ОтправкаОбъектов. Для этого нам надо вынести в расширение перечисление СпособыВызоваДополнительныхОбработок из типовой конфигурации . В это перечисление добавить новое значение ОтправкаОбъектов.

И последним штрихом вынести в расширение общую форму ДополнительныеОтчетыИОбработки и написать чуть-чуть кода.

Во-первых, сделать вызов после события ПриСозданииНаСервере.

 
 Много кода

Во-вторых, в этой же форме переопределим метод ЗаполнитьТаблицуОбработок и добавим в него нашу команду.

 
 Еще чуть чуть кода

Ну и наконец, опишем вызов нашего метода.

 
 И еще совсем немного кода

И вот тут стоит обратить внимание на последний вызов в этом методе.

// Вызов сервера только после перехода формы в консистентное состояние.
ПодключитьОбработчикОжидания("ВыполнитьСерверныйМетодОбработки", 0.1, Истина);

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

Все, создаем обработку.

 
 Код дополнительной обработки

Загружаем ее в базу, открываем документ Табель.

 
 Скриншот

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

 

Добавление новой команды на примере http-сервиса

Задача. Сделать обработчик входящих http-запросов через дополнительные обработки.

По аналогии с предыдущим примером, нам надо добавить пару строковых констант в модуль ДополнительныеОтчетыИОбработкиКлиентСервер, который мы уже вынесли в расширение ранее.

Функция ВидОбработкиHTTPСервис() Экспорт  
	Возврат "HTTPСервис";
КонецФункции  

Функция ТипКомандыВызовHTTPСервиса() Экспорт
	Возврат "ВызовHTTPСервиса"; 
КонецФункции

И добавить в перечисление ВидыДополнительныхОтчетовИОбработок значение HTTPСервис, а в перечисление СпособыВызоваДополнительныхОбработок значение ВызовHTTPСервиса.

Потом переопределить функцию ПолучитьВидОбработкиПоСтроковомуПредставлениюВида для возврата вида обработки по строковому значению в модуле ДополнительныеОтчетыИОбработки

&Вместо("ПолучитьВидОбработкиПоСтроковомуПредставлениюВида")
Функция РДО_ПолучитьВидОбработкиПоСтроковомуПредставлениюВида(СтроковоеПредставление)
	Если СтроковоеПредставление = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиHTTPСервис() Тогда
		Возврат Перечисления.ВидыДополнительныхОтчетовИОбработок.HTTPСервис;	
	Иначе
		Возврат ПродолжитьВызов(СтроковоеПредставление);
	КонецЕсли;
КонецФункции 

Теперь оформим вызов команды нашей обработки в модуле ДополнительныеОтчетыИОбработки переопределим метод ВыполнитьКомандуВнешнегоОбъекта.

 
 Много кода

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

Потом я посмотрел на поля, которые мы можем указать в команде:

ТаблицаКоманд = Новый ТаблицаЗначений;
ТаблицаКоманд.Колонки.Добавить("Представление", РеквизитыТабличнойЧасти.Представление.Тип);
ТаблицаКоманд.Колонки.Добавить("Идентификатор", РеквизитыТабличнойЧасти.Идентификатор.Тип);
ТаблицаКоманд.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
ТаблицаКоманд.Колонки.Добавить("ПоказыватьОповещение", РеквизитыТабличнойЧасти.ПоказыватьОповещение.Тип);
ТаблицаКоманд.Колонки.Добавить("Модификатор", РеквизитыТабличнойЧасти.Модификатор.Тип);
ТаблицаКоманд.Колонки.Добавить("Скрыть",      РеквизитыТабличнойЧасти.Скрыть.Тип);
ТаблицаКоманд.Колонки.Добавить("ЗаменяемыеКоманды", РеквизитыТабличнойЧасти.ЗаменяемыеКоманды.Тип); 

И понял, что их не хватает для меня. Я хочу передавать в обработчик метод http-запроса, чтобы я мог в обработке для сервиса написать обработчик, и GET запроса, и POST запроса. Для этого в модуле ДополнительныеОтчетыИОбработки переопределяем метод СведенияОВнешнейОбработке.

 
 Много кода

И добавляем сюда поле метод. Так же нам надо вынести в расширение справочник ДополнительныеОтчетыИОбработки и добавить наше поле в реквизит табличной части с типом строка(20).

 
 Скриншот

И все, доработки закончены. Осталось создать обработку, сам сервис и проверить работу

Создадим такой сервис с корневым URL: test_service и шаблоном /*

 
 Скриншот

Опишем обработку нашего сервиса.

 
 Много кода

Тут мы смотрим на первую часть пути относительного URL, на метод http-запроса, создаем запрос и пытаемся найти по этим данным обработчик. Если обработчик не найден, кидаем ответ 404, если же обработчик мы нашли, отправляем далее вызов в дополнительную обработку.

Пришла пора написать саму обработку.

 
 Код обработки

Подгружаем обработку в базу, публикуем сервис, делаем запросы.

http://domen/basename/hs/test_service/ping

 
 Скриншот

http://domen/basename/hs/test_service/helloworld

 
 Скриншот

или делаем POST запрос к helloworld, передавая в тело запроса JSON.

{"name": "Какое-то имя"}
 
 Скриншот

 

Если вы дочитали до этого момента и у вас не бомбит, не подгорает, вы не поставили минус и не написали в комментах что-то типа "Аффтар выпей йаду", тогда я восхищаюсь вашей здоровой психикой и говорю Спасибо!

На закуску

Удобная отладка дополнительных обработок

Уже давно не в новинку, что можно переопределить метод ПодключитьВнешнююОбработку модуля ДополнительныеОтчетыИОбработки и радоваться подключению обработки из заранее заготовленного файла. Меня в этом методе смущает только одно. Я должен создать папку, положить туда файлик с обработкой, где-то что-то настроить в базе, чтобы отладить обработку, исправить ее и потом опять же руками загрузить эту обработку в базу. Это совсем не для такого ленивого человека, как я. Потому, вот мой рецепт для ленивых.

Переопределяем метод.

 
 Много кода

Как вы можете видеть в коде, тут используется реквизит ПутьДоФайла справочника ДополнительныеОтчетыИОбработки. Этого реквизита в типовом справочнике нет, поэтому добавляем его с типом Строка с неограниченной длиной.

 
 Скриншот

Теперь подумаем о логике. В форме объекта справочника мы точно видим разные режимы работы, и там точно есть отладка. Вот давайте к этой отладке и привяжемся. Для начала, добавим метод с аннотацией после в МО справочника ДополнительныеОтчетыИОбработки

&После("ОбработкаПроверкиЗаполнения")
Процедура РДО_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	Если Публикация = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.РежимОтладки Тогда
		ПроверяемыеРеквизиты.Добавить("ПутьДоФайла");
	КонецЕсли;
КонецПроцедуры

Это чтобы совершенно случайно не искать файл в пустоте.

Потом идем на форму, находим элемент формы Публикация и назначаем ему обработчик события.

 
 Много кода

При установке режима отладки система сама попросит вас указать каталог, куда надо выгрузить обработку. Запишет путь в реквизит справочника, и будет по мере вызова подключать файл обработки. Вы можете открыть этот файл в конфигураторе и ставить там точки остановы, можете редактировать код. После того, как закончите изменения, вы меняете режим на Используется, и система предложит вам автомагически обновить обработку в базе из файла. Все работает само, нам остается только наслаждаться жизнью.

НО! Автор разрабатывает разработки на базе в режиме к-с. У автора сервер приложений находится на удаленной машине. И автор осознал, что тут не все так просто. Если ваш сервер находится на другой машине, значит вам на сервере надо создать расшаренную папку, дать в эту папку доступ себе и пользователю, от чьего имени запущен сервис 1С, и хранить обработки для отладки строго там. Тогда все будет работать как должно.

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

Вот теперь точно все. Всем спасибо за внимание. 

ДополнительныеОбработки http-сервис Отладка Обработки Команды

См. также

БСП (Библиотека стандартных подсистем) Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

04.10.2024    1825    MadRave    11    

23

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Добавим дополнительные свойства в новый документ средствами БСП

02.09.2024    4101    John_d    10    

52

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

Всё больше организаций выбирает для серверов под 1С операционные системы Linux. Одним из отличий систем Windows и Linux является отсутствие COM объектов, которые зачастую использовались для формирования печатных форм офисных документов (Word). Конечно, можно выполнять печать и на клиенте, но есть риск импортозамещения. В работе у меня случались проблемы с зависанием процесса Word, поэтому я не люблю его использовать.

29.07.2024    5350    PROSTO-1C    12    

52

Механизмы типовых конфигураций Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Статистическая выборка сценариев и точек изменения отчетов на общей форме ФормаОтчета в типовых конфигурациях. Примеры кода.

03.06.2024    4884    Serg2000mr    32    

108
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Vasvas05 27 07.02.24 12:36 Сейчас в теме
+ за столько текста))) и работу с http
А почему просто кнопку программно не добавит на форму?
YA_418728146; +1 Ответить
3. YA_418728146 584 08.02.24 10:23 Сейчас в теме
(1)
А почему просто кнопку программно не добавит на форму?


Ну, чисто технически, кнопка на форму добавляется программно :)
А если серьезно, я просто хотел показать еще один способ добавления команд. И я надеюсь, кому-то этот способ будет полезен
4. webester 26 08.02.24 11:04 Сейчас в теме
(3)
Ну, чисто технически, кнопка на форму добавляется программно :)
И я надеюсь, кому-то этот способ будет полезен
Вообще вся возня с БСП интересна. Хорошо бы еще, чтобы модули трогались в которых написано "Переопределяемый". Но ладно запишем в закладочки на будущее
Прикрепленные файлы:
2. Sam13 347 07.02.24 16:55 Сейчас в теме
(1) Здесь описывается универсальный механизм, позволяющий сделать 1 обработку и стандартным БСП-механизмом подключить ее к выбранным документам вообще без кодирования.
Если я все правильно понял.
Идея отличная. Реализация и описание - вообще блеск. Автору респект.
YA_418728146; +1 Ответить
5. artbear 1563 08.02.24 11:28 Сейчас в теме
НО! Автор разрабатывает разработки на базе в режиме к-с. У автора сервер приложений находится на удаленной машине. И автор осознал, что тут не все так просто. Если ваш сервер находится на другой машине, значит вам на сервере надо создать расшаренную папку, дать в эту папку доступ себе и пользователю, от чьего имени запущен сервис 1С, и хранить обработки для отладки строго там. Тогда все будет работать как должно.


вообще давно есть возможность отладки серверного кода внешних файлов даже в клиент-серверной системе.
см. Как поставить точку останова во внешней обработке для отладки? - FAQ Vanessa-ADD

главное - после изменения внешнего файла его нужно на клиенте, просто открыть интерактивно на клиенте с правильного пути на сервере
- и не закрывать
- далее выполнять код, который использует эту внешнюю обработку
7. artbear 1563 08.02.24 11:33 Сейчас в теме
(5) дополню - потом внешнюю обработку нужно создавать через ИмяОбработки, а не по ПутиФайла

в общем, в Ванесса-АДД этот подход давно используется для отладки тестов\кода шагов фич в клиент-серверной системе
8. YA_418728146 584 08.02.24 11:38 Сейчас в теме
(5) Мне кажется этот вариант немного сложнее, чем просто открыть в конфигураторе файл обработки из шары. И тут еще надо интерактивно открывать обработку через файл-открыть. А у моей дополнительной обработки может вообще не быть формы, да и вообще обработка может вызываться только в момент получения http-запроса (как в примере из статьи:))
6. artbear 1563 08.02.24 11:30 Сейчас в теме
(0)
Достаточно просто скачать из гитхаба расширение по этой ссылке.


так ты слона не продашь - свой репозиторий не засветишь )
рекомендую добавить ссылку на репозиторий, а не только ссылку на скачивание файла
9. YA_418728146 584 08.02.24 11:39 Сейчас в теме
(6)
свой репозиторий не засветишь

У меня не было желания показывать свой репозиторий, учитывая что там лежат разные недоделки:) Скорее у меня не было желания выкладывать файл бесплатно тут, потому что тогда моя статья лишается "привилегий" статьи:)
Vasvas05; artbear; +2 Ответить
10. Rotkiv_Vik 1 08.02.24 16:36 Сейчас в теме
Хороший, уникальный и интересный подход.
Хорошо и подробно описана реализация.

Очень понравилось про http и про отладку внешней обработки с авто-обновлением.

Огромный плюс, спасибо за статью.
YA_418728146; +1 Ответить
11. DrZombi 301 08.02.24 21:37 Сейчас в теме
Так и не понял, зачем это все :)))
Новиков; Dragonim; +2 Ответить
Оставьте свое сообщение