Программное изменение управляемых форм

05.03.19

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

При адаптации типовых конфигураций 1С часто приходится изменять в 1С 8 управляемые формы. Такие адаптации сложно потом поддерживать при обновлении. Такие изменения приходится вносить вручную заново, перепроверять корректность изменений в каждом обновлении. И если таких изменений множество, то каждое обновление может представлять серьезные трудозатраты. Есть несколько решений, которые позволяют упростить поддержку и обновление измененных систем 1С. Одно из них – это программное изменение форм. Вести разработку в таком режиме получается немного дольше, чем прямое изменение формы. Но это хорошо компенсируется в дальнейшем при поддержке и обновлении системы 1С. На самом деле ничего сложного в этом нет, просто нужно привыкнуть. Рассмотрим на примерах, как делать доработку управляемых форм кодом в 1С.

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

Согласитесь, обновить доработанную таким образом форму значительно проще, чем вручную сравнивать и вносить все изменения формы при каждом обновлении. Конечно при сильном изменении типовой формы, могут потребоваться правки в процедуре программного дополнения формы, но такие случаи довольно редкие. Если в ходе разработки изменилась типовая структура объекта, то добавлять новые реквизиты на форму нет необходимости. Эти реквизиты будут доступны по пути «Объект.НовыйРеквизит».

Но иногда нужно добавить реквизит формы. Например, «Статус документа», который будет заполняться из специального регистра при открытии формы. Добавить новые реквизиты можно, открыв в 1С табличный документ, управляемая форма изменяется через команду ИзменитьРеквизиты(«ДобавляемыеРеквизиты», «УдаляемыеРеквизиты»).

«ДобавляемыеРеквизиты» и «УдаляемыеРеквизиты» – это массивы с элементами типа «РеквизитФормы». Тут все просто – «Добавляемые» добавляются, «Удаляемые» – удаляются.

Функция РеквизитФормы («ИмяРеквизита», «ТипРеквизита», «Путь», «Заголовок») создает объект типа «РеквизитФормы».

Тут важно понимать, что «ИмяРеквизита» содержит имя без точек. То есть имя без пути реквизита. Если нужно добавить реквизит, например, табличной части объекта, то уже в реквизите «Путь» указать путь к ТЧ реквизита – «Объект.Товары». «ТипРеквизита» задается через объект «ОписаниеТипов». После программного добавления реквизитов на форму нужно добавить элементы на форму или изменить свойства текущих. Для добавления новых элементов на форму есть два метода:

-Элементы.Добавить(«ИмяЭлемента», «ТипЭлемента», «Родитель»).

-Элементы.Вставить(«ИмяЭлемента», «ТипЭлемента», «Родитель», «Элемент»).

«ИмяЭлемента» должно быть уникальным в рамках элементов формы. Лучше добавить какой-то префикс, чтобы не возникло пересечений с типовыми элементами формы.

«ТипЭлемента» имеет не так уж много вариантов. Это «ПолеФормы», «ГруппаФормы», «ДекорацияФормы», «КнопкаФормы» и «ТаблицаФормы». Все остальные свойства назначаются через «Вид» создаваемого элемента. Например, поле с типом булево лучше сделать «флажком», установив вид элементу «ВидПоляФормы.ПолеФлажка».

В свойстве «Родитель» нужно указать группу или таблицу формы, в которую будет входить новый элемент. Также можно добавить элемент непосредственно на управляемую форму без подчинения другим элементам. Для функции вставить дополнительно указывается «Элемент», перед которым будет вставлен новый создаваемый элемент формы. Ну и конечно же, мало просто добавить элементы на форму. Система должна реагировать на действия пользователя с формой.

Для установки событий элементам нужно использовать процедуру УстановитьДействие («ИмяСобытия», «Действие»).

«ИмяСобытия» - имя события, которое нужно отработать. Например, «ПриИзменении», «Очистка», «ОбработкаВыбора» и т.п.

«Действие» - процедура отработки события. Самое главное процедура должна содержать параметры необходимые для выполняемого события. Например, процедура «ПриИзменении» должна иметь параметр «Элемент». Также программно можно задавать прочие доступные свойства новых элементов формы. Например, установить видимость кнопки очистки:

НовыйЭлемент.КнопкаОчистки = Истина;

Получилась вот такая процедура программного заполнения управляемой формы:

 

Код для копирования:

&НаСервере

Процедура КЛ_ДополнитьФормуПрограммно()

МассивРеквизитовФормы = Новый Массив;

//Новый реквизит Товары.КЛ_ЭтоСборка

НовыйРеквизитФормы = Новый РеквизитФормы("КЛ_ЭтоСборка",

           Новый ОписаниеТипов("Булево")

           ,"Объект.Товары"

           ,"Это сборка");

МассивРеквизитовФормы.Добавить(НовыйРеквизитФормы);

//Новый реквизит КЛ_СтатусОбработки

НовыйРеквизитФормы = Новый РеквизитФормы("КЛ_СтатусОбработки",

           Новый ОписаниеТипов("ПеречислениеСсылка.СтатусыДокументовРеализации")

           ,

           ,"Статус обработки");

МассивРеквизитовФормы.Добавить(НовыйРеквизитФормы);

ИзменитьРеквизиты(МассивРеквизитовФормы);

НовыйЭлемент = Элементы.Добавить("КЛ_СтатусОбработки", Тип("ПолеФормы"), Элементы.ГруппаШапкаЛевая);

НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;

НовыйЭлемент.КнопкаОчистки = Истина;

НовыйЭлемент.УстановитьДействие("ПриИзменении","КЛ_ПриИзмененииСтатусаОбработки");

НовыйЭлемент = Элементы.Вставить("КЛ_ЭтоСборка", Тип("ПолеФормы"),Элементы.Товары,Элементы.ТоварыКоличество);

НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;

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

 

#программирование1С #1C

См. также

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

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

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

6000 руб.

16.01.2015    61791    43    59    

80

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

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

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

5000 руб.

14.01.2016    54394    16    21    

42

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

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

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

2400 руб.

29.06.2020    16693    21    4    

35

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

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

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

27.12.2023    10731    750    elcoan    45    

106

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

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

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

2 стартмани

10.04.2023    9604    151    acces969    31    

118

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

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

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

1 стартмани

05.07.2022    3662    kalyaka    2    

27

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

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

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

3600 руб.

29.04.2022    12075    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. androgin 05.03.19 20:18 Сейчас в теме
1) в типовых конфигурациях у объектов (не у всех, но добавить можно!) есть тч ДополнительныеРеквизиты, и форма сама все размещает типовым механизмом.
2) Расширения позволяют создавать свою форму и обновлять ее при изменении основной конфигурации.
Ваш код придется переписывать основательно для некоторого количество реквизитов, которые могут располагаться в разных местах формы, и эти места будут зависеть от типовой формы
2. dandykry 10 06.03.19 07:17 Сейчас в теме
Имеется отдельная библиотека (набор общих модулей), которая имеет программный интерфейс по изменению существующих элементов, их событий, а так же их перемещению, и добавлению реквизитов, команд и элементов. Все это хозяйство еще умеет себя контролировать после обновления.
Скажу, что это не отнимает много процессорного времени и упрощает жизнь)
Есть минусы - разрабатывать и поддерживать труднее, и не все изменения можно сделать программно. Иногда приходится все же править форму в конфигураторе(иногда это даже разумно) или идти через Владивосток.
Все никак руки не дойдут сделать редактор формы в предприятии.
4. Olenevod 33 10.03.19 11:11 Сейчас в теме
(2) А не подскажете, что это за библиотека, где ее взять?
5. dandykry 10 11.03.19 07:18 Сейчас в теме
(4) Самописная. Ее писать не долго, а вот с отладкой придется попотеть. Все однотипно создается. Только типы элементов меняются и их виды.
На инфостарт как -то думал выложить, но передумал. Обрету обязанность сопровождения, а выхлопа скорее всего получу мало. Это не распространено. Чаще людям проще сделать расширение. Оно хотя бы в человеческом виде, хоть и приходится каждый раз его воспроизводить заново при изменении формы. Сравнением/объединением не показывает созданные кодом элементы и реквизиты, поэтому приходится извращаться и проверять кодом что изменилось из критичного.
6. Olenevod 33 11.03.19 21:37 Сейчас в теме
(5)
Сравнением/объединением не показывает созданные кодом элементы и реквизиты

Так оно вроде практически никогда не нужно, если я правильно понял. Плюс всегда можно выводить реквизиты на какую-то отдельную страницу если, например, не была найдена группа (программно) типовая, в которой она располагалась раньше. А вот с расширением сложнее. Я вот до сих пор не могу понять как быть в ситуации когда, например, наворотишь много изменений в одной форме или много форм в одной конфигурации, а потом при значительных изменениях типовой конфы оказывается значительно сложнее проанализировать все изменения и как-то удобно сравнить объединить. Получается даже больше работы.

И с другой стороны, как уже было подмечено, программные изменения влияют на кэширование форм. Приходится искать баланс)
7. dandykry 10 12.03.19 07:49 Сейчас в теме
(6)
значительно сложнее проанализировать все изменения

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

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


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

И с другой стороны, как уже было подмечено, программные изменения влияют на кэширование форм.


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

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

