Пустая форма объекта в расширении? Форма не нужна!

13.09.23

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

Как в конфигурациях на БСП при создании расширений обойтись без заимствования форм.

Скачать исходный код

Наименование Файл Версия Размер
Расширение для ЗУП, ЗГУ, КА, ERP
.cfe 6,80Kb
44
.cfe 0.0.0.1 6,80Kb 44 Скачать бесплатно

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

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

 

 

В данной публикации я опишу способ, позволяющий это сделать. Оговорюсь, что способ не универсален и не подойдет для решения любой задачи. Но в исходной публикации задачу решает на 100%. Также конфигурация должна быть основана на БСП, а форма, на которую мы хотим повлиять без ее заимствования, должна быть подключена к подсистеме "Подключаемые команды".

 

Итак, поехали.

1. Открываем форму документа и ищем

  • В процедуре ПриСозданииНаСервере обращение к методу общего модуля ПодключаемыеКоманды.ПриСозданииНаСервере()
  • В процедуре Подключаемый_ВыполнитьКоманду к методу общего модуля ПодключаемыеКомандыКлиент.ВыполнитьКоманду().

Если эти два условия соблюдены, то мы можем не заимствовать форму, а обойтись только общими модулями.

2. Заимствуем процедуру ПодключаемыеКоманды.ПриСозданииНаСервере() с аннотацией &После и процедуру ПодключаемыеКомандыКлиент.ВыполнитьКоманду() с аннотацией &Вместо.

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

&После("ПриСозданииНаСервере")
Процедура прПриСозданииНаСервере(Форма, ПараметрыРазмещения)
	
	Если Форма.ИмяФормы = "Документ.НачислениеЗарплаты.Форма.ФормаДокумента" Тогда
		прНачислениеЗарплатыПриСозданииНаСервере(Форма);
	КонецЕсли;
	
КонецПроцедуры

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

 

а в клиентском анализируем вызов команды, и если команда совпадает с нашей добавленной - обрабатываем ее, если нет - продолжаем типовой вызов.

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

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

 

Вот и всё - в выбранную форму добавлены нужные кнопки без заимствования самой формы документа.

 

В конкретном примере удачно совпало, что разработчики сделали метод формы ПерезаполнитьДанныеФормыНаКлиенте экспортным, но даже если бы и не делали, то переносом части кода в общие модули мы бы решили эту задачу.

 

В чем преимущество данного подхода? На мой взгляд, не заимствуя форму, мы страхуем себя от будущих проблем, когда разработчики кардинально изменяют форму и расширение перестает работать. И просто от лишней работы в будущем, когда периодически надо обновлять форму в расширении, чтобы поддерживать актуальность типовой формы. Так же при заимствовании формы мы автоматически тащим в расширение дополнительные данные в виде реквизитов, общих картинок или элементов стиля, которые перегружают расширение (визуально и размером), но не нужны для логики его работы. Указанные общие модули уже устоялись и довольно редко подвергаются изменениям.

 

Если же форма не включена в подсистему "Подключаемые команды", можно рассмотреть варианты перехвата других общих модулей, в зависимости от дорабатываемой конфигурации:

  • УправлениеСвойствами.ПриСозданииНаСервере + УправлениеСвойствамиКлиент.ВыполнитьКоманду
  • СобытияФорм.ПриСозданииНаСервере + СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду
  • РаботаСФайлами.ПриСозданииНаСервере + РаботаСФайламиКлиент.КомандаУправленияПрисоединеннымиФайлами
  • МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере
  • ВерсионированиеОбъектов.ПриСозданииНаСервере

но они, как мне кажется, не так шикарно подходят для подобных целей.

 

Пример рассмотрен на конфигурации Зарплата и кадры государственного учреждения, редакция 3.1.24.310 с версией БСП 3.1.7.275, платформа 8.3.23.1437, но это совсем не принципиально. Приложенное расширение также совместимо с параллельными релизами ЗУП, КА и ERP.

 

Полезные ресурсы:

 

Dixi.

Всем удачного кодинга!

БСП расширения

См. также

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

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

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

10000 руб.

02.09.2020    125066    683    389    

732

Infostart PrintWizard - создание и редактирование печатных форм в 1С 8.3

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

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

18000 руб.

06.10.2023    7796    24    6    

42

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

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

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

10000 руб.

10.11.2023    4297    12    2    

36

SALE! %

PowerTools

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

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

3600 2280 руб.

14.01.2013    178680    1084    0    

862

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

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

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

5000 руб.

07.02.2018    99650    239    97    

298

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

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

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

3000 руб.

27.08.2019    18408    6    8    

40

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

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

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

2400 руб.

24.09.2019    23863    16    15    

33

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

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

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

2040 руб.

27.12.2017    28331    3    10    

16
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. TMV 14 19.02.23 19:36 Сейчас в теме
Неплохо вы общий случай к очень частному свели)
Теперь нужен пример неэскпортной процедуры формы, какого-нибудь расчета в том же ЗУПе.
SuhoffGV; ovasiliev; sandr13; +3 Ответить
5. ixijixi 1796 20.02.23 09:07 Сейчас в теме
(1) У нас есть доступ к форме и в серверном, и в клиентском контекстах. Мы сделать можем вообще всё. Но часто трудозатраты слишком большие, так что указанный способ подойдет не во всех случаях. Надо смотреть конкретный случай.
7. TMV 14 20.02.23 10:35 Сейчас в теме
(5) речь о том, что неэскпортную процедуру вызвать нельзя.
11. ixijixi 1796 20.02.23 12:46 Сейчас в теме
2. Dmitrij-2 45 19.02.23 19:51 Сейчас в теме
Можно заимствовать форму, реквизиты, команды и элементы добавить программно. Удалить из расширения все что перенеслось вместе с формой и проблем с обновлением формы не будет.
3. comptr 31 19.02.23 22:14 Сейчас в теме
(2) Можно после заимствования формы выгрузить её в XML, удалить всё в ветке BaseForm, аналогично удалить всё в ветке Form, главное, чтобы оставшиеся элементы совпадали, и загрузить форму из XML обратно. Получится форма без элементов. Дальше всё делаем только программно.
Насколько я понимаю, решение о том, останется элемент на форме или будет удалён, основано на разнице между ветками BaseForm и Form внутри XML.
4. Mx00 247 19.02.23 23:47 Сейчас в теме
(3) в самом начале есть ссылка на публикацию, где на мой взгляд ещё более красивое решение создания пустой формы, но кому что удобнее :-)
6. dhurricane 20.02.23 10:12 Сейчас в теме
Не согласен с выводом про возможный перехват других модулей. Считаю, что вариант использования "СобытияФорм" более шикарный, т.к. он в отличие от подключаемых команд существует исключительно для реализации описываемой задачи: программная доработка формы. :)
8. 0x00 20.02.23 10:50 Сейчас в теме
(6) Вот только в ЗУПе его нет (
ixijixi; sapervodichka; +2 Ответить
9. sapervodichka 6799 20.02.23 10:58 Сейчас в теме
(6) я за последние 2 года, смотрю в ЕРП, ЗУП, УХ. Именно ПодключаемыеКоманды сейчас распространяются в ПриСозданииНаСервере во всех объектах. Я поэтому с перехвата СобытияФорм, УправлениеСвойствами, ВерсионированиеОбъектов именно на его перехват переориентировался.
ixijixi; VyacheslavShilov; +2 Ответить
10. dhurricane 20.02.23 11:04 Сейчас в теме
(9) Видимо, так и выглядит проф. деформация, когда работаешь последние годы только с ERP и уже не сомневаешься, что СобытияФорм есть везде. :) Согласен, тогда подключаемые команды заметно удобнее.
12. SlavaKron 20.02.23 14:53 Сейчас в теме
Сам подход не нов (тут лет 5 назад обсуждался https://forum.infostart.ru/forum9/topic200166/ ). Но вот как раз с приходом расширений данный подход мне кажется уже не актуальным.
13. ixijixi 1796 20.02.23 14:58 Сейчас в теме
(12) Да, обсуждение прямо в точку)
14. DemetrKlim 158 20.02.23 17:21 Сейчас в теме
А в чем состоит достижение "не переносить форму объекта в расширение"? Что при этом экономится? В любом случае, при запуске программы произойдет эдакая "компиляция" основной конфигурации со всеми прилагаемыми расширениями и никак не возникнет ситуации, когда в рабочем режиме для какого-то объекта будет "крутиться" несколько его однотипных форм.
Я активно пользуюсь расширениями и мне этот механизм очень нравится. Однако, я в большинстве случаев предпочитаю внести используемый объект в расширение, если уж мне что-то именно в этой форме нужно изменить (добавить). Зато это будет касаться исключительно этой формы. А ради одной формы переписать (даже в режиме "Выполнять После") экспортную процедуру, которую используют десятки остальных форм, заставляя их обязательно пробегать по конструкции "Если", на мой взгляд, не очень продуктивная идея.
Некий опыт работы с расширениями привел меня к выработке вот такого подхода. Если я переношу какой-либо модуль (формы, менеджера, объекта), то в таком перенесенном модуле будут находиться исключительно те процедуры и функции, которые существуют в основной конфигурации. А все необходимые действия, расписанные в собственных процедурах, я размещаю в общем модуле (модулях) расширения.
Объясню - почему так поступаю. Есть высокая вероятность, что внесенное в расширение изменение, удачно будет работать до очередного обновления основной конфигурации. И если в модуле расширения присутствуют только штатные процедуры, сопоставленные с основной конфигурацией, то разбираться и приводить к новому состоянию свой код будет гораздо легче. У меня, во всяком случае, так получается.
15. triviumfan 93 20.02.23 17:54 Сейчас в теме
Не совсем то, статья показывает лишь как добавить подключаемую команду.
Расширение формы тут не в тему.
ЗЫ: ещё заметил, что это своего рода костыль, т.к. это по факту это не подключаемая команда, а команда, добавленная "неправильно", использующая интерфейс подсистемы "подключаемые команды" :)
16. Brawler 455 20.02.23 22:02 Сейчас в теме
Статья хороший пример того как создать головную боль группе разработчиков.
Пара супер модулей.
Десяток разработчиков и каждому нужно что-то править в этих двух супер модулях, начинается война за право захватить модуль в хранилище конфигураций.
Да уж лучше пусть каждый из них формы в расширение тянет и там кодит как ему надо для решения задачи.
Код структурно будет разбит по объектам конфигурации с которыми он связан.
Проще искать, проще осмыслить, проще исправлять.
lena8push; DemetrKlim; +2 Ответить
17. mszsuz 323 21.02.23 09:18 Сейчас в теме
Посмотрите, кто ещё не видел, на готовое решение, в котором не нужно заимствовать формы и не нужны вызовы общих модулей - просто добавляете подписки на любые события конфигурации и обрабатываете в своем расширении:
Фреймворк для Расширений и Примеры использования.
18. mikl79 118 21.02.23 13:23 Сейчас в теме
Спасибо, интересное решение.

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

Например, надо для нового или существующего поля закодить ПриИзменении
19. mszsuz 323 22.02.23 10:13 Сейчас в теме
(18) Это не проблема, посмотрите https://infostart.ru/1c/articles/1744951 Пример 2: Перерасчет суммы в табличной части, где пересчитывается Сумма при изменении Количества или Цены. Обработчик события располагается в отдельной обработке, в модуле Подписки.
20. mikl79 118 22.02.23 10:26 Сейчас в теме
(19), посмотрел, у вас получается используется (подменяется) форма обработки вместо формы документа
хитро сделано и сложно
21. mszsuz 323 22.02.23 10:29 Сейчас в теме
(20) Все сложности фреймворк берёт на себя, разработчику остается только добавлять нужные подписки и обрабатывать события.
22. gzharkoj 504 18.03.23 11:37 Сейчас в теме
Зупом почти не занимаюсь, хотел было написать про модули:МодификацияКонфигурацииПереопределяемый, СобытияФормИСКлиент, СобытияФормЛокализация и т.д., но их там нет! в отличии от УТ, КА, ERP - спец модули для локализаций без изменений Форм, не на все случаи жизни, но для очень многого.
23. binx 167 12.07.23 12:38 Сейчас в теме
что касается добавления команд на форму, то в БСП есть механизм добавления собственных типов команд
https://its.1c.ru/db/bsp317doc#content:4:1:issogl3_%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%­B8%D0%B5_%D0%B2%D0%B8%D0%B4%D0%BE%D0%B2_%D0%BF%D0%BE%D0%B4%D­0%BA%D0%BB%D1%8E%D1%87%D0%B0%D0%B5%D0%BC%D1%8B%D1%85_%D0%BA%­D0%BE%D0%BC%D0%B0%D0%BD%D0%B4
С помощью которых можно обойтись без добавления формы в расширении.
24. user1636469 12.02.24 15:12 Сейчас в теме
&Вместо("ВыполнитьКоманду")
Процедура прВыполнитьКоманду(Форма, Команда, Источник)
	
	ИмяКоманды = "прПересчитатьВзносыСотрудника";
	
	Если Команда.Имя = ИмяКоманды Тогда
		прПерезаполнитьДанныеФормыНаКлиенте(Форма);
	Иначе
		ПродолжитьВызов(Форма, Команда, Источник);
	КонецЕсли;
	
КонецПроцедуры
Показать

не понял зачем &Вместо, ломается же типовой функционал?
25. ixijixi 1796 12.02.24 16:17 Сейчас в теме
(24) Не ломается. За вызов типового кода отвечает конструкция
ПродолжитьВызов(Форма, Команда, Источник)
Оставьте свое сообщение