Программные формы

Публикация № 1132090

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

обычные формы программное создание обновление форм

Подсистема предназначена для простого программного изменения форм типовых конфигураций и последующего упрощения установки обновлений на этапе слияния форм.

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

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

Подсистема тестировалась на версии платформы 8.3.10.2667 и выше.

Кратко принцип работы подсистемы можно описать одной картинкой:

В типовую форму добавляются элементы формы-шаблона. Рассмотрим подробнее, как это реализовано.

Установка подсистемы

Вы можете добавить подсистему в свою конфигурацию сравнением/объединением.

В подсистему входят следующие объекты:

Еще необходимо в общем модуле обычного приложения прописать экспортную глобальную переменную:

Перем гл_ЮК_ПрограммныеФормы Экспорт;

В роли большой необходимости нет, главное – следите за тем, чтобы у всех пользователей были права на обработку ЮК_ПрограммныеФормы.

Добавление элементов на форму

В демобазе есть справочник "Товары". Представим, что это некий типовой справочник, в форму которого мы хотим внести изменения.

Изначально форма справочника выглядит вот так:

Предположим, мы хотим добавить новый реквизит справочника и новое поле "Страна-производитель". Чтобы быть уверенным, что новое поле не будет конфликтовать с элементами на форме, которые поставщик может добавить в будущем, сделаем это на новой вкладке "Мои свойства".

Для этого в обработке ЮК_ПрограммныеФормы добавим новую произвольную форму. Назвать ее можно как угодно, но практика показала, что в качестве имени удобно использовать полный путь к форме, для которой предназначен шаблон:

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

И добавить два реквизита формы произвольного типа: Форма и Объект (реквизит Объект для форм списков не обязателен).

В типовую форму, в событие "ПередОткрытием", добавим вызов процедуры:

ЮК_ПрограммныеФормы.ПередОткрытием("Справочники_Товары_ФормаЭлемента", ЭтаФорма, ЭтотОбъект, Отказ);

Первый параметр - имя формы шаблона. Затем передается типовая форма, объект и параметр отказа.

На этом подключение формы шаблона к типовой форме завершено.

Теперь внесем изменения.

Добавим на форму шаблона панель с таким же именем и таким же расположением, как и панель на типовой форме, назовем единственную страницу "МоиСвойства" и добавим надпись и поле "СтранаПроизводитель":

Теперь, перед открытием, на форму будет добавляться поле "СтранаПроизводитель". Для того, чтобы данные поля сохранялись, добавим в справочник реквизит шапки с таким же именем.

Если нужно изменить позицию новой вкладки, то в шаблоне, в тексте заголовка вкладки, нужно указать символ диез и номер позиции. Например:

Подсистема поддерживает НЕ ВСЕ визуальные элементы, которые могут быть размещены на форме. Информацию о том, какие типы визуальных элементов поддерживаются, можно получить из функции ЮК_ПрограммныеФормы.ПолучитьСвойстваИсключенияДляЭлемента.

Изначально подсистема создавалась именно для этих целей - добавлять новые вкладки на формы и произвольные поля с привязками на новых вкладках.

Но функционал подсистемы не ограничивается только этим.

Изменение существующих элементов

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

Давайте поменяем фон поля наименования.

Скопируем из типовой формы поле "Наименование" и разместим его в той же позиции на форме шаблона. А затем в свойствах поля поменяем цвет фона.

Обратите внимание, что вместе со свойствами элемента переносятся и его привязки. Если нужно отключить перенос привязок и оставить оригинальные привязки, которые установлены у элемента типовой формы, в подсказку элемента в шаблоне необходимо добавить ключевое слово #nolink:

События

Подсистема поддерживает трансляцию событий в шаблон.

Давайте попробуем это сделать. В шаблоне добавим полю "Наименование" кнопку открытия и создадим событие "Открытие".

Затем нужно сделать процедуру – обработчик события экспортной. И пропишем какой-то обработчик события.

После чего откроем форму в режиме предприятия. При открытии формы будет выдано сообщение о том, что не хватает обработчика события:

Скопируйте предложенные процедуры "как есть" и вставьте в модуль типовой формы.

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

Внимание! Для элемента типа "Табличное поле" (особенно в расширенных для дерева или справочника версиях) поддерживаются не все события. Получить перечень поддерживаемых событий можно из функции ЮК_ПрограммныеФормы.ПолучитьПолныйПереченьСобытийЭлемента.

Для самой формы транслируется ряд событий. В модуле шаблона можно объявить экспортные процедуры – обработчики событий:

  • ПередОткрытием
  • ПриОткрытии
  • ПередЗаписью
  • ПослеЗаписи
  • ПриЗакрытии

Для их трансляции в соответствующих событиях типовой формы необходимо прописать подобный код:

ЮК_ПрограммныеФормы.ПриЗакрытии("Справочники_Товары_ФормаЭлемента", ЭтаФорма, ЭтотОбъект);

Внимание! Если в типовой форме уже существовал обработчик соответствующего события формы и вы просто добавили вызов-трансляцию в существующую процедуру, то при обновлении нужно просто проследить за тем, чтобы вызов в коде не затерся. Однако если в типовой форме вы создавали обработчик события, то при обновлении может быть очищена связь процедуры – обработчика и события формы.

Контексты исполнения

Код, который выполняется в оттранслированных обработчиках событий, выполняется в контексте шаблона и может вызывать другие процедуры и функции модуля формы-шаблона. Однако в реквизитах формы-шаблона Объект и Форма находятся значения ЭтотОбъект и ЭтаФорма контекста типовой формы.

Таким образом, через Форма.ЭлементыФормы может быть получен доступ к элементам, размещенным на конечной форме. Например, это может быть необходимо для заполнения добавленных списков значений, получения значений полей, не привязанных к данным, и пр.

Формы списков и командные панели

Подсистема поддерживает изменение состава колонок табличных полей и добавление кнопок командных панелей.

Точно так же, как мы делали для формы элемента, сделаем шаблон для формы списка справочника Товары за одним исключением. Реквизит шаблона Объект добавлять не будем. И вызов перед открытием будет без объекта:

ЮК_ПрограммныеФормы.ПередОткрытием("Справочники_Товары_ФормаСписка", ЭтаФорма, , Отказ);

Для всех форм, где нет или не требуется объект, его можно не передавать.

Затем добавим табличное поле типа "ТаблицаЗначений" и командную панель. Имена добавленным элементам поставим такие же, как в типовой форме, тем самым сообщим подсистеме, что не нужно создавать новые элементы, а только модифицировать существующие.

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

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

Так как платформа не отрабатывает сохранение настроек позиции ширины и пр. для колонок табличного поля, добавленных программно, то для тех форм, где вы хотите, чтобы у пользователей сохранялись их настройки, по событию "ПриЗакрытии" необходимо вызывать функцию ЮК_ПрограммныеФормы.ПриЗакрытии. Обработчик события в форме-шаблоне добавлять не обязательно.

Для очистки таких сохраненных настроек в подсистеме есть обработка ЮК_ПрограммныеФормы_СохраненныеНастройкиКолонокТабличныхПолей.

Примечания и известные баги

Страницы формы

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

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

Форма "плывет"

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

Если он не помогает, то внимательно посмотрите расположение, привязки и размеры изменяемых и добавляемых элементов. Это может быть сложно, так как приходится "мыслить в трех измерениях". Добавьте #nolink всем элементам у которых нет необходимости переносить привязки из шаблона в типовую форму. Это помогает в 99% случаев. В моей практике была только одна ситуация, когда форма вела себя неадекватно и я так и не смог понять почему. Пришлось добавлять на нее элементы "старым дедовским способом".

В целом, чем меньше вы в шаблоне меняете позиции и размеры уже существующих на типовой форме элементов, тем меньше вероятность, что форма "поплывет".

В конечном итоге вы всегда можете написать автору подсистемы, но гарантий, что автор сможет помочь именно с вашим случаем, нет.

Ссылки

Про обнаруженные ошибки пишите на адрес me@zfilin.org.ua или в комментарии к публикации на Infostart.

Оригинал статьи в блоге автора

 

Спасибо за интерес к подсистеме, всем хорошего дня и хорошего кода.

Скачать файлы

Наименование Файл Версия Размер
Программные формы (файл конфигурации и демобаза)
.zip 99,81Kb
07.10.19
2
.zip 1.0.0.5 99,81Kb 2 Скачать

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Darklight 22 08.10.19 17:29 Сейчас в теме
Интересное решение, причём для неуправляемых форм - где процесс обновления модифицированного интерфейса значительно более трудоёмок, чем в управляемых с расширениями.
Хорошая альтернатива кодогенерации изменений интерфейса.
У меня есть аналогичная разработка (ещё не закончена) - для управляемых форм - принцип практически тот же - разработка частей интерфейса в отдельной(ых) форме (фрейм) и их интеграция в финальную форму (программная realtime, или препроцессораная indesign)
2. zfilin 2158 08.10.19 17:31 Сейчас в теме
(1) Заканчивайте скорее, а-то я тут уже раздумываю не начать ли писать свою такую же подсистему и для управляемых форм тоже. Но пока лень побеждает. =)
3. Darklight 22 08.10.19 17:34 Сейчас в теме
(2)А меня побеждает моя необузданная фантазия и десятки открытых и незаконченных проектов - между которыми я то и дело переключаюсь :-( + всё время новые идеи лезут ;-)
4. zfilin 2158 08.10.19 17:36 Сейчас в теме
5. k1rs 10.10.19 06:27 Сейчас в теме
(3)так размещаете на гитхаб, на инфостарте статью, неравнодушные подтянутся и помогут, в компании единомышленников дело лучше пойдет.
6. Darklight 22 10.10.19 15:38 Сейчас в теме
(5)У меня сейчас и так в работе 3 статьи
7. slawa 26 17.10.19 00:47 Сейчас в теме
8. zfilin 2158 19.10.19 18:20 Сейчас в теме
Опубликована версия 1.0.0.3

Изменения в версии:
* мелкая доработка по табличному полю дереву
9. zfilin 2158 02.11.19 15:39 Сейчас в теме
Опубликована версия 1.0.0.5

Изменения в версии:
* для существующих кнопок командной панели теперь можно переопределять действие
* мелкие багфиксы
10. Vika260740 4 04.11.19 22:11 Сейчас в теме
Как человек, который часто использует данный функционал, могу сказать, что это очень удобно и круто! Автор молодец))
11. zfilin 2158 27.02.20 14:18 Сейчас в теме
Набросал небольшую инструкцию, которая может пригодиться вашим пользователям: https://zfilin.org.ua/link/software_forms_restore_window
Оставьте свое сообщение

См. также

daСклонение: склонение ФИО, должностей, чисел, прилагательных, существительных на языке 1С + ТестЦентр Промо

Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

14.02.2015    99073    96    daMaster    88    

Сравнение реального дохода со средним доходом из API.HH.RU

Зарплата Управленческие v8 v8::СПР ЗУП3.x УУ Абонемент ($m)

Внешняя обработка на управляемой форме для 1С:Предприятие 8.3 по интеграции с HH.RU используя HH REST API. Ключевые функции: получение списка вакансий по должностям (Ключ для работы не нужен); расчет среднего дохода; Тестирование проводилось на платформе 1С:Предприятие 8.3 (8.3.13.1513) Зарплата и управление персоналом, редакция 3.1 (3.1.11.68) совместно с API.HH.RU.

1 стартмани

11.11.2019    3645    4    solaru    2    

Конфигурация для рекламного агентства

Управление услугами и сервисом Управление взаимоотношениями с клиентами (СRM) Производство готовой продукции (работ, услуг) Управление взаимоотношениями с клиентами (СRM) Производство готовой продукции (работ, услуг) v8 Реклама, PR и маркетинг УУ Абонемент ($m)

Данная конфигурация выполнена для решения тестового задания: Цель задания: 1) Понять, на каком из клиентов сколько мы заработали;  2) Понять, по какому виду СМИ сколько мы заработали;  3) Проследить по каждой услуге: у кого за сколько купили и кому за сколько продали, с возможностью перейти в соответствующий документ. Реализовано с помощью: 1. Справочники - контрагенты, номенклатура 2. Документы - Поступление услуг, реализация услуг 3. Отчеты - отчет по контрагентам, номенклатуре и движений.

1 стартмани

21.05.2019    3923    0    solaru    0    

Загрузка номенклатуры в УТ 10.3 из Excel файла с генерацией штрихкодов

Загрузка и выгрузка в Excel Обработка справочников Оптовая торговля Розничная торговля Учет ТМЦ Оптовая торговля Розничная торговля Учет ТМЦ v8 УТ10 Россия Абонемент ($m)

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

1 стартмани

24.03.2017    7528    6    solaru    0    

Под капотом управляемых форм

Практика программирования v8 1cv8.cf Бесплатно (free)

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

26.08.2013    260459    0    Evil Beaver    266    

[NotaBene] Универсальный отчет по таблице значений

Практика программирования v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Абонемент ($m)

1C v.7.7 Готовое решение. Не требует настройки. Не требует допрограммирования. Данная обработка решает часто встречающуюся задачу вывода в "красивом" виде таблицы значений (полученной, например, из запроса). Поддерживается произвольное группирование данных, отключение/включение группировок, в т.ч и создание "шахматок" (типа "продажи понедельно"). Обработка может использоваться как и в отладочных целях (для нормального просмотра ТЗ), так и в составе вполне рабочих отчетов. По крайней мере, я неоднократно клиентам данную обработку ставил вместо того, чтобы каждый раз писать замороченные выводы данных. И клиенты довольны, и мне - проще...

2 стартмани

07.05.2007    27912    1    CheBurator    61