Внесение изменения в формы с помощью расширений, без заимствования формы.






При доработке функционала штатных конфигураций часто встает задача по доработке форм, есть разные методики по доработке, направленные на то чтобы упростить в дальнейшем обновление. Что-то мне в этих методиках не нравилось, и я начал пытаться как то упростить их, скорей всего проще они не стали, но все же, решил результатами с вами поделиться. Моя первая попытка, это создание общей формы на которой в пользовательском режиме можно было с помощью конструктора настроить вывод реквизитов (табличных частей) объекта. Реквизиты вывели, захотелось добавить к ним обработчик и т.д., а это уже усложняло конструктор, что подтолкнуло меня к другому подходу. Вторая попытка — это создание новой формы в расширении, что дало .возможность использовать возможности конфигуратора. В обеих попытках используется общая команда расположенная в панели навигации формы, создается иллюзия как будто работаешь с одной формой.

Статья не новая, попытку номер 1 я уже описывал, поэтому очередность в обратном порядке, возможно скоро появится и следующие попытки.

ПОПЫТКА номер 2.

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

#Область ШаблонДополнительнойФормы
МетаданныеОбъекта = Параметры.Ключ.Метаданные();
ПолноеИмяОбъекта  = МетаданныеОбъекта.ПолноеИмя();
СохраненныеНастройки     = РасширениеФорм_ОбщегоНазначения.ЗагрузитьОбщиеНастройки(ПолноеИмяОбъекта);
ОсновнойРеквизитФормы    = РасширениеФорм_ОбщегоНазначения.ПолучитьОсновнойРеквизит(СохраненныеНастройки);
#КонецОбласти

КонецПроцедуры

#Область ШаблонДополнительнойФормы
&НаКлиенте
Процедура Настройка(Команда)

ШаблонЗаголовка = НСтр("ru='Настройка расширения формы'");
ТекстЗаголовка  = ШаблонЗаголовка;
//ТекстЗаголовка = СтрШаблон(ШаблонЗаголовка, ПолноеИмяОбъекта);

ДанныеВладельца = Неопределено;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ПолноеИмяОбъекта",     ПолноеИмяОбъекта);
ПараметрыФормы.Вставить("ЗаголовокФормы",       ТекстЗаголовка);

ДопПараметры = РасширениеФорм_ОбщегоНазначенияКлиент.ПодготовитьПарамтрыУниверсальнойФормы(ВладелецФормы.Параметры.Ключ, ВладелецФормы);

ОповещениеОВыборе = Новый ОписаниеОповещения("ФормаНастройкиПослеВыбора", ЭтаФорма, ДопПараметры);

ОткрытьФорму("ОбщаяФорма.РасширениеФорм_ФормаНастройки",
ПараметрыФормы,
,
,
,
,
ОповещениеОВыборе,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаКлиенте
Процедура ФормаНастройкиПослеВыбора(РезультатВыбора, ДопПараметры) Экспорт

//ЗаполнитьЗначенияСвойств(Параметры, ДопПараметры);
Если РезультатВыбора <> Неопределено Тогда

ИмяФормыРасширения = РасширениеФорм_ОбщегоНазначения.ПолучитьИмяФормы(ДопПараметры);

ОткрытьФорму(ИмяФормыРасширения,
ДопПараметры,
ВладелецФормы,
,
ВладелецФормы.Окно,
ВладелецФормы.НавигационнаяСсылка,
,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)

ПодключитьОбработчикОжидания("ОбновитьДанныеФормыВладельца", 1, Ложь);
ДопПараметры          = РасширениеФорм_ОбщегоНазначенияКлиент.ПодготовитьПарамтрыУниверсальнойФормы(ВладелецФормы.Параметры.Ключ, ВладелецФормы);
ОсновнойРеквизитФормы = РасширениеФорм_ОбщегоНазначенияКлиент.ПодготовитьДанныеФормыВлвдельца(ДопПараметры, ВладелецФормы, ОсновнойРеквизитФормы);

КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДанныеФормыВладельца()

Если Модифицированность Тогда

КопироватьДанныеФормы(Объект, ВладелецФормы[ОсновнойРеквизитФормы]);
ВладелецФормы.Модифицированность = Истина;
Модифицированность = Ложь;

КонецЕсли;

КонецПроцедуры

#КонецОбласти

Пример использования заимствованной формы и формы-шаблона

 

ПОПЫТКА номер 1.

Дополнения от 13.09.2024

  1. Для ТЧ добавлена возможность добавлять, удалять строки.
  2. Добавлена возможность настраивать формы для "Планы видов расчета".
  3. Настройка видимости по пользователям.
  4. Задавать Имя основного реквизита формы основной конфигурации

Краткая инструкция на примере добавленных реквизитов в документ "Поступления на расчетный счет" конфигурации "Бухгалтерия предприятия, редакция 3.0 БИТ.ФИНАНС 3.1"

  1. Добавим расширение. (не знаете как, используйте поиск по сайту)
  2. Настройка расширения под конкретную конфигурацию. Добавляем объекты в расширение и настраиваем общую команду.

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

 

  1. Настройка формы.  Можно добавить реквизиты, стандартные реквизиты, реквизиты ТЧ. (каждый объект настраивается отдельно, настройки сохраняются для всех пользователей)

в результате расширенная форма стала выглядеть так, 

 

При редактировании данные формы расширения переносятся в основную форму. 

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

Если в открытой форме объекта уже была активирована ссылка расширения, изменения в основной форме не отобразятся в расширении, используйте кнопку обновления. 

Важно — имя основного реквизита формы объекта (формы, которую расширяем) обязательно должно быть "Объект".

Предполагаю, что должно работать на любой конфигурации (не проверял), разрабатывал на платформе 1С:Предприятие 8.3 (8.3.13.1809).

Leave a Comment

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