Управляемые формы. Изменение формы списка или формы объекта без внесения изменений в типовые формы (без использования расширений)

12.11.19

Разработка - Работа с интерфейсом

Вносим изменения в типовые формы объектов (документы, справочники, журналы, обработки, общие формы). Не снимая с поддержки эти формы. Создаем программно элементы из общего модуля. Для примера рассмотрю добавление колонки "Скрепка" в форму списка документа. Если к документу привязан файл, то в списке в новой колонке должна отображаться "скрепка".

Часто требуется внести изменения в типовые формы объектов (документов, справочников, журналов, обработок и т.д.)
Есть несколько методов решения этих задач:

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

- Переносить форму в расширение и править там. Тоже просто, но если при обновлении релиза форма поменяется (добавятся новые поля к примеру), то придется еще дорабатывать расширение.

- Создавать элементы формы программно в общем модуле. Проблем с обновлением на новый релиз не будет. Рассмотрим данный метод.

 

В типовых конфигурациях в формах объектов в процедуре ПриСозданииНаСервере есть обращение к общему модулю СобытияФорм.ПриСозданииНаСервере

 

 

Далее идет обращение к общему модулю МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере

 

 

В этом модуле процедура ПриСозданииНаСервере пустая. Тут и добавляем ссылку уже на наш модуль (не типовой модуль). 

Доработка_ФормаПриСозданииНаСервере.ИзменитьФорму 

 

 

В этой процедуре разбиваем формы по объектам и названиям форм.

Для удобства можно добавлять отельные общие модули для каждого объекта.

Доработка_ДокументСчетФактураПолученныйФормаСпискаДокументов

Доработка_ДокументСчетФактураПолученныйФормаДокумента

 

 

Тут редактируем запрос в динамическом списке. Методом СтрЗаменить. Добавляем левое соединение, добавляем новое поле в выборку запроса.

Программно добавляем колонку. ПутьКДанным указываем наша новое поле, которое мы добавили в запрос "Список.Д_ЕстьФайлы".

 
Процедура ПриСозданииНаСервере(Форма, Объект = Неопределено) Экспорт
	
	ДинСписок = Форма.Список;
	
	ТекстЗапроса = 
	"Документ.СчетФактураПолученный КАК ДокументСчетФактураПолученный
	|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НаличиеФайлов КАК НаличиеФайлов
	|	ПО ДокументСчетФактураПолученный.Ссылка = НаличиеФайлов.ОбъектСФайлами";
	
	ДинСписок.ТекстЗапроса = СтрЗаменить(ДинСписок.ТекстЗапроса, "Документ.СчетФактураПолученный КАК ДокументСчетФактураПолученный", ТекстЗапроса);
	
	ТекстЗапроса = "ДокументСчетФактураПолученный.Ссылка,
					|	ВЫБОР
					|		КОГДА НаличиеФайлов.ЕстьФайлы ЕСТЬ NULL ТОГДА 1
					|		КОГДА НаличиеФайлов.ЕстьФайлы ТОГДА 0
					|		ИНАЧЕ 1
					|	КОНЕЦ КАК Д_ЕстьФайлы,";

	ДинСписок.ТекстЗапроса = СтрЗаменить(ДинСписок.ТекстЗапроса, "ДокументСчетФактураПолученный.Ссылка,", ТекстЗапроса);

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

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

 

В результате появляется заполненная колонка.

 

 

Еще для примера приведу добавление "полей ввода" на форму.

 
Процедура ПриСозданииНаСервере(Форма, Объект = Неопределено) Экспорт
	
	//Поле ввода. Реквизит формы
	Реквизит	= Новый РеквизитФормы("Д_ФИОРодительныйПадеж", Новый ОписаниеТипов("Строка"), , "ФИО родительный падеж", Истина);
	мРеквизиты	= Новый Массив;
	мРеквизиты.Добавить(Реквизит);
	Форма.ИзменитьРеквизиты(мРеквизиты);
	НовыйЭлемент = Форма.Элементы.Вставить("Д_ФИОРодительныйПадеж", Тип("ПолеФормы"), Форма.Элементы.ГруппаОсновныеСведения ,Форма.Элементы.ДолжностьПоВизитке);
	НовыйЭлемент.ПутьКДанным = "Д_ФИОРодительныйПадеж";
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ОтметкаНезаполненного = Истина;
	НовыйЭлемент.АвтоОтметкаНезаполненного = Истина;
	
	//Поле ввода. Реквизит объекта
	НовыйЭлемент = Форма.Элементы.Добавить("Д_ДанныеОТранспортировкеИГрузе", Тип("ПолеФормы"), Форма.Элементы.ГруппаДополнительно);
	НовыйЭлемент.ПутьКДанным = "Объект.Д_ДанныеОТранспортировкеИГрузе";
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.Заголовок = "Данные о транспортировке и грузе";
	НовыйЭлемент.РастягиватьПоГоризонтали = Ложь;
	НовыйЭлемент.Ширина = 28;

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

 

Проверял на конфигурации 1С:Комплексная автоматизация 2 

Платформа 1С:Предприятие 8.3 (8.3.13.1644)

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

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

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61699    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

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

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

5000 руб.

14.01.2016    54316    16    21    

42

Управление дашбордами

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

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

2400 руб.

29.06.2020    16623    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10563    745    elcoan    45    

106

Конструктор HTML, CSS и javascript

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

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

2 стартмани

10.04.2023    9485    150    acces969    31    

115

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3577    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12010    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. MikhailDr 12.11.19 13:05 Сейчас в теме
Не знал о такой лазейке. Впрочем точно тот же эффект можно получить при программном изменении формы в расширении.
SedovSU@mail.ru; Vlad_2008; PLAstic; SuhoffGV; improg; +5 Ответить
8. Darklight 32 12.11.19 16:50 Сейчас в теме
(1)Способ из особо хорош, когда нужно массово модифицирвать формы, не влезая в модуль каждой, даже в расширении
13. improg 568 13.11.19 09:34 Сейчас в теме
(1) Конечно, добавить модуль "МодификацияКонфигурацииПереопределяемый" в расширении и писать в &После("ПриСозданииНаСервере") все что нужно. 1) Не нужно настраивать поддержку. 2) При обновлении больше времени на сравнение объединение будет уходить у поставленной на редактирование конфы.
tempa85; Xershi; SuhoffGV; +3 Ответить
2. VmvLer 12.11.19 13:26 Сейчас в теме
Создавать элементы формы программно в общем модуле. Проблем с обновлением на новый релиз не будет

очень спорная мысль. с чего вы решили, что не будет? в последних релизах ЗУП, УТ, ЕРП разрабы так лихо выпиливают таблицы в метаданных и добавляют новые, что упор на модификацию форм посредством кода скорее ущербен, чем удобен.

мне лично проще проверить форму в расширении и "доработать", чем копаться в тонне переопределяемого кода и держать весь этот хламо-код в голове.

дело вкуса и ...лени
Neuroproton; milov.aleksey; +2 Ответить
3. Bassgood 1424 12.11.19 14:17 Сейчас в теме
(2) Не забывайте только что расширения можно применять далеко не во всех конфигурациях - у многих компаний используются конфигурации с режимом совместимости со старыми версиями платформы, при которых использовать расширения либо вообще не получится, либо с рядом ограничений, поэтому такой метод будет еще долгое время востребован
okulus; v3rter; rolin555; +3 Ответить
4. VmvLer 12.11.19 14:26 Сейчас в теме
(3) тс привел пример пример своего ноу-хау с кодом из методов общих модулей в новых конфигурациях.
поэтому я смущен категоричным пиаром программного способа как "высшего" метода
Проблем с обновлением на новый релиз не будет


к чему тс было балаболить о том, что весьма условно?
а так да, все относительно и я же написал
дело вкуса и ...лени
5. Bassgood 1424 12.11.19 16:12 Сейчас в теме
Ну фраза
Проблем с обновлением на новый релиз не будет
также относится и к расширениям - никакой гарантии ни то, ни другое не дает, что после обновления системы на новый релиз что-то из этого не перестанет работать - плюс расширения будет конечно в том, что исправить это можно будет более оперативнее и менее заметно для пользователей. В данном случае, думаю, автор имел в виду что при обновлении не потребуется "мержить" между собой много кода модифицированных модулей.
Olenevod; +1 Ответить
7. Darklight 32 12.11.19 16:49 Сейчас в теме
(3)Так там и БСП будет более ранних версий - где таких общих функций может и не быть вовсе, или их применение в формах тоже будет сведено к минимуму - так что большинство форм не будет их вызывать!
10. Bassgood 1424 12.11.19 17:48 Сейчас в теме
(7) Такие вызовы общих модулей используются уже с БСП 2, конечно не в таком специальном виде как в публикации через общие модули "СобытияФорм", но в подавляющем большинстве форм имеются вызовы общих модулей других подсистем (например, "версионирование данных", "доп. отчетов и обработок"), которые в принципе можно использовать по аналогии с описанным способом - в них также доступен контекст вызываемой формы (вроде что-то похожее использовалось даже в УТ 10).
В принципе все это решается еще проще - созданием подписки на событие получения формы менеджеров всех объектов, в которой можно переопределить поведение всех необходимых форм объектов.
11. Darklight 32 12.11.19 18:01 Сейчас в теме
(10)
событие получения формы менеджеров всех объектов, в которой можно переопределить поведение всех необходимых форм объектов.

Вот тут подробнее. Сколько не смотрел я это событие - так ничего толкового из него не вынес - событие срабатывает в серверном контексте, причём контекст объекта формы не доступен - максимум что там можно - только подменить один путь к форме на другой (читай одно имя вызова формы, другим) - и всё :-( фигня фигней - конечно в ряде случаев может быть полезно - когда Вы делаете свою форму - то её можно насильно подсовывать вместо других - анализируя путь исходного вызова формы. Но менять именно саму форму в этом событии совсем нельзя!
12. Bassgood 1424 12.11.19 18:20 Сейчас в теме
(11) Вы правы, поработать с формой через подписку не получится, погорячился, а жаль ;(
15. Xershi 1473 13.11.19 21:24 Сейчас в теме
(3) три года назад поднимали совместимость с 8.1 на 8.2. А затем я поднял последовательно до 8.3.5. Тогда только 8.3.8 еще была.
Пару дней работы и все переписано грубо говоря, так что долго это наверно пока УПП поддерживается, КА уже сдулось. Пару лет и никто про это не вспомнит!
16. Bassgood 1424 13.11.19 21:53 Сейчас в теме
(15) Далеко не все хотят возиться с доработками (или же это нецелесообразно в краткосрочной перспективе, или же не хватает соответствующей компетенции), необходимыми для отключения в конфигурации режима совместимости со старыми версиями платформы, бывает это даже связано с тем, что у специалиста нет понимания и уверенности в том, что конфа будет работать также стабильно и без "глюков" как и до отключения совместимости, так что думаю в старых конфах этот метод просуществует еще долго.
17. Xershi 1473 13.11.19 22:31 Сейчас в теме
(16) а по поводу статьи. Давно была статья, как вести доработку в типовых. Просто наверно про нее уже забыли. А тут лишь кусочек, единственное чуть больше примеров как писать этот код. Но в книжке разработчика все написано и так.
Bassgood; +1 Ответить
6. Darklight 32 12.11.19 16:48 Сейчас в теме
Давно пользуюсь подобной лазейкой. Но, как универсальное решение данный способ, увы, не подходит.

Общий модуль "СобытияФорм" есть даже далеко не во всех типовых конфигурациях на УФ (он не входит в состав БСП), и даже там где есть -
не везде вызывается из форм. В итоге приходится вклинивать функцию редактирования формы сразу в несколько разных обработчиков (в основном из модулей БСП, но и в некоторые специфичные для конкретной конфигурации и раздела учета - например для бухгалтерского учета). И делать проверку - обработана форма уже или ещё нет - т.к. в некоторых формах разные обработчики могу вызывать повторно. Это всё я уже реализую в опубликованном тут моём решении.

Но, это всё более менее хорошо до тех пор, пока в формах такие обработчики вызываются - но есть формы - где они вовсе не вызываются. Да есть и просто автогенерируемые формы - там вообще ничего такого не вызывается и не будет вызываться (и расширения не помогут) пока такую форму не создашь физически в конфигураторе.

Ну и главное - такая модификация элементов форм работает ровно до момент, пока не нужно связывать с программно добавленными элементами обработчики событий - вот тут наступает полная трабла - т.к. обработчик события можно назначить только из модуля формы ("спасибо" ужасное фирме 1С за такое ограничение).

Правда при размещени кнопок, имеющих внешние обработчики ещё как-то можно бороться (как типвыми так и не типовыми способами - смотря что доступно в форме) - об этом у меня есть в планах желание написать статью, а публикация, фактически использующая данную технику - уже на подходе.

То, вот, с обработчиками таких событий как, например, "ПриИзменении" или "ОбработкаВыбора" - вот тут беда.... без модификации формы или применения расширений - никак не обойтись!
triviumfan; 7OH; +2 Ответить
9. TMV 14 12.11.19 16:53 Сейчас в теме
Ничего нового - постоянно так делаю, с той лишь разницей, что весь код именно в расширении, а конфа на замке (разумеется, если есть возможность использования расширений).
Отмечу лишь, что не во всех формах есть подходящие под это дело процедуры общих модулей и вот тогда приходится все таки добавлять в расширение форму.
14. vakorp 13.11.19 15:14 Сейчас в теме
В типовых конфигурациях в формах объектов в процедуре ПриСозданииНаСервере есть обращение к общему модулю СобытияФорм.ПриСозданииНаСервере


Не во всех конфигурациях он есть, в БУХ 3.0 и ЗУП 3.1 такого модуля нет.
dock; Ted1982; Bassgood; +3 Ответить
18. nnafanail 18 14.11.19 10:59 Сейчас в теме
Предпочитаю вносить изменения в конфигурацию. Каждый раз при обновлении приходиться восстанавливать свои изменения (если обновление затронуло их). Зато гарантированно держу полный контроль - где надо проверить корректную работоспособность, где не надо.
А при использовании расширений и описанной здесь методики надо вести актуальный Чек-лист, что бы после каждого обновления прогнать по нему тестирование.
defini; SpaceCowboy; DedMoroz1983; Olenevod; +4 Ответить
19. DedMoroz1983 2 18.11.19 08:46 Сейчас в теме
(18) так точно, всегда надо обдумывать, что в расширение пихать, а что лучше в конфе изменить.
20. Andrefan 18.11.19 09:42 Сейчас в теме
(0) С появлением схемы запроса доработка динамических списков при помощи этого объекта выглядит намного стабильнее и универсальнее, чем через конкатенацию в тексте запроса.
21. triviumfan 91 18.11.19 22:27 Сейчас в теме
Такой баян что я... на дворе конец 2019 года, а тут статья про переопределение события форм... жесть.
romankoav; +1 Ответить
22. vic777tor 23.11.19 11:46 Сейчас в теме
Утверждать что этот метод самый лучший и универсальный я бы не стал :)
К примеру, попробуйте добавить таким способом обработчик события для добавленного элемента формы не "снимая с поддержки" эту форму.
Как вариант, безусловно заслуживает внимания, но есть ряд недостатков (на мой взгляд), основной среди которых - отсутствие наглядности.
Представьте что таких элементов на форму потребовалось добавить не один, а несколько и даже несколько десятков, а также что при этом необходимо перегруппировать существующие элементы формы. Разобраться в таком коде будет очень сложно. В случае же использования расширения, либо создания отдельной формы это сделать намного проще.
Указанный же способ в основном я использую для изменения доступностью и видимостью элементов формы.
Это как в медицине - для каждой болезни свой метод лечения. Универсального же лекарства не существует и вряд ли будет создано в будущем :)
Suxar; iiceberg; +2 Ответить
25. iiceberg 92 08.06.21 14:14 Сейчас в теме
(22)
соб в основном я использую для изменения доступностью и видимостью элем


Поддерживаю.
Еще добавлю от себя.. Когда на форме размещается больше 10 реквизитов программно, то время открытия сильно растет.
Так же не забываем, что программно добавленные реквизиты и элементы формы не кэшируются.. и это нагрузка на камень.
Перемещение реквизитов - тоже перерисовка формы...

ЗЫ;
Для себя решил пользовать модуль Дмитрия Котова "[Общий модуль] Динамическое формирование интерфейса"
https://infostart.ru/1c/articles/1284403/
Компактный код формирования формы, удобство создания, отлично оформлены вызовы функций...
23. Ali1976 14 27.12.19 10:12 Сейчас в теме
Сейчас гораздо проще сделать в расширении, хотя наверно смысл есть только для важных с точки зрения логики доработок, т.к. расширение можно отключить, или само отключится при обновлении...
24. Stivens 35 23.05.20 11:48 Сейчас в теме
Не все так просто. Для существующих объектов 1С часто пишут обработки в "ПриЧтении...", и там обращаются к реквизитам, а их еще нет, т.к. "При создании..," выполняется после...
26. user1738957 27.12.22 12:59 Сейчас в теме
Ребята, а какие в этом плюсы?
27. John_d 5204 27.12.22 14:34 Сейчас в теме
(26) не редактировать формы которые стоят на поддержке
28. user1738957 27.12.22 14:49 Сейчас в теме
(27) Так расширение тоже позволяет это делать, какой тогда смысл этого?
29. John_d 5204 27.12.22 15:11 Сейчас в теме
(28) после обновления на новый релиз, если сильно поменялась форма, тогда придется переделывать расширение
30. user1731854 25.08.23 16:13 Сейчас в теме
Статья понравилась. Пока в ней разбирался посмотрел Демонстрационную конфигурацию "Управляемое приложение", версия 1.0.37.2. Скачать можно тут: https://its.1c.ru/db/metod8dev/content/5028/hdoc. В этой конфигурации ФормаСписка справочника Товары при открытии динамически меняется (в нее подставляется колонка "Цвет"). Хотел посмотреть как это реализовано в этой конфигурации. Но так и не нашел это место. Поскольку я начинающий, то это не удивительно. Может быть кто-то из опытных коллег поможет с этим разобраться?
31. Jdeeps 25.09.23 15:14 Сейчас в теме
(30)Цвет тянется из видов характеристик.
Оставьте свое сообщение