Программное изменение формы в 1С при помощи расширений

Начиная с версии платформы 1С 7.7 одной из самых частых задач является доработка конфигурации под нужды организации или клиента. В версии платформы 8.2 в конфигурации для внесения изменений необходимо было включить возможность изменений или вовсе снять с поддержки. Это означает, что конфигурация не может обновляться автоматически и обновление нужно делать вручную. И чем больше и чем серьезней вносятся изменения в конфигурации, тем более сложной и трудоемкой становится дальнейшая поддержка и обновление. Поэтому начиная с версии 8.3.6 в платформе появился механизм расширений. Он позволяет вносить изменения, не затрагивая основную конфигурацию и не снимая ее с поддержки. В расширениях можно добавлять новые объекты, изменять поведение форм, переопределять типовые алгоритмы.

В статье покажу 2 способа доработки форм в 1С. Первым способом мы доработаем форму при помощи редактора форм платформы. Вторым способом проделаем все те же манипуляции, но только изменения будем вносить программно. За основу возьмем конфигурацию Библиотека стандартных подсистем версии 3.1.6.198 и доработаем в ней форму элемента справочника Контрагенты. Все доработки весьма условны и призваны показать возможности доработки форм.

Добавление расширения для изменения форм 1С

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

Откроем форму элемента справочника и доработаем форму при помощи редактора формы:

Добавление расширения и справочника для формы 1с

Доработка форм 1С в редакторе форм

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

Доработка форм 1С в редакторе форм

В списке реквизитов объекта мы не увидим наш добавленный реквизит. Для того чтобы он появился, необходимо добавить сам объект в расширение.

Нажимаем правой кнопкой мыши на объекте и выбираем пункт «Добавить в расширение»:

Доработка форм 1С в редакторе форм: добавить расширение

После добавления объекта в расширение, реквизит «ДФ_КонтактноеЛицо» станет виден:

реквизит ДФ_КонтактноеЛицо виден после добавления объекта в расширение

Теперь реквизит «ДФ_КонтактноеЛицо» мы можем вытащить на форму:

реквизит ДФ_КонтактноеЛицо можем вытащить на форму

Добавим новый реквизит и также вытащим его на форму. Пусть это будет обычный флажок, который будет управлять видимостью реквизита «Контактное лицо». Добавляем новый реквизит, тип указываем булево и вытаскиваем его на форму:

доработка форм 1с: добавление нового реквизита

Объединим реквизиты в группу, чтобы они были на одной строке. Для этого в дереве элементов нажмем правую кнопку мыши и добавим обычную группу без отображения. После добавления группы перенесем в нее добавленные реквизиты. Результат проделанных действий будет выглядеть следующим образом:

Создадим обработчик события «ПриИзменении» реквизита «Видимость контактного лица» и добавим в него код:

доработка форм 1с: создание справочника события ПриИзменении

Добавим новую страницу в группу страниц и перенесем на нее добавленные реквизиты. Для этого в дереве элементов найдем группу «Страницы», нажмем правую кнопку мыши на ней и добавим новую группу «Страница».

доработка форм 1с: добавление новой страницы

Страницу назовем просто «Новая страница» и после добавления переносим на нее наши добавленные реквизиты. После переноса форма примет вид:

вид формы 1с после доработки

В конце мы добавим команду формы, также вытащим ее на форму и создадим обработчик, который будет сообщать нам содержимое реквизита «Контактное лицо». Для добавления новой команды нужно перейти на вкладку «команда», нажать кнопку «добавить». Созданную команду назовем «Сообщить контактное лицо» и создадим обработчик команды. Саму команду вытащим на форму, на созданную ранее страницу, и поместим ее под реквизитами:

доработка форм 1с: создание обработчика

В обработчике команды напишем следующий код:

доработка форм 1с: код в обработчике команды

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

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

Программное изменение форм 1С при помощи расширений

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

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

Для начала в расширении создадим общий модуль ДФ_РаботаСЭлементаФормы:

программное изменение форм 1С при помощи расширений

В общем модуле добавим функцию, которая будет возвращать нам новый элемент формы:

программное изменение форм 1С при помощи расширений

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

В качестве параметров передаются:

  • Форма – управляемая форма;
  • ИмяЭлемента – строковое представление элемента;
  • ТипЭлемента – при помощи функции Тип() передать тип элемента. Например, Тип(”ПолеВвода”) или Тип(”ГруппаФормы”);
  • РодительЭлемента – родитель добавляемого элемента. Это может быть как группа формы, так и сама форма;
  • ЭлементПеред – элемент формы, перед которым будет добавлен новый элемент.

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

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

ЕслиСтруктураНеопределена

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

