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

13.09.23

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

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

Скачать файл

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

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

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

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

 

 

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

 

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

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

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

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

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

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

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

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

 

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

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

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

 

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

 

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

 

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

 

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

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

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

 

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

 

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

 

Dixi.

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

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

См. также

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

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

12000 руб.

02.09.2020    171738    960    403    

924

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

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

8400 руб.

20.08.2024    14293    108    46    

108

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

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

9360 руб.

17.05.2024    27260    96    48    

137

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

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

22200 руб.

06.10.2023    17264    43    15    

75

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

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

15000 руб.

10.11.2023    11888    45    27    

67

SALE! %

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

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

4800 3840 руб.

14.01.2013    191172    1152    0    

920

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

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    1114    2    0    

5

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

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

5000 руб.

07.02.2018    104115    244    100    

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

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

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