Сейчас это просто 2 общих модуля, которые вызываются из СобытияФорм и СобытияФормКлиент.
Как настанет свободный промежуток, хочу сделать справочник, в котором будут храниться изменения форм (так же с отображением дерева объектов формы, но без сравнений с типовой). Общиймодуль с кэшированием, чтобы вся информация каждый раз не собиралась (Сначала собирается массив всего что нужно сделать с формой, а потом разом все это меняется). Это даст возможность из предприятия добавлять/изменять формы без нужды выгнать всех пользователей (Возможность применить изменения только по субботам 1 час, динамическое обновление не используем потому-что ужасы творит иногда)
И в планах сделать аналог патча. Добавить код, чтобы можно было вызывать определенные процедуры из внешней обработки, в случае косяка в процедуре команды или где-то еще.
Olenevod; +1 Ответить
8. Olenevod 33 12.03.19 09:53 Сейчас в теме
(7) Это была бы просто наипречудеснейшая доработка. В целом если к ней бы еще добавить генератор кода изменения формы (например как здесь https://infostart.ru/public/304736/), то, наверное, можно было бы даже "патчить" в режиме предприятия после обновления на более детальном уровне, я имею ввиду через "Выполнить()".

Про кэш форм знал тоже мало, т.е .как там в кишках платформы все это работает было совершенно непонятно, а до замеров времени дело не доходило. И из осторожности не злоупотреблял этим (по совету 1С). Спасибо, что поделились своим опытом.

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

Из своего опыта: при использовании программных изменений в форме в совокупности с условным оформлением может давать различные и неприятные глюки поведения элементов форм (наблюдалось с табличными частями на платформе 8.3.10.2299 разъезжались как бог на душу положит)
9. dandykry 10 12.03.19 10:31 Сейчас в теме
(8)
генератор кода изменения формы
- как то я это пропустил когда искал нечто похожее. Вообще да, об этой генерации кода я и говорил, и почти такое же дерево получилось,
http://prntscr.com/mwo4y7
тоже самое, только у меня вызов процедур моего общего модуля. Вижу по описанию, что по тем же граблям ходил разработчик (или я по его).

Только в моем случае мне нельзя просто менять свойство, потому что потом я не найду концов и замучаюсь отлаживать.
Для существующих вместо такого:

ЭтаФорма.Элементы.Огранизация.Видимость = Ложь;


У меня

ДействияСЭлементом = Новый Структура("Видимость", Ложь);  // структура с ключами, где ключ это имя изменяемого свойства, значение - новое значение
ИзменитьЭлементФормы(ЭтаФорма, "Огранизация", ДействияСЭлементом); //здесь все проверится и при успехе изменится, при неудаче по-разному, в зависсимости от параметорв формы. Если у формы есть в параметрах особый, то будет ругаться, выделять цветом.



Про кэш форм знал тоже мало, т.е .как там в кишках платформы все это работает было совершенно непонятно


Я не настаиваю на полном изменении формы программно. Только мелочи и средней сложности. Пока что проблем с кэшем формы не встречал.

Из своего опыта: при использовании программных изменений в форме в совокупности с условным оформлением может давать различные и неприятные глюки поведения элементов форм


это только если есть параметр формы, который значит, что это отладочный пуск. В боевой работе это УО не воспроизводится.

наверное, можно было бы даже "патчить" в режиме предприятия


Задумывалось нечто другое. Если, к примеру в константе есть непустая ссылка на справочник внешних отчетов и обработок, то программно подключить эту внешнюю обработку и вызвать из нее некую процедуру или функцию из внешки, а не из конфигурации. Это на случай того, что найден критичный баг. (обновляем базу только в субботу, никак иначе). Эта идея принадлежит не мне, а очень талантливому программисту, моему бывшему коллеге.

P.S
Как раз в планах все эти изменения засунуть в справочник, чтобы не было портянки кода. Так по-проще будет всем я думаю.

ну и если делать коммерческий проект из этого, то я его не потяну. По крайней мере не сейчас. В идеале дождаться, когда в расширении можно будет создавать свои собственные справочники и при этом не нужно будет менять режим совместимости у типовой....и свободное время. Тогда еще можно что-то думать.
3. palsergeich 09.03.19 12:24 Сейчас в теме
Нужно помнить, что чрезмерное увлечение данным механизмом ломает кеш.
Olenevod; +1 Ответить
10. Montirey 19.03.19 09:35 Сейчас в теме
Сам давно использую программное изменение форм типовых конфигураций.

Добавлю свои 5 копеек:
если я правильно понял, то вы все равно снимаете форму с поддержки и вносите изменения в процедуру "ПриСозданииНаСервере".

Существует процедура общего модуля, в которую заходит любая форма при открытии (исключений я не нашел, возможно они есть, но мне не попадались):

ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);

Поэтому при доработке я не трогаю сами формы, а просто добавил в конце процедуры "ПриСозданииНаСервере" общего модуля "ПодключаемыеКоманды" вызов своей процедуры:

// + НТ 14.11.2018. Перехватываем событие формы ПриСозданииНаСервере для программного создания элементов формы
НТ_Вспомогательный_Сервер.СоздатьЭлементПрограммно(Форма);

Ну и дальше уже анализируем, что за форма нам попадала и вносим изменения если они нужны.

Таким образом, если не нужно добавлять обработчики событий для добавляемых программно элементов, то саму форму можно вовсе не трогать.
ubnkfl; BoryaMbi; Andry.Boris; Nowa; +4 Ответить
Оставьте свое сообщение