программное изменение форм 1С при помощи расширений

Процедуры УстановитьСвойстваЭлемента и УстановитьСобытияЭлемента

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

программное изменение форм 1С при помощи расширений

ВидыПолейФормы

Функция возвращает соответствие видов полей формы. Предназначена для определения вида поля. Потребуется при создании полей формы. Список видов полей формы весьма велик, поэтому возьмем часто используемые.

программное изменение форм 1С при помощи расширений

Добавление нового реквизита на форму

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

программное изменение форм 1С при помощи расширений: добавление нового реквизита
программное изменение форм 1С при помощи расширений

Далее в общем модуле опишем функцию, которая добавит поле ввода, и свяжем ее с нашим новым реквизитом.

программное изменение форм 1С при помощи расширений

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

программное изменение форм 1С при помощи расширений

После запуска и отработки обработчика «ПриСозданииНаСервереПосле» форма элемента справочника примет вид:

программное изменение форм 1С при помощи расширений

Как видно, функция по созданию нового поля отработала, и наш реквизит появился на форме.

Создание реквизита формы

Для следующего примера добавим реквизит уже формы, который будет управлять видимостью нашего реквизита «Контактно лицо». Для создания реквизитов формы создадим пару новых процедур.

программное изменение форм 1С при помощи расширений

Процедура СоздатьРеквизиты создает реквизиты формы. В качестве параметров мы передаем саму форму и структуру реквизитов. Ключом структуры является имя реквизита формы, а значением структуры описание типа реквизита. Процедура СоздатьРеквизит создает структуру с одним значением и вызывает процедуру СоздатьРеквизиты. Добавляем новый реквизит формы «ВидимостьКонтактногоЛица». Для этого в обработчике «ПриСозданииНаСерверПосле» допишем следующий код:

программное изменение форм 1С при помощи расширений

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

программное изменение форм 1С при помощи расширений

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

Создание группы формы

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

программное изменение форм 1С при помощи расширений: создание группы формы

Первая функция создает обычную группу, вторая функция обычную группу без отображения.

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

программное изменение форм 1С при помощи расширений

Для нашего примера создадим обычную группу и переместим в нее наши ранее созданные элементы. Придется переработать код обработчика «ПриСозданииНаСервереПосле»:

программное изменение форм 1С при помощи расширений

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

После доработки обработчика результат его работы будет выглядеть следующим образом: созданные флажок и поле объединились в группе «Добавленные реквизиты»:

программное изменение форм 1С при помощи расширений

Создание страницы

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

программное изменение форм 1С при помощи расширений: создание страницы
программное изменение форм 1С при помощи расширений: создание страницы

В функцию «СоздатьСтраницу» в параметрах передаем форму, имя страницы, группу страницы – т.е. это группа, которой будет подчинена наша страница, структура свойств и страница перед – т.е. группа страницы, перед которой будет создана наша страница.

Добавим новую страницу и перенесем в нее наши созданные элементы. Как и ранее будем дорабатывать обработчик «ПриСозданииНаСервереПосле».

программное изменение форм 1С при помощи расширений

Получим структуру свойств страницы. Заголовок, к примеру, укажем «Новая страница», а группировку оставим без изменений, т.е. вертикальная. Нашу новую страницу добавим в самое начало, т.е. перед страницей «Основное». Создаем станицу. Для того чтобы создаваемые элементы далее перенеслись на новую страницу, для группы элементов родителем укажем не форму, а созданную страницу. После доработки обработчика результат получится такой — как видно на рисунке, добавилась новая страница в начало группы страниц и на эту страницу перенесены все созданные элементы.

программное изменение форм 1С при помощи расширений

Создание команды и кнопки

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

программное изменение форм 1С при помощи расширений: создание команды и кнопки

Добавим в общий модуль пару функций. Первая будет создавать команду формы, вторая будет создавать элемент формы кнопка и связывать ее с командой формы.

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

программное изменение форм 1С при помощи расширений

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

программное изменение форм 1С при помощи расширений

После того как обработчик «ПриСозданииНаСерверПосле» отработает, форма примет следующий вид. Нажмем на кнопку «Сообщить конт. лицо» и проверим, срабатывает ли обработчик команды.

программное изменение форм 1С при помощи расширений

При нажатии на кнопку обработчик команды срабатывает и сообщает нам содержимое поля контактное лицо. При желании кнопку можно перенести в командную панель. Для этого при создании кнопки формы в параметр РодительКнопки передадим командную панель формы:

программное изменение форм 1С при помощи расширений

Результат работы такого кода приведен на рисунке.

программное изменение форм 1С при помощи расширений

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

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar