Управляемая форма как изменить реквизит на форме

На чтение 4 мин Просмотров 6.9к. Опубликовано 27.12.2017

Платформа 1С:Предприятие позволяет программно добавлять и изменять элементы управляемой формы. Разберемся для чего это может потребоваться.

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

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

В управляемой форме можно программно добавить, изменить и удалить:

  • реквизиты;
  • локальные команды;
  • элементы.

Все указанные операции возможны только на сервере.

Программное изменение формы имеет ограничения:

  • Удалить можно только программно добавленные реквизиты/команды/элементы. Нельзя программно удалить объекты, созданные в конфигураторе.
  • Нельзя назначить реквизит основным.

Содержание

  1. Изменение команд формы
  2. Изменение реквизитов формы
  3. Изменение элементов формы

Изменение команд формы

Для управления составом команд у объекта УправляемаяФорма есть коллекция Команды. У коллекции есть несколько методов:

  • Добавить(<ИмяКоманды>)

  • Количество()

  • Найти(<ИмяКоманды>)

  • Удалить(<Команда>)

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

В качестве примера работы с командами формы создадим новую команду ИсторияИзменений с заголовком «История изменений…», которая будет вызвать обработчик ОтобразитьИсторию(). Создание выполняется при открытии формы.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Команда = Команды.Добавить(«ИсторияИзменений»);
Команда.Действие = «Подключаемый_ОтобразитьИсторию»;
Команда.Заголовок = «История изменений…»;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОтобразитьИсторию(Команда)
// действия команды
КонецПроцедуры

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

Изменение реквизитов формы

Чтение состава реквизитов формы выполняется функцией ПолучитьРеквизиты(<Путь>), возвращающей массив типа РеквизитФормы. Параметр функции указывает путь к родительскому реквизиту (в виде строки). Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.

Изменение реквизитов выполняется методом ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>) объекта УправляемаяФорма. В параметр ДобавляемыеРеквизиты передается массив с элементами типа РеквизитФормы. В параметр УдаляемыеРеквизиты передается массив строк, описывающих пути к удаляемым реквизитам.


Внимание!

Процесс изменения состава реквизитов является достаточно ресурсоемким. Фактически выполняется пересоздание формы. В связи с этим работа с реквизитами формы выполняется в пакетном режиме.


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

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(«Покупатель», Новый ОписаниеТипов(«СправочникСсылка.Контрагенты»), , «Клиент»));

// Изменения состава реквизитов
ИзменитьРеквизиты(ДобавляемыеРеквизиты);

Изменение элементов формы

Для управления составом элементов у объекта УправляемаяФорма есть коллекция Элементы. У коллекции есть несколько методов:

  • Вставить(<Имя>, <ТипЭлемента>, <Родитель>, <Элемент>)

  • Добавить(<Имя>, <ТипЭлемента>, <Родитель>)

  • Количество()

  • Найти(<Имя>)

  • Переместить(<Элемент>, <Родитель>, <МестоРасположения>)

  • Удалить(<Элемент>)

Коллекция Элементы доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Вставить(), Добавить(), Переместить() и Удалить()) можно только на сервере. Искать и получать количество элементов (методы Найти() и Количество()) можно как на клиенте, так и на сервере. Элементами коллекции могут быть:

  • ГруппаФормы;
  • ТаблицаФормы;
  • ПолеФормы;
  • КнопкаФормы.

Элементам формы можно программно назначить обработчики событий. Для этих целей предназначен метод УстановитьДействие(<ИмяСобытия>, <Действие>).

Рассмотрим несколько наиболее распространенных на практике примеров работы с командами, реквизитами и элементами формы.

Добавление команды и связанной с ней кнопки:

// Создание команды
Команда = Команды.Добавить(«ИсторияИзменений»);
Команда.Действие = «Подключаемый_ОтобразитьИсторию»; // В форме должна быть процедура с указанным наименованием
Команда.Заголовок = «История изменений…»;
// Создание кнопки и связь ее с командой
Элемент = Элементы.Добавить(«ИсторияИзменений», Тип(«КнопкаФормы»));
Элемент.ИмяКоманды = «ИсторияИзменений»;

Добавление реквизита и связанного с ним поля ввода:

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(«Покупатель», Новый ОписаниеТипов(«СправочникСсылка.Контрагенты»), , «Клиент»));
// Изменение состава реквизитов
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// Создание поля ввода и связь с реквизитом
Элемент = Элементы.Добавить(«Покупатель», Тип(«ПолеФормы»));
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = «Покупатель»;

Назначение элементу формы обработчика события:

ЭлементПокупатель.УстановитьДействие(«ПриИзменении», «Подключаемый_ПокупательПриИзменении»);

&НаКлиенте
Процедура Подключаемый_ПокупательПриИзменении(Элемент)
// Действия события
КонецПроцедуры


Внимание!

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



Внимание!

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


Содержание:

1.     Добавление реквизитов на 1С управляемые формы

2.     Добавить элементы на форму

3.     Установка событий элементам формы

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

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

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

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

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

Рассмотрим на примерах, как делать доработку управляемых форм кодом в 1С. 

1.          Добавление реквизитов на 1С управляемые формы

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

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

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

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

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

В примере ниже я добавил два реквизита «ЭтоСборка» для табличной части «Товары» у объекта и «СтатусОбработки» на форму документа. 

2.          Добавить элементы на форму

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

Для добавления новых элементов на форму есть два метода:

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

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

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

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

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

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

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

3.          Установка событий элементам формы

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

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

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

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

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

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

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

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

&НаСервере

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

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

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

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

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

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

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

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

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

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

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

           ,

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

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

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

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

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

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

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

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

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

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

Специалист компании ООО «Кодерлайн»

Кирилл Карцев.

Инструкция. Программная модификация управляемых форм

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

Мы рассмотрим основные составляющие этой задачи: добавление реквизитов, добавление элементов формы и назначение обработчиков событий элементов формы.

Добавление реквизитов

Для добавления реквизитов используется метод объекта ФормаКлиентскогоПриложения

							ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);
						

Реквизиты формы, добавленные через конфигуратор, удалить невозможно, поэтому второй аргумент процедуры можно не указывать.

Переменная ДобавляемыеРеквизиты является массивом объектов типа РеквизитФормы.

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

							ДобавляемыеРеквизиты = Новый Массив;
							ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Демо_ТаблицаДанных", Новый ОписаниеТипов("ТаблицаЗначений"), , "Таблица значений", Ложь));
							ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Поставщик", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"), "ТаблицаДанных", "Кто поставляет", Ложь));
							ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"), "ТаблицаДанных", "Имя товара", Ложь));
							ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ОписаниеОбъекта", ТипСтрока, "", "Описание объекта", Ложь));
							ИзменитьРеквизиты(ДобавляемыеРеквизиты);
							

К добавленным реквизитам верхнего уровня из модуля можно обращаться только с помощью конструкции ЭтотОбъект. ˂Имя реквизита˃.

Процедуру ИзменитьРеквизиты логично вызывать из обработчика ПриСозданииНаСервере, но т.к. мы не заимствуем форму в расширение, то следует найти другую точку входа. Для конфигураций УТ 11, КА 2 и ERP 2 существует типовой механизм упрощенного изменения конфигураций. Нас интересует модуль МодификацияКонфигурацииПереопределяемый, в состав которого входит процедура

							ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка)
						

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

							Если Форма.ИмяФормы = "Справочник.Номенклатура.Форма.ФормаЭлемента" Тогда
							// код модификации реквизитов
							КонецЕсли;
						

Для остальных конфигураций придется переопределять другие процедуры. Например

							ПодключаемыеКоманды.ПриСозданииНаСервере(Форма)
						

или

							ВерсионированиеОбъектов.ПриСозданииНаСервере(Форма)
						

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

Изменение элементов формы

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

Для добавления нового элемента формы требуется передать в функцию Добавить данной коллекции имя элемента, его тип и родителя (при необходимости). Например:

							Элемент = Элементы.Добавить("Демо_ОписаниеОбъекта", Тип("ПолеФормы"));
							Элемент.Вид = ВидПоляФормы.ПолеВвода;
							Элемент.ПутьКДанным = "ОписаниеОбъекта";
						

По аналогии с добавлением реквизитов, данный код можно выполнять в функциях МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере (УТ, КА, ERP), ПодключаемыеКоманды.ПриСозданииНаСервере или ВерсионированиеОбъектов.ПриСозданииНаСервере.

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

Обработка событий формы

Выполнить код по событию элемента формы можно двумя способами:

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

Оба метода предполагают наличие в модуле формы процедуры с сигнатурой, соответствующей обработчику события. Для первого способа в модуле формы должна быть клиентская процедура, принимающая единственный аргумент — Команда. Для второго — всё зависит от события, для которого выполняется обработчик. Так, например, для события ПриИзменении элемента формы с типом ПолеВвода будет требоваться процедура, принимающая единственный аргумент — ЭлементФормы. А для события ПередНачаломДобавления таблицы формы — целых 6 аргументов (ЭлементФормы, Отказ, Копирование, Родитель, ЭтоГруппа, Параметр). Поэтому для некоторых событий попросту невозможно подобрать соответствующие клиентские методы в модуле формы и заимствования формы в расширение не избежать.

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

  • обработчик Подключаемый_ВыполнитьПереопределяемуюКоманду с переопределением процедуры МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду для УТ, КА и ERP;
  • обработчик Подключаемый_ВыполнитьКоманду с переопределением процедуры ПодключаемыеКомандыКлиент.ВыполнитьКоманду

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

Например:

							ЭлементУПД.УстановитьДействие("ПриИзменении", "Подключаемый_ВыполнитьКоманду");
							
							&Вместо("ВыполнитьКоманду")
							Процедура Демо_ВыполнитьКоманду(Форма, Команда, Источник)
								Если ТипЗнч(Форма) = Тип("ФормаКлиентскогоПриложения") И Форма.ИмяФормы = "Справочник.Контрагенты.Форма.ФормаЭлемента" Тогда
									Если ТипЗнч(Команда) = Тип("ПолеФормы") Тогда
										Если Команда.Имя = "Демо_ВедущийМенеджер" Тогда
							// код обработки события
											Возврат;
										КонецЕсли;
									КонецЕсли;
								КонецЕсли;
								ПродолжитьВызов(Форма, Команда, Источник);
							КонецПроцедуры;
						

Либо вариант с использованием команд:

							Команда = Команды.Добавить("Демо_КомандаИзменитьСтроку");
							Команда.Действие = "Подключаемый_ВыполнитьПереопределяемуюКоманду ";
							Элемент = Элементы.Добавить("Демо_ИзменитьСтроку", Тип("КнопкаФормы"));
							Элемент.ИмяКоманды = "Демо_КомандаИзменитьСтроку";
							
							
							&Вместо("ВыполнитьПереопределяемуюКоманду")
							Процедура Демо_ВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры) Экспорт
							Если ТипЗнч(Форма) = Тип("ФормаКлиентскогоПриложения") И Форма.ИмяФормы = "Справочник.Контрагенты.Форма.ФормаЭлемента" Тогда
								Если Команда.Имя = "Демо_КомандаИзменитьСтроку" Тогда
							// код обработчика события
								КонецЕсли;
							КонецПроцедуры
						

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

Полезные советы

Работа с динамическими списками

Довольно частой задачей является модификация в расширении текста запроса динамического списка. Многие разработчики просто копируют текст запроса из конфигуратора, редактируют его и заменяют стандартный в свойстве ТекстЗапроса объекта Динамический список.

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

Например:

							СхемаЗапроса = Новый СхемаЗапроса;
							СхемаЗапроса.УстановитьТекстЗапроса(Список.ТекстЗапроса);
							Пакет = СхемаЗапроса.ПакетЗапросов[0];
							Оператор = Пакет.Операторы[0];
							Оператор.ВыбираемыеПоля.Добавить("РеализацияТоваровУслуг.Ссылка");
							Список.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
						

Переопределение открываемой формы

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

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

Например:

							Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
								Если ВидФормы = "ФормаОбъекта" И Параметры.Ключ.Вид = Перечисления.ВидыТоваров.Услуга Тогда
									ВыбраннаяФорма = Метаданные.Справочники.Товары.Формы.ФормаУслуги;
									СтандартнаяОбработка = Ложь;
								КонецЕсли;
							КонецПроцедуры
						

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

На чтение 6 мин. Просмотров 2.6k. Опубликовано 15.12.2019

Содержание

  1. Как изменить значение реквизита документа 1С?
  2. Изменение команд формы
  3. Изменение реквизитов формы
  4. Изменение элементов формы
  5. Документы
  6. Документы в языке 1С 8.3, 8.2 (в примерах)

Как изменить значение реквизита документа 1С?

Как изменить значение реквизита документа 1С?
Часто возникает потребность изменить какое-то значение в отдельном реквизите. И не в одном документе, в в нескольких документах. Возможно использовать запрос.
Например:

В статье был рассмотрен вопрос:
Как изменить значение реквизита документа 1С?

Платформа 1С:Предприятие позволяет программно добавлять и изменять элементы управляемой формы. Разберемся для чего это может потребоваться.

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

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

В управляемой форме можно программно добавить, изменить и удалить:

Все указанные операции возможны только на сервере.

Программное изменение формы имеет ограничения:

  • Удалить можно только программно добавленные реквизиты/команды/элементы. Нельзя программно удалить объекты, созданные в конфигураторе.
  • Нельзя назначить реквизит основным.

Изменение команд формы

Для управления составом команд у объекта УправляемаяФорма есть коллекция Команды . У коллекции есть несколько методов:

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

В качестве примера работы с командами формы создадим новую команду ИсторияИзменений с заголовком «История изменений…», которая будет вызвать обработчик ОтобразитьИсторию () . Создание выполняется при открытии формы.

&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
Команда = Команды . Добавить ( «ИсторияИзменений» );
Команда . Действие = «Подключаемый_ОтобразитьИсторию» ;
Команда . Заголовок = «История изменений…» ;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОтобразитьИсторию ( Команда )
// действия команды
КонецПроцедуры

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

Изменение реквизитов формы

Чтение состава реквизитов формы выполняется функцией ПолучитьРеквизиты ( Путь >) , возвращающей массив типа РеквизитФормы . Параметр функции указывает путь к родительскому реквизиту (в виде строки). Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.

Изменение реквизитов выполняется методом ИзменитьРеквизиты ( ДобавляемыеРеквизиты >, УдаляемыеРеквизиты >) объекта УправляемаяФорма . В параметры ДобавляемыеРеквизиты и УдаляемыеРеквизиты передаются массивы с элементами типа РеквизитФормы .

Внимание!

Процесс изменения состава реквизитов является достаточно ресурсоемким. Фактически выполняется пересоздание формы. В связи с этим работа с реквизитами формы выполняется в пакетном режиме.

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

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив ;
ДобавляемыеРеквизиты . Добавить(Новый РеквизитФормы («Покупатель», Новый ОписаниеТипов ( «СправочникСсылка.Контрагенты» ), , «Клиент» ));

// Изменения состава реквизитов
ИзменитьРеквизиты ( ДобавляемыеРеквизиты );

Изменение элементов формы

Для управления составом элементов у объекта УправляемаяФорма есть коллекция Элементы . У коллекции есть несколько методов:

Коллекция Элементы доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Вставить () , Добавить () , Переместить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере. Элементами коллекции могут быть:

Элементам формы можно программно назначить обработчики событий. Для этих целей предназначен метод УстановитьДействие ( ИмяСобытия >, Действие >) .

Рассмотрим несколько наиболее распространенных на практике примеров работы с командами, реквизитами и элементами формы.

Добавление команды и связанной с ней кнопки:

// Создание команды
Команда = Команды . Добавить ( «ИсторияИзменений» );
Команда . Действие = «Подключаемый_ОтобразитьИсторию» ; // В форме должна быть процедура с указанным наименованием
Команда . Заголовок = «История изменений…» ;
// Создание кнопки и связь ее с командой
Элемент = Элементы . Добавить ( «ИсторияИзменений» , Тип ( «КнопкаФормы» ));
Элемент.ИмяКоманды = «ИсторияИзменений» ;

Добавление реквизита и связанного с ним поля ввода:

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты . Добавить (Новый РеквизитФормы ( «Покупатель» , Новый ОписаниеТипов ( «СправочникСсылка.Контрагенты» ), , «Клиент» ));
// Изменение состава реквизитов
ИзменитьРеквизиты ( ДобавляемыеРеквизиты );
// Создание поля ввода и связь с реквизитом
Элемент = Элементы . Добавить ( «Покупатель» , Тип ( «ПолеФормы» ));
Элемент . Вид = ВидПоляФормы . ПолеВвода ;
Элемент . ПутьКДанным = «Покупатель» ;

Назначение элементу формы обработчика события:

ЭлементПокупатель . УстановитьДействие ( «ПриИзменении» , «Подключаемый_ПокупательПриИзменении» );

&НаКлиенте
Процедура Подключаемый_ПокупательПриИзменении ( Элемент )
// Действия события
КонецПроцедуры

Внимание!

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

Внимание!

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

Остались вопросы?
Спросите в комментариях к статье.

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

Документы

Описание:

Документ — одно из основных понятий системы 1С:Предприятие. При помощи документов организуется ввод в систему информации о совершаемых хозяйственных операциях, а также ее просмотр и корректировка.

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

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

Документы в языке 1С 8.3, 8.2 (в примерах)

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю).

Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.

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

Нажмите одну из кнопок, чтобы поделиться:

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

Сейчас форма имеет следующий вид:

После добавления новых элементов она будет иметь вид:

Итак, добавляем реквизиты:

  • ЕдиницаИзмерения, тип СправочникСсылка.ЕдиницыИзмерения;
  • ТекущийОстаток, тип Число.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    #Область ДобавлениеРеквизитовФормы

    // Массив для новых реквизитов
    ДобавляемыеРеквизиты = Новый Массив();

    // Описываем новые ревизиты формы
    РеквизитЕдиницаИзмерения = Новый РеквизитФормы(
        "ЕдиницаИзмерения",
        Новый ОписаниеТипов("СправочникСсылка.ЕдиницыИзмерения"),
        ,
        "Единица измерения"
    );
    РеквизитТекущийОстаток = Новый РеквизитФормы(
        "ТекущийОстаток",
        Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(10, 3)),
        ,
        "Текущий остаток"
    );

    // Заполняем массив новых реквизитов
    ДобавляемыеРеквизиты.Добавить(РеквизитЕдиницаИзмерения);
    ДобавляемыеРеквизиты.Добавить(РеквизитТекущийОстаток);

    // Добавляем новые реквизиты в форму
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);

    #КонецОбласти

    #Область ДобавлениеЭлементовФормы

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

    // Добавляем элементы внутрь новой группы
    НовыйЭлемент = Элементы.Добавить(
        "ЯчейкаХранения",
        Тип("ПолеФормы"),
        НоваяГруппаФормы
    );
    НовыйЭлемент.ПутьКДанным    = "ЕдиницаИзмерения";
    НовыйЭлемент.Вид            = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ТолькоПросмотр = Истина;

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

    #КонецОбласти

    #Область ЗаполнениеДанных

    // Имитируем заполнение данных
    ЭтаФорма.ЕдиницаИзмерения = ПредопределенноеЗначение(
        "Справочник.ЕдиницыИзмерения.Штука"
    );
    ЭтаФорма.ТекущийОстаток = 12;

    #КонецОбласти

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

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

Теперь посмотрим, как можно изменить основной реквизит формы. Изменим табличную часть Состав документа РасходнаяНакладная:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Массив для новых реквизитов
    ДобавляемыеРеквизиты = Новый Массив();

    // Описываем новый ревизит формы
    РеквизитЕдиницаИзмерения = Новый РеквизитФормы(
        "ЕдиницаИзмерения",
        Новый ОписаниеТипов("СправочникСсылка.ЕдиницыИзмерения"),
        "Объект.Состав",
        "Единица измерения"
    );

    // Заполняем массив новых реквизитов
    ДобавляемыеРеквизиты.Добавить(РеквизитЕдиницаИзмерения);

    // Добавляем новый реквизит в форму
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);

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

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

Важно понимать, что данные добавленного реквизита сохраняться в ИБ не будут.

Поиск:
1С:Предприятие • Изменить реквизиты • При создании на сервере • Реквизит • Управляемая форма • Элемент формы

Знакомство с управляемой формой 1С лучше всего начинать с реквизитов. Что такое реквизит управляемой формы?  По своей сути, это данные, которые привязаны именно к форме: они создаются, хранятся, отображаются (по возможности) и редактируются на форме. Вне контекста формы эти данные не могут существовать. Сам по себе реквизит не может отображаться на форме. Для этого служат элементы формы, которые связаны с реквизитами форм.

Научимся создавать простые реквизиты формы и размещать их на форме.

Управляемое приложение 1С 8.3

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

Пустая управляемая форма

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

Для того, чтобы добавить реквизит необходимо нажать на кнопку «Добавить реквизит» командной панели закладки «Реквизиты»

Добавить реквизит управляемой формы

После этого будет добавлен реквизит управляемой формы 1С с типом по умолчанию (строка) и справа откроется палитра свойств этого реквизита.

Палитра свойств реквизита управляемой формы

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

Для тренировки создадим четыре реквизита с типом строка:  Фамилия, Имя, Отчество и ФИО. И один реквизит с типом дата: ДатаРождения.

Реквизиты на управляемой форме

Разместим реквизиты на форме. Сделать это просто: необходимо нужный реквизит мышкой «перетащить»  из закладки «Реквизиты» на закладку «Элементы»

Перетаскиваем реквизит в элементыПеретащим все реквизиты на формы, и с помощью кнопок «Вверх», «Вниз» удобно расположим их на форме.

Реквизиты на управляемой форме 1С

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

Свойство ПутьКДанным элемента формы

Если нажать на кнопку «…» свойства ПутьКДанным, то у разработчика есть возможность поменять привязанный к этому элементу реквизит формы.

Изменяем свойство ПутьКДанным элемента формы

Сейчас научимся использовать реквизиты в программном коде. Из статьи, посвященной архитектуре управляемой формы 1С 8.3 Вы знаете, что выполнение кода на форме возможно под директивами &НаКлиенте &НаСервере и  &НаСервереБезКонтекста.  Доступ к реквизитам формы возможен только в процедурах и функциях, которые выполняются на &НаКлиенте и &НаСервере.

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

Создадим локальную команду формы. Для этого на закладке «Команды» в подзакладке «Команды формы» необходимо нажать на кнопку «Добавить»

Добавление команды управляемой формы 1С

После создания команды, справа откроется палитра свойств новой команды, где мы зададим её название.

Название команды управляемой формы 1С

Но команда – это выполнение некоторых действий на форме.  Чтобы действия осуществились необходимо создать обработчик команды. Для создания обработчика команды нужно нажать на кнопку «Лупа» свойства действия. После этого откроется окно выбора места размещения обработчика.

Выбор расположения обработчика команды управляемой формы

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

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

&НаКлиенте
Процедура СформироватьФИО(Команда)

    ФИО = Фамилия + " " +
               Имя + " " +
               Отчество + ", д.р. " +

    Формат(ДатаРождения, "ДЛФ=D");

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

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

Обратите внимание, после создание процедуры в палитре свойств команды свойство Действие заполнилось названием нашей новой процедуры.

Свойство Действие команды управляемой формы

И последним шагом нам осталось нашу команду разместить на управляемой форме. Просто перетащим её мышкой в закладку Элементы

Перетаскиваем команду в закладки Элементы

При этом на форме появится кнопка.

Сохраним обработку и попробуем выполнить нашу команду.

Работа команды на управляемой форме

Как видите, к реквизитам формы в модуле формы можно обращаться напрямую, как к переменным, но только если процедура или функция выполняется под директивами &НаКлиенте и &НаСервере.

Управляемое приложение 1С 8.3

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

Книга «Основы разработки в 1С: Такси»

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

  1. Без сложных технических терминов;
  2. Более 600 страниц практического материала;
  3. Каждый пример сопровождается рисунком (скриншот);
  4. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!

Промо-код на скидку в 15% — 48PVXHeYu

Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»

Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;


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

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Вступайте в мои группы в соцсетях, и будьте в курсе всех новостей

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

как изменить реквизит, находящийся на форме справочника

Я
   Alex655

16.06.15 — 09:30

я получаю объект, но не могу к нему обратиться (через объект.реквизит), каким способом воспользоваться? ут11. 8.3

  

Партнерская программа EFSOL Oblako

   Вася Чез

1 — 16.06.15 — 09:32

(0) как получаешь?

   Бубка Гоп

2 — 16.06.15 — 09:32

Что то не туда катимся, товарищи. Книжки читать, не?

По сабжу: убедись, реквизит объекта или формы ты не можешь изменить?

   kosts

3 — 16.06.15 — 09:32

Если дело происходит в модуле обычной формы, то чаще всего так и пишут:

РеквизитРазмерОклада = 100;

   Alex655

4 — 16.06.15 — 09:34

(2) формы (1) Партнер = Справочники.Партнеры.НайтиПоНаименованию(имя).ПолучитьОбъект() (3) я на форме обработки пытаюсь это сделать

   Alex655

5 — 16.06.15 — 09:34

(3) формы управляемые

   Бубка Гоп

6 — 16.06.15 — 09:35

(4) Тогда на кой орган тебе объект?

   kosts

7 — 16.06.15 — 09:35

(4) У тебя типы не совпадают

   Alex655

8 — 16.06.15 — 09:35

(6) получитьформу?

   Бубка Гоп

9 — 16.06.15 — 09:35

(4) Реквизит ФОРМЫ он не у ОБЪЕКТА, а у ФОРМЫ…

   Alex655

10 — 16.06.15 — 09:56

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

   Бубка Гоп

11 — 16.06.15 — 09:59

(10) поток сознания.

в базе не хранятся реквизиты формы, в ней хранятся только реквизиты объектов.

Надо получить эту ссылку на партнера из формы обработки?

Если да, просто обращайся к реквизиту по имени, РеквизитССылкойНаПартнера.ПолучитьОбъект(), например

   Бубка Гоп

12 — 16.06.15 — 10:02

(10) + если вызов не контекстный, реквизиты формы будут доступны и на сервере, делай там все что тебе вздумается

   Бубка Гоп

13 — 16.06.15 — 10:02

(12) ошибочка, контекстный конечно ) т.е. просто НаСервере

   Alex655

14 — 16.06.15 — 10:09

(13) на сервере я не могу использовать метод получитьформу. ссылка на партнера есть и так

&НаКлиенте

Процедура Актуализировать(Команда)

    
    
    ПартнерФорма = Объект.Партнер.ПолучитьФорму(«CRM_ФормаЭлемента»);

    ПартнерФорма.ЭтаФорма[«ОГРН»]= ОГРН;

    ПартнерФорма.Закрыть();

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

   Бубка Гоп

15 — 16.06.15 — 10:10

(14) ОГРН — реквизит объекта а не формы

   Бубка Гоп

16 — 16.06.15 — 10:12

(15) так что лезь на сервер, получай объект, меняй огрн, записывай

   Alex655

17 — 16.06.15 — 10:12

(15) формы

   Бубка Гоп

18 — 16.06.15 — 10:13

(17) непробиваемый какой. а я говорю — это реквизит объекта

   Бубка Гоп

19 — 16.06.15 — 10:14

(17) разверни список реквизитов у справочника партнеры в конфигураторе, внимательно изучи содержимое, подумай

   Alex655

20 — 16.06.15 — 10:15

   Alex655

21 — 16.06.15 — 10:16

(18) справа в свойствах это видно, что просто огрн, а не объект.огрн

   Бубка Гоп

22 — 16.06.15 — 10:16

(21) то что такой же реквизит есть у формы, не говорит о том что его нет у объекта

   Alex655

23 — 16.06.15 — 10:17

(22) мне в скрин не влезет весь список реквизитов объекта. Там правда его нет

   Бубка Гоп

24 — 16.06.15 — 10:18

(23) хорошо, тогда посмотри откуда он тянется.

В форме данные не хранятся, пойми

   Alex655

25 — 16.06.15 — 10:30

(24) тип строка, ниоткуда

   Alex655

26 — 16.06.15 — 10:31

(24) и галка стоит «сохраняемые данные»

   Alex655

27 — 16.06.15 — 10:34

суть не в этом, я прошу о другом помощи

   Бубка Гоп

28 — 16.06.15 — 10:35

(26) эта галка не совсем то означает

   Бубка Гоп

29 — 16.06.15 — 10:37

(25) если ниоткуда, то оно вообще нигде не хранится

   Alex655

30 — 16.06.15 — 10:44

(29) но данные там есть же, если открыть карточку партнера

   pitbul

31 — 16.06.15 — 10:48

(30) Данные туда заполняются видимо при открытии формы или перед открытием

   Бубка Гоп

32 — 16.06.15 — 10:51

(30) значит все таки откуда то они подтягиваются

   Бубка Гоп

33 — 16.06.15 — 11:07

Выходит, при клиент-серверном взаимодействии, Знач отрабатывает «честно» даже с коллекциями

   Бубка Гоп

34 — 16.06.15 — 11:08

(33) пардон, не туда

   Alex655

35 — 16.06.15 — 11:10

(32) я разобрался, спасибо) из контрагента тащится, у контрагента поменял и там зменилось

  

Бубка Гоп

36 — 16.06.15 — 11:12

(35) вот и славненько. советую все же что нить почитать про УФ

Понравилась статья? Поделить с друзьями:
  • Управляющая компания акварель котельники телефон
  • Управляющая компания арзамасского района телефон
  • Управляющая компания балашиха сакраменто телефон
  • Управляющая компания в коммунарке термоинжсервис
  • Управляющая компания в суворове тульской области