1с добавить реквизит на форму программно
Введение в управляемая форма 1С реквизиты элементы команды
Рекомендуется модифицировать управляемые формы типового решения 1С программно для удобного будущего обновления и исключения конфликтов, а также для удобной работы с изменениями и надежности при использовании механизма расширений.
В некоторых типовых конфигурациях 1С (ЕРП 2, УТ 11) используется механизм упрощенного изменения конфигурации. Статьи о типовом механизме можно найти в разделе полезных ссылок. Данный механизм используется в БСП, и его необходимо знать при модификации типовых конфигураций.
При добавлении элементов на форму программно можно отредактировать практически любое свойство из панель свойств, которое можно установить вручную в конфигураторе.
Также все описанные в текущем разделе процедуры и функции находятся во внешней обработке УпрФормы.
Примеры работы с объектом «ДанныеФормыКоллекция» и созданием дин. списка и таблицы значений программно можно будет посмотреть в части 2.
Для запуска обработки в режиме предприятия необходимо наличие объектов «Справочники.Номенклатура», подчиненный ему «Справочники.ХарактеристикиНоменклатуры» и «РегистрыСведений.ЦеныНоменклатуры”.
Программное переопределение обработчиков событий формы и элементов формы
Переопределить обработчики событий формы можно в обработчике «ПриСозданииНаСервере» (кроме самого обрабочика «ПриСозданииНаСервере») или в теле модуля формы в контексте сервера (например, Переопределение событий ПриЧтениинаСервере и ПриСозданииНаСервере).
В теле модуля формы:
А в новой процедуре нужно добавить вызов основной, если такая процедура есть.
Аналогично можно поступить и с обработчиками элементов формы:
Программное создание групп формы.
Доступные виды групп формы:
Программное добавление команды на форму.
Удалить команду можно при помощи метода коллекции формы команд: Команды.Удалить(). Удалять можно только те команды, которые были созданы программно.
Программное создание декораций форм.
Программное добавление реквизита на форму.
Добавлять новые реквизиты в управляемую форму и удалять необходимо с помощью метода ИзменитьРеквизиты(), куда в параметры передается массив добавляемых реквизитов и массив удаляемых. Удалять при этом можно только те реквизиты, которые были созданы программно.
Вывод реквизитов на форму.
Вызов процедур при создании на сервере 1С
После описания всех процедур выводим их в процедуре ПриСозданииНаСервере. Также можно изменить программно некоторые свойства формы, например, заголовок. Чтобы был виден только наш заголовок, нужно отключить свойство Автозаголовок.
Некоторые советы при программном редактировании формы
- Если вы не используете префиксы при создании новых команд и элементов рекомендуется проверять существование создаваемых объектов по имени с помощью метода Найти(), который вернет Неопределено, если объект в коллекции не найден:
- Элементы.Найти(«пр_Владелец»);
- Команды.Найти(«пр_НоваяКоманда»);
- Свойства, методы и коллекции управляемой формы описаны в синтакс-помощнике в разделе «Интерфейс (управляемый)»;
- Изучите БСП, если она имеется в вашей конфигурации. Например в общем модуле «ОбщегоНазначения» уже описаны функции для создания объекта ОписаниеТипов, необходимого при создании новых реквизитов на форме:
- ОбщегоНазначения.ОписаниеТипаСтрока(ДлинаСтроки) — Создает объект ОписаниеТипов, содержащий тип Строка;
- ОбщегоНазначения.ОписаниеТипаЧисло(Разрядность, РазрядностьДробнойЧасти = 0, ЗнакЧисла = Неопределено) — Создает объект ОписаниеТипов, содержащий тип Число;
- ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты) — Создает объект ОписаниеТипов, содержащий тип Дата;
- ОбщегоНазначенияВызовСервера.ЦветСтиля(ИмяЦветаСтиля) — Функция получает цвет стиля по имени элемента стиля;
- ОбщегоНазначенияВызовСервера.ШрифтСтиля(ИмяШрифтаСтиля) — Функция получает шрифт стиля по имени элемента стиля.
Итак, взглянем на получившийся результат. Все элементы на форме созданы программно:
В ЗУП 3 возникла задача добавить реквизит в справочник не внося изменений в конфигурацию. БСП с механизмом дополнительных реквизитов использовать было нежелательно, поэтому был использован механизм расширений. Для вывода данного реквизита на форму добавлять саму форму в расширение не хотелось по ряду причин, описанных ниже. Создание реквизита и элемента формы, соответствующего данному реквизиту было решено сделать программно в самом расширении, следуя принципу минимального воздействия на конфигурацию.
Начиная с платформы 1С версии 8.3.12 и выше появилась возможность добавлять реквизиты объектов в расширениях, чем я и воспользовался:
Но для вывода данного реквизита на форму элемента добавлять саму форму в расширение совсем не хотелось.
Во-первых добавление (заимствование) формы в расширение может привести к некоторым нежелательным эффектам, которые могут возникнуть после обновления конфигурации. Приведем немного теории.
Платформа использует сразу три формы:
- Форму из основной конфигурации
- Сохраненную форму
- Форму из расширения
Данные формы взаимодействуют между собой и в результате такого взаимодействия получается Результирующая форма, которую видит пользователь. В ходе взаимодействия указанных форм может возникнуть нежелательная ситуация, например, мы доработали форму в расширении, потом в новом релизе добавились реквизиты и они на форме не отображаются! Более подробно тут.
Во-вторых добавление формы в расширение привело бы к автоматическому добавлению всех реквизитов этого объекта и объектов метаданных (соответствующих ссылочным типам реквизитов объекта) в данное расширение, что загромождало бы само расширение и также не желательно.
Поэтому возникла задача программного создания элемента формы для добавленного реквизита в самом расширении, этому и посвящена данная публикация.
Посмотрев начало процедуры ПриСозданииНаСервере() модуля формы объекта, видим что вызываются экспортные методы ПриСозданииНаСервере() общих модулей подсистем БСП:
Было принято решение код для программного добавления реквизита формы объекта добавить в метод ПриСозданииНаСервере() общего модуля УправлениеСвойствами. Данный модуль предназначен для работы с дополнительными реквизитами и сведениями, но переопределив его в расширении он вполне сгодится и для наших целей.
Добавляем общий модуль УправлениеСвойствами в наше расширение:
и создаем обработчик события НП_ПриСозданииНаСервере(), вызываемый после типовой процедуры УправлениеСвойствами.ПриСозданииНаСервере().
Ниже приведен готовый код, код снабжен комментариями и разбит на области для лучшего понимания:
Обработка тестировалась на релизе платформы 8.3.13.1513.
Специальные предложения
полезные данные! удобно сразу все собрано в одном месте
для добавление реквизитов с помощью расширений очень удобноСмысл добавлять реквизиты и элементы программно, если обработчики для них нужно прописывать в коде формы.
Было бы больше пользы - если бы показали "типовые приемы" обработки событий программно добавленных элементов.(1) Смысл в том что элементы формы могут "слететь" при обновлении конфигурации. А если их задавать программно, то объединение кода намного проще, особенно если пользоваться KDiff например.
Я давно перешел на такой способ добавления реквизитов на форму (в шапки документа, в табличную часть). Правда основной кусок кода выносится в Общие модули.(2)Согласен. Пришел к этому опытным путем.
Тоже элементы добавляю программно. При сравнении-объединении сразу видны изменения. И не нужно потом еще форму руками менять.(1) В примере добавления поля ввода, показано добавление обработчика
/Можно добавить обработчик события
//См. синтакс-помощник чтобы узнать список событий
// Интерфейс (управляемый) -> Поле формы -> ПолеФормы -> События
// а так же остальные варианты расширения поля формы в зависимости от вида кнопки
// Интерфейс (управляемый) -> Поле формы -> Расширение поля ввода -> События
// и прочее
ПолеВвода.УстановитьДействие(
"ПриИзменении", //Имя события
"ПриИзмененииКомментария"); //Имя процедуры обработчика(3) Как добавить обработчик не расположенный в форме? В тех случаях когда я из внешней (по отношению к форме) части программы хочу добавить кнопку или поле ввода. Насколько я знаю (могу и ошибаться) назначить обработчик можно только расположенный в модуле формы. А значит надо исполнять "танцы с бубном" по вызову своих обработчиков (расположенных например в общем модуле) из обработчиков расположенных на форме. И тут получается несостыковочка. Вроде бы форму можно полностью построить программно. Но не полностью . т.к. обработчики должны быть в форме заранее.
Если есть какой-то способ обойти это "ограничение" - буду рад если поделитесь со мной.
(1) в современных конфигурациях, про обработчики уже позаботились. В формах есть подключаемая процедурка
Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
которая ведет в общий модуль СобытияФормКлиент.ВыполнитьПереопределяемуюКомандуТам в свою очередь, есть вызов ОбщегоМодуля МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры);
где по имени команды и формы, можно определить свою, и напилить свои обработчики.
В итоге, получим абсолютно неизмененный объект, на поддержке. но в нем, программно добавленная кнопка и свой обработчик событий.
единственное, что у некоторых элементов параметров, предполагается много. и они как бы будут недоступны..но тут приходится или маневры искать, или немного усовершенствовать.. но в простых случаях, вполне себе все решаемо(4) Так-то оно так. Если дело касается добавления какой-нибудь "некузявой" кнопочки, или чего-то незначительно-дополняющего функциональность формы или объекта который форма представляет.
Но если копнуть глубже, и рассматривать некую систему в которой есть оснастка, в которую разные модули (подсистемы) добавляют нужные им элементы управления (списки, диаграммы, таблицы со связью один ко многим и т.п.). Да еще и замахнуться на механику, когда пользователь сам решает какие модули и подсистемы ему нужны. Другими словами, разработать решение в стиле "плагинов" как во всяких там WinAmp-ах и прочих модных штуках. И тут получается нужно в форме-оснастке предусмотреть все возможные типы событий (который на ИТС кстати рекомендуют обрамлять префиксом "Подключаемый_"), а потом еще и у этих событий предусмотреть модель поведения когда нужны: а) только клиентские вызовы, б) клиентские и внеконтекстные сервеные, в) клиентские и контекстные серверные вызовы.Поэтому да, многое можно, но навык "танец с бубном" должен быть 99lvl
И речь в данном случае не о "сферическом слоне в вакууме", а о например Рабочем Месте, которое настраивается в зависимости от роли пользователя, подразделении пользователя, полномочиям которые ему делегировали временно или постоянно и т.п.
В целом, я не пытаюсь очернить, или критиковать подходы. Просто думаю разумно было бы - побольше раскрыть нюансы именно обработки событий программно-добавленных элементов. Описать на какие подводные грабли можно наступить, как обойти.
(1) https://infostart.ru/public/1106063/ как раз заложена логика обработки событий от элементов формы. Тут нужно поиграться с именами :) и Выполнить("Кусок кода") и будет магия практически программного создания всего :)) тоже столкнулся с проблемой сначала как блин подготовить неизвестное количество событий-процедур для команд. но оказалось нужна одна, но хитровыкорчеванная, грабли конечно, но вариант имеет право на жизнь.
(1) Смысл есть. К примеру, сегодня выполнял такую задачу. Динамическое количество кнопок и у каждой кнопки была своя задача. Код для всех задач был одинаковый, но уникальность кода для каждой кнопки выполнил алгоритмически
Если УФ и платформа больше 8.3.10, то имхо, проще заюзать расширение. В нем нагляднее и конфа не снимается с поддержки.
(5) Не соглашусь, таким образом невозможно понять, какие реквизиты были добавлены в расширении, а какие уже были в исходной конфигурации.
Когда придет время обновлять расширение, эти вопросы обязательно могут возникнуть.
С расширением порядок проблем при обновлении намного меньше. С 8.3.6 их начал юзать, и функционал расширений только улучшается.
Ранее да, на ОФ именно программным кодом пользовался, и вот ни разу не визуально, и весьма проблематично. Пользовался обработкой с инфостарта по декомпиляции форм. Т.е. сперва визуально делаешь, потом в програмный код. Так вот телодвижений и в УФ осталось много. С расширением все намного проще. Мое имхо, конечно же.Ошибочка. Добавлять элементы на форму надо с проверкой, например,
Если Элементы.Найти("Владелец") = Неопределено Тогда
ПолеВвода = Элементы.Добавить("Владелец", Тип("ПолеФормы"), ЭтаФорма);
ПолеВвода.Заголовок = "Владелец";
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "Объект.Владелец";
КонецЕсли;Они ведь иногда появляются, когда 1с-овцы трезвеют.
К тому же, если на форме много изменений, процесс перехода на расширение может занять большое время, и элемент всё ещё может присутствовать в конфигурации на форме, поэтому надо включать защиту от дурака уже заранее.
(11)Описанная проблема обычно решается установкой префикса в имени добавляемого реквизита.
Максимум, 1с-овцы могут добавить аналогичное по содержанию поле. И их будет 2 на форме.Как добавить реквизиты/кнопки в нужное место(Форма, Группа, Командная панель) например в начало списка, по умолчанию элементы добавляются в конец
(12) Вставить вместо добавить. Пример для кнопки контекстного меню. Нам надо вставить ее в начало списка меню:
Как вариант, сначала создать список значений как реквизит формы, затем добавить поля формы и связать их с реквизитом формы, указав в пути к данным путь "ИмяРеквизитаСпискаЗначений[ИндексСтроки].Пометка" и "ИмяРеквизитаСпискаЗначений[ИндексСтроки].Представление"
Любое изменение флажка будет так же влиять и на список значений.
полезные данные! удобно сразу все собрано в одном месте
для добавление реквизитов с помощью расширений очень удобно(33)Предлагаю проверить такой вариант, результат удивит:
Коллеги, приветствую!
Сейчас разбираюсь с подобной задачей. Но мне нужно кнопки командной панели создавать при наступлении события, а не только "однажды" "присозданиинасервере". Есть у кого-нибудь готовые алгоритмы?При разработке решений возникает необходимость добавить реквизит формы, состав и типы которых зависят от данных. Например при построении динамических деревьев с периодами, или при выводе контактной информации и т.д.
Задача
Для наглядности разберем простой пример, в котором можно было обойтись только элементами формы, но мы создадим и реквизиты.
Есть некая конфигурация, в форме элемента справочника Номенклатура необходимо программно создавать реквизиты формы и элементы к ним:
- ЯчейкаХранения, тип СправочникСсылка.ЯчейкиХранения;
- ТекущийОстаток, тип Число.
Элементы объединить в группу с горизонтальной группировкой. На текущий момент форма имеет следующий вид:
Добавление реквизитов
В обработчике формы ПриСозданииНаСервере() опишем код, который разбивается на 3 этапа:
- Описание и создание реквизитов формы;
- Создание элементов формы, объединение в группу без отображения;
- Заполнение данных.
Ниже приведен готовый код, код снабжен комментариями и разбит на области для лучшего понимания
После выполнения приведенного кода форма будет выглядеть так:
Удаление реквизитов
Для удаления необходимо передать массив содержащий пути реквизитов в качестве второго параметра метода формы ИзменитьРеквизиты().
Внимание. Удалять можно только реквизиты созданные программно.
Добавление реквизита табличной части
Добавление реквизита и элемента формы для табличной части почти ничем не отличается, необходимо только указать путь «Объект.». Ниже пример добавления реквизита Ячейка в ТЧ Комплектация.
Добавление реквизита с типом Произвольный
В одной из задач стало необходимо добавить реквизит с типом Произвольный, но ни СП, ни интернеты ответа не дали. В итоге через несколько попыток было найдено решение
Внимание. Данные добавленного реквизита сохраняться в ИБ не будут.
При доработке типовых решений для упрощения дальнейшей поддержки и обновления использую программное создание динамического списка и вывод его на форму.
Задача
Считаем, что есть типовая форма списка номенклатуры с динамическим списком. На форму необходимо добавить страницы: на первой выводить типовой список, а на второй список номенклатуры и данные РС «Данные для обработки». На текущий момент форма выглядит так:
Решение
План работ следующий:
- Создать страницы на форме;
- Переместить типовой динамический список на нужную страницу;
- Создать динамический список и вывести его на нужную страницу.
Далее будет показан код по логическим блокам, в конце статьи будет представлен итоговый код
Создание страниц
Программное формирование реквизитов и элементов формы можно в статье 1С. Программное добавление и удаление реквизитов формы
Перемещение элементов формы
Для перемещения типового динамического списка воспользуемся методом коллекции элементов формы Переместить()
Программное создание динамического списка
Добавляем реквизит формы с типом Динамический список и определяем основные свойства.
Теперь создадим элементы формы относящиеся к динамическому списку
Небольшая хитрость
Как видно из кода, на форме не отображается поле «Ссылка», если на клиенте программно обратиться к текущим данным нашего списка, то свойства ссылка в полученной коллекции не будет. Для предотвращения такой ситуации необходимо указать обязательность использования поля, тогда свойство будет передаваться на клиент всегда
Результат
Теперь проверяем, что у нас получилось. Первая страница, на которую мы перенесли типовой список
Читайте также: