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

13.09.23

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?]
Расширение для ЗУП, ЗГУ, КА, ERP
.cfe 6,80Kb
46
46 Скачать бесплатно

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

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

 

 

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

 

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

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

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

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

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

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

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

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

 

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

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

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

 

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

 

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

 

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

 

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

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

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

 

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

 

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

 

Dixi.

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

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

См. также

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

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

10000 руб.

02.09.2020    151726    833    397    

841

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

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    20394    59    42    

106

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

OneRPA - платформа роботизации рутинных операций, в основе которой лежит платформа 1С:Предприятие. Данная платформа позволяет использовать современные технологии роботизации, не теряя при этом наработки, которые были созданы в ходе автоматизации. При этом платформа роботизации сохраняет все преимущества платформы 1С: гибкость, кроссплатформенность, мобильный и Web доступ, простоту расширения. Ну и конечно же роботы создаются и сопровождаются простыми специалистами 1С, при этом не обязательно программистами. Self hosted версия

300000 руб.

03.03.2021    14192    12    27    

36

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

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

18000 руб.

06.10.2023    14019    36    7    

69

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Бизнес-аналитик Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:ERP. Управление холдингом Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 руб.

20.08.2024    3903    22    6    

36

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

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

10000 руб.

10.11.2023    9109    33    10    

56

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

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

4800 руб.

14.01.2013    185479    1127    0    

899

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 руб.

07.10.2021    16754    6    29    

42
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. TMV 14 19.02.23 19:36 Сейчас в теме
Неплохо вы общий случай к очень частному свели)
Теперь нужен пример неэскпортной процедуры формы, какого-нибудь расчета в том же ЗУПе.
SuhoffGV; ovasiliev; sandr13; +3 Ответить
5. ixijixi 1904 20.02.23 09:07 Сейчас в теме
(1) У нас есть доступ к форме и в серверном, и в клиентском контекстах. Мы сделать можем вообще всё. Но часто трудозатраты слишком большие, так что указанный способ подойдет не во всех случаях. Надо смотреть конкретный случай.
7. TMV 14 20.02.23 10:35 Сейчас в теме
(5) речь о том, что неэскпортную процедуру вызвать нельзя.
11. ixijixi 1904 20.02.23 12:46 Сейчас в теме
2. Dmitrij-2 47 19.02.23 19:51 Сейчас в теме
Можно заимствовать форму, реквизиты, команды и элементы добавить программно. Удалить из расширения все что перенеслось вместе с формой и проблем с обновлением формы не будет.
3. comptr 35 19.02.23 22:14 Сейчас в теме
(2) Можно после заимствования формы выгрузить её в XML, удалить всё в ветке BaseForm, аналогично удалить всё в ветке Form, главное, чтобы оставшиеся элементы совпадали, и загрузить форму из XML обратно. Получится форма без элементов. Дальше всё делаем только программно.
Насколько я понимаю, решение о том, останется элемент на форме или будет удалён, основано на разнице между ветками BaseForm и Form внутри XML.
4. Mx00 249 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 6897 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 1904 20.02.23 14:58 Сейчас в теме
(12) Да, обсуждение прямо в точку)
14. DemetrKlim 178 20.02.23 17:21 Сейчас в теме
А в чем состоит достижение "не переносить форму объекта в расширение"? Что при этом экономится? В любом случае, при запуске программы произойдет эдакая "компиляция" основной конфигурации со всеми прилагаемыми расширениями и никак не возникнет ситуации, когда в рабочем режиме для какого-то объекта будет "крутиться" несколько его однотипных форм.
Я активно пользуюсь расширениями и мне этот механизм очень нравится. Однако, я в большинстве случаев предпочитаю внести используемый объект в расширение, если уж мне что-то именно в этой форме нужно изменить (добавить). Зато это будет касаться исключительно этой формы. А ради одной формы переписать (даже в режиме "Выполнять После") экспортную процедуру, которую используют десятки остальных форм, заставляя их обязательно пробегать по конструкции "Если", на мой взгляд, не очень продуктивная идея.
Некий опыт работы с расширениями привел меня к выработке вот такого подхода. Если я переношу какой-либо модуль (формы, менеджера, объекта), то в таком перенесенном модуле будут находиться исключительно те процедуры и функции, которые существуют в основной конфигурации. А все необходимые действия, расписанные в собственных процедурах, я размещаю в общем модуле (модулях) расширения.
Объясню - почему так поступаю. Есть высокая вероятность, что внесенное в расширение изменение, удачно будет работать до очередного обновления основной конфигурации. И если в модуле расширения присутствуют только штатные процедуры, сопоставленные с основной конфигурацией, то разбираться и приводить к новому состоянию свой код будет гораздо легче. У меня, во всяком случае, так получается.
15. triviumfan 96 20.02.23 17:54 Сейчас в теме
Не совсем то, статья показывает лишь как добавить подключаемую команду.
Расширение формы тут не в тему.
ЗЫ: ещё заметил, что это своего рода костыль, т.к. это по факту это не подключаемая команда, а команда, добавленная "неправильно", использующая интерфейс подсистемы "подключаемые команды" :)
16. Brawler 458 20.02.23 22:02 Сейчас в теме
Статья хороший пример того как создать головную боль группе разработчиков.
Пара супер модулей.
Десяток разработчиков и каждому нужно что-то править в этих двух супер модулях, начинается война за право захватить модуль в хранилище конфигураций.
Да уж лучше пусть каждый из них формы в расширение тянет и там кодит как ему надо для решения задачи.
Код структурно будет разбит по объектам конфигурации с которыми он связан.
Проще искать, проще осмыслить, проще исправлять.
user1270109; lena8push; DemetrKlim; +3 Ответить
17. mszsuz 332 21.02.23 09:18 Сейчас в теме
Посмотрите, кто ещё не видел, на готовое решение, в котором не нужно заимствовать формы и не нужны вызовы общих модулей - просто добавляете подписки на любые события конфигурации и обрабатываете в своем расширении:
Фреймворк для Расширений и Примеры использования.
18. mikl79 119 21.02.23 13:23 Сейчас в теме
Спасибо, интересное решение.

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

Например, надо для нового или существующего поля закодить ПриИзменении
19. mszsuz 332 22.02.23 10:13 Сейчас в теме
(18) Это не проблема, посмотрите https://infostart.ru/1c/articles/1744951 Пример 2: Перерасчет суммы в табличной части, где пересчитывается Сумма при изменении Количества или Цены. Обработчик события располагается в отдельной обработке, в модуле Подписки.
20. mikl79 119 22.02.23 10:26 Сейчас в теме
(19), посмотрел, у вас получается используется (подменяется) форма обработки вместо формы документа
хитро сделано и сложно
21. mszsuz 332 22.02.23 10:29 Сейчас в теме
(20) Все сложности фреймворк берёт на себя, разработчику остается только добавлять нужные подписки и обрабатывать события.
22. gzharkoj 518 18.03.23 11:37 Сейчас в теме
Зупом почти не занимаюсь, хотел было написать про модули:МодификацияКонфигурацииПереопределяемый, СобытияФормИСКлиент, СобытияФормЛокализация и т.д., но их там нет! в отличии от УТ, КА, ERP - спец модули для локализаций без изменений Форм, не на все случаи жизни, но для очень многого.
23. binx 172 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 1904 12.02.24 16:17 Сейчас в теме
(24) Не ломается. За вызов типового кода отвечает конструкция
ПродолжитьВызов(Форма, Команда, Источник)
VyacheslavShilov; 0x00; +2 Ответить
Оставьте свое сообщение