Библиотека программного изменения формы (УФ)

Публикация № 1270443 07.08.20

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

Управляемые Формы УФ Изменение Библиотека

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

Для ускорения быстродействия, во всех процедурах библиотеки отсутствуют проверки корректности введенных имен и значений! Для исключения появления ошибок, я приведу подробное описание всех передаваемых в процедуры параметров.

  1. Необходимо разместить в дереве элементов формы уже добавленный реквизит объекта, либо реквизит формы.

// Добавляет в дерево элементов формы существующие реквизиты объекта и формы
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  МассивРеквизитов  - Массив структур - содержит:
//     * Имя  - Имя добавляемого реквизита
//     * Значение - Структура - содержит (все свойства не обязательные):
//        ** ИмяГруппы 			- Строка - имя элемента родителя
//        ** ПутьКДанным		- Строка - путь к данным. Если не указано, то будет Объект.<ИмяРеквизита>
//        ** ВидПоляФормы		- ВидПоляФормы - вид поля формы. По умолчанию ПолеВвода
//        ** Видимость 			- Булево - значение свойства Видимость
//        ** ТолькоПросмотр 	- Булево - значение свойства ТолькоПросмотр
//        ** Доступность 		- Булево - значение свойства Доступность
//        ** ПоместитьПеред		- Строка - имя элемента, перед которым необходимо разместить
//        ** ОбработкаСобытий 	- Массив структур - содержит:
//           *** Событие 	- Строка - имя события элемента
//           *** Действие 	- Строка - имя процедуры исполнителя события
//
Процедура РазместитьРеквизитыНаФорме(Форма, МассивРеквизитов) Экспорт

	Для каждого ТекРеквизит Из МассивРеквизитов Цикл
		
		ИмяРеквизита 		= ТекРеквизит.Имя;
		ПараметрыРеквизита 	= ТекРеквизит.Значение;
				
		Если ПараметрыРеквизита.Свойство("ИмяГруппы") Тогда
			ЭлементРодитель = Форма.Элементы[ПараметрыРеквизита.ИмяГруппы];	
		Иначе
			ЭлементРодитель = Форма;
		КонецЕсли;
		
		Элемент = Форма.Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), ЭлементРодитель);
				
		Если ПараметрыРеквизита.Свойство("ПутьКДанным") Тогда
			Элемент.ПутьКДанным = ПараметрыРеквизита.ПутьКДанным;
		Иначе 
			Элемент.ПутьКДанным = "Объект." + ИмяРеквизита;
		КонецЕсли; 
		
		Если ПараметрыРеквизита.Свойство("ВидПоляФормы") Тогда		
			Элемент.Вид = ПараметрыРеквизита.ВидПоляФормы;	
		Иначе
			Элемент.Вид = ВидПоляФормы.ПолеВвода;
		КонецЕсли;                               	
		
		Если ПараметрыРеквизита.Свойство("Видимость") Тогда
			Элемент.Видимость = ПараметрыРеквизита.Видимость;	
		КонецЕсли; 		
		
		Если ПараметрыРеквизита.Свойство("ТолькоПросмотр") Тогда
			Элемент.ТолькоПросмотр = ПараметрыРеквизита.ТолькоПросмотр;	
		КонецЕсли; 		
		
		Если ПараметрыРеквизита.Свойство("Доступность") Тогда
			Элемент.Доступность = ПараметрыРеквизита.Доступность;	
		КонецЕсли; 		
				
		Если ПараметрыРеквизита.Свойство("ПоместитьПеред") Тогда
			Форма.Элементы.Переместить(Элемент, ЭлементРодитель, Форма.Элементы[ПараметрыРеквизита.ПоместитьПеред]);	
		КонецЕсли; 		
		
		//--- обработчики событий
		Если ПараметрыРеквизита.Свойство("ОбработкаСобытий")
			И ТипЗнч(ПараметрыРеквизита.ОбработкаСобытий) = Тип("Массив") Тогда
			
			Для каждого ТекСобытие Из ПараметрыРеквизита.ОбработкаСобытий Цикл
				Элемент.УстановитьДействие(ТекСобытие.Событие, ТекСобытие.Действие);		
			КонецЦикла; 			
			
		КонецЕсли; 
		
	КонецЦикла; 	
	
КонецПроцедуры

Первым параметром идет форма, на которой необходимо разместить новые элементы.
Тип параметра - ФормаКлиентскогоПриложения. Параметр является обязательным.

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

Элементом массива (второго параметра) является структура с двумя свойствами - Имя и Значение:

    Имя - тип Строка - Имя, которое будет присвоено новому элементу формы. Имя должно быть уникальным!

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

        ИмяГруппы - тип Строка - Имя элемента формы, который будет выступать родителем для создаваемого элемента, например группа формы или таблица формы. На момент размещения нового элемента формы, его родитель уже должен присутствовать в дереве элементов, иначе возникнет ошибка! Если данное свойство не определено, то родителем будет выступать сама Форма.

        ПутьКДанным - тип Строка - Данный параметр определяет свойство нового элемента ПутьКДанным, например для реквизита Номенклатура табличной части Товары путь к данным будет выглядеть как "Объект.Товары.Номенклатура". Если передать некорректный путь к данным, то возникнет ошибкаЕсли данное свойство не определено, то по умолчанию путь к данным будет выглядеть как "Объект.<ИмяРеквизита>".

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

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

        ТолькоПросмотр - тип Булево - Определяет свойство нового элемента ТолькоПросмотр. Если передать значение отлично от булево, то возникнет ошибка. Если данное свойство не определено, то по умолчанию значение будет Ложь.

        Доступность - тип Булево - Определяет свойство нового элемента Доступность. Если передать значение отлично от булево, то возникнет ошибка. Если данное свойство не определено, то по умолчанию значение будет Истина.

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

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

            Событие - тип Строка - Имя события, которое необходимо определить для элемента. Если передать не корректное имя события, то возникнет ошибка.

            Действие - тип Строка - Имя процедуры обработчика события. Если передать не корректное имя процедуры, то ошибки не возникнет, но и отрабатывать событие не будет.

 2. Необходимо изменить несколько свойств для нескольких элементов формы.

// Изменяет свойства элементов формы
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  СтруктураЭлементов  - Структура - содержит:
//     * Ключ  - Имя редактируемого элемента формы
//     * Значение - Массив структур - содержит:
//        ** Имя 		- Строка - имя свойства элемента
//        ** Значение 	- Произвольный - значение свойства элемента
//
Процедура ИзменитьСвойстваЭлементовФормы(Форма, СтруктураЭлементов) Экспорт

	Для каждого ТекРеквизит Из СтруктураЭлементов Цикл
		
		ИмяЭлемента 	= ТекРеквизит.Ключ;
		МассивСвойств 	= ТекРеквизит.Значение;
		
		Элемент = Форма.Элементы[ИмяЭлемента];
		
		Для каждого СвойствоЭлемента Из МассивСвойств Цикл
		
			Элемент[СвойствоЭлемента.Имя] = СвойствоЭлемента.Значение;
		
		КонецЦикла;
		
	КонецЦикла; 	
	
КонецПроцедуры

Первым параметром идет форма, на которой необходимо изменить свойства элементов.
Тип параметра - ФормаКлиентскогоПриложения. Параметр является обязательным.

Вторым параметром идет структура, которую будем обходить в цикле.
Тип параметра - Структура. Параметр является обязательным.

    Ключ - Имя элемента формы, свойства которого необходимо изменить. Если передать имя элемента, которого нет в дереве элементов, то возникнет ошибка!

    Значение - тип Массив - Массив структур для установки свойств элемента формы. Если в качестве элемента массива будет передана не структура, или структура без свойств, описанных ниже, то возникнет ошибка.

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

        Значение - тип Произвольный и зависит от изменяемого свойства - Новое значение, которое необходимо установить свойству элемента формы. Если передавать значение, которое не соответствует свойству элемента, то возникнет ошибка.

3. Необходимо изменить несколько свойств элемента формы.

// Изменяет свойства элемента формы
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  ИмяЭлемента  - Строка - имя элемента формы
//
//  МассивСвойств  - Массив структур - содержит:
//     * Имя 		- Строка - имя свойства элемента
//     * Значение 	- Произвольный - значение свойства элемента
//
Процедура ИзменитьСвойстваЭлементаФормы(Форма, ИмяЭлемента, МассивСвойств) Экспорт

	СтруктураЭлементов = Новый Структура(ИмяЭлемента, МассивСвойств);
	ИзменитьСвойстваЭлементовФормы(Форма, СтруктураЭлементов);
	
КонецПроцедуры

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

Первым параметром идет форма, на которой необходимо изменить свойства элемента.
Тип параметра - ФормаКлиентскогоПриложения. Параметр является обязательным.

Вторым параметром идет имя элемента формы, свойства которого необходимо изменить. Если передать имя элемента, которого нет в дереве элементов, то возникнет ошибка!
Тип параметра - Строка. Параметр является обязательным.

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

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

    Значение - тип Произвольный и зависит от изменяемого свойства - Новое значение, которое необходимо установить свойству элемента формы. Если передавать значение, которое не соответствует свойству элемента, то возникнет ошибка.

4. Необходимо изменить одно свойство элемента формы.

// Изменяет свойства элементов формы
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  ИмяЭлемента  - Строка - имя элемента формы
//
//  ИмяСвойства  - Строка - имя свойства элемента
//
//  ЗначениеСвойства  - Произвольный - значение свойства элемента
//
Процедура ИзменитьСвойствоЭлементаФормы(Форма, ИмяЭлемента, ИмяСвойства, ЗначениеСвойства) Экспорт

	Элемент = Форма.Элементы[ИмяЭлемента];
	Элемент[ИмяСвойства] = ЗначениеСвойства;
	
КонецПроцедуры

Первым параметром идет форма, на которой необходимо изменить свойство элемента.
Тип параметра - ФормаКлиентскогоПриложения. Параметр является обязательным.

Вторым параметром идет имя элемента формы, свойство которого необходимо изменить. Если передать имя элемента, которого нет в дереве элементов, то возникнет ошибка!
Тип параметра - Строка. Параметр является обязательным.

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

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

5. Необходимо установить несколько обработчиков событий для элемента формы.

// Устанавливает обработчики событий для элемента формы
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  ИмяЭлемента  - Строка - имя элемента формы
//
//  МассивСобытий  - Массив структур - содержит:
//     *Событие 	- Строка - имя события элемента
//     *Действие 	- Строка - имя процедуры исполнителя события
//
Процедура УстановитьСобытияЭлементаФормы(Форма, ИмяЭлемента, МассивСобытий) Экспорт

	Элемент = Форма.Элементы[ИмяЭлемента];
	
	Для каждого ТекСобытие Из МассивСобытий Цикл
		Элемент.УстановитьДействие(ТекСобытие.Событие, ТекСобытие.Действие);		
	КонецЦикла; 			

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

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

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

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

    Событие - тип Строка - Имя события, которое необходимо определить для элемента. Если передать не корректное имя события, то возникнет ошибка.

    Действие - тип Строка - Имя процедуры обработчика события. Если передать не корректное имя процедуры, то ошибки не возникнет, но и отрабатывать событие не будет.

6. Необходимо установить обработчик события для элемента формы.

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

	Элемент = Форма.Элементы[ИмяЭлемента];
	Элемент.УстановитьДействие(Событие, Действие);		

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

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

Вторым параметром идет имя элемента формы, для которого необходимо установить обработчик события. Если передать имя элемента, которого нет в дереве элементов, то возникнет ошибка!
Тип параметра - Строка. Параметр является обязательным.

Третьим параметром идет имя события, которое необходимо определить для элемента. Если передать не корректное имя события, то возникнет ошибка.
Тип параметра - Строка. Параметр является обязательным.

Четвертым параметром идет имя процедуры обработчика события. Если передать не корректное имя процедуры, то ошибки не возникнет, но и отрабатывать событие не будет.
Тип параметра - Строка. Параметр является обязательным.

7. Необходимо добавить на форму новую группу.

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

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

Первым параметром идет форма, на которую необходимо добавить новую группу.
Тип параметра - ФормаКлиентскогоПриложения. Параметр является обязательным.

Вторым параметром идет имя новой группы формы. Имя должно быть уникальным!
Тип параметра - Строка. Параметр является обязательным.

Третьим параметром идет имя элемента формы, который будет выступать родителем для создаваемой группы. Если передать имя элемента, которого нет в дереве элементов, то возникнет ошибка! Если данный параметр не заполнен, то родителем будет выступать сама Форма.
Тип параметра - Строка. Параметр является НЕ обязательным.

Четвертым параметром идет вид группы формы. Если передать вид группы, который не совместим с текущим родителем создаваемой группы, то возникнет ошибка. Если данный параметр не заполнен, то вид группы будет "Обычная группа".
Тип параметра - ВидГруппыФормы. Параметр является НЕ обязательным.

Пятым параметром идет вариант группировки элементов внутри создаваемой группы. Если данный параметр не заполнен, то вариант группировки будет "Горизонтальная если возможно".
Тип параметра - ГруппировкаПодчиненныхЭлементовФормы. Параметр является НЕ обязательным.

Шестым параметром идет признак, нужно ли отображать заголовок создаваемой группы. Если данный параметр не заполнен, то заголовок отображаться не будет.
Тип параметра - Булево. Параметр является НЕ обязательным.

Седьмым параметром идет текст заголовка создаваемой группы. Если шестой параметр не заполнен, либо имеет значение Ложь, то заголовок отображаться не будетЕсли данный параметр не заполнен, то заголовок будет пустым.
Тип параметра - Строка. Параметр является НЕ обязательным.

8. Необходимо добавить на форму новые реквизиты формы.

// Добавляет новые реквизиты формы
//
// Параметры:
//  Форма  - ФормаКлиентскогоПриложения - изменяемая форма
//
//  МассивРеквизитов  - Массив структур - содержит:
//     *ИмяРеквизита  - Строка - имя нового реквизита формы
//     *ТипРевизита  - ОписаниеТипов - тип реквизита. По умолчанию строка неограниченной длины
//     *ЗаголовокРеквизита  - Строка - отображаемый текст реквизита. Не обязательный
//     *Путь  - Строка  - путь к создаваемому реквизиту. Не включает имя реквизита. Не обязательный
//     *СохраняемыеДанные  - Булево  - если реквизит содержит сохраняемые данные. По умолчанию Ложь
//     *РодительЭлемента  - Строка - имя родителя элемента формы,
//	   *ИмяЭлемента  - Строка - если заполнен параметр РодительЭлемента, то дополнительно можно указать имя элемента формы.
//							По умолчанию именем будет ИмяРеквизита
//
Процедура ДобавитьРеквизитыФормы(Форма, МассивРеквизитов) Экспорт

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

Первым параметром идет форма, на которую необходимо добавить новые реквизиты формы.
Тип параметра - ФормаКлиентскогоПриложения. Параметр является обязательным.

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

    ИмяРеквизита - тип Строка - Имя, которое будет присвоено новому реквизиту формы. Имя должно быть уникальным!

    ТипРевизита - тип ОписаниеТипов - Данный параметр определяет, какой(какие) тип(типы) данных может содержать новый реквизит формы. Если данное свойство не определено, то типом данных будет Строка неограниченной длины.

    ЗаголовокРеквизита - тип Строка - Отображаемый заголовок нового реквизита формы. Если данное свойство не определено, то в качестве заголовка будет свойство ИмяРеквизита.

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

    СохраняемыеДанные - тип Булево - Если новый реквизит формы будет содержать сохраняемые данные, то необходимо передать в качестве данного свойства Истина. Если данное свойство не определено, то по умолчанию значение будет Ложь.

    РодительЭлемента - тип Строка - Если, помимо создания реквизита формы, его нужно разместить в дереве элементов, то необходимо определить у структуры данное свойство. Значение данного свойства определяет будет ли новый реквизит размещен в конкретной группе дерева элементов формы, либо в конце дерева элементов. Значением этого свойства должна быть строка, иначе возникнет ошибка! На момент размещения нового элемента формы, его родитель уже должен присутствовать в дереве элементов, иначе возникнет ошибка! Если данное свойство определено, то его необходимо использовать в паре с процедурой "РеквизитыДляРазмещения" из п.1. Если данное свойство не определено, то реквизит не будет размещен в дереве элементов формы. Если данное свойство определено и в качестве значения передана пустая строка, то родителем для нового реквизита будет сама Форма.

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

9. Необходимо добавить на форму новый реквизит формы.

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

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

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

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

Вторым параметром идет имя, которое будет присвоено новому реквизиту формы. Имя должно быть уникальным!
Тип параметра - Строка. Параметр является обязательным.

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

Четвертым параметром идет значение отображаемого заголовка нового реквизита формы. Если данный параметр не заполнен, то в качестве заголовка будет параметр ИмяРеквизита.
Тип параметра - Строка. Параметр является НЕ обязательным.

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

Шестым параметром идет признак, что новый реквизит формы будет содержать сохраняемые данные. Если данный параметр не заполнен, то по умолчанию значение будет Ложь.
Тип параметра - Булево. Параметр является НЕ обязательным.

Седьмым параметром идет имя родительского элемента формы. Данный параметр используется, если, помимо создания реквизита формы, его нужно разместить в дереве элементов. Значение данного параметра определяет будет ли новый реквизит размещен в конкретной группе дерева элементов формы, либо в конце дерева элементов. Значением этого параметра должна быть строка, иначе возникнет ошибка! На момент размещения нового элемента формы, его родитель уже должен присутствовать в дереве элементов, иначе возникнет ошибка! Если данный параметр используется, то его необходимо использовать в паре с процедурой "РеквизитыДляРазмещения" из п.1. Если данный параметр не заполнен, то реквизит не будет размещен в дереве элементов формы. Если данный параметр заполнен и в качестве значения передана пустая строка, то родителем для нового реквизита будет сама Форма.
Тип параметра - Строка. Параметр является НЕ обязательным.

Восьмым параметром идет имя элемента формы, к которому будет относится новый реквизит формы. Используется только в паре с параметром РодительЭлемента. Используется для задания уникального имени нового элемента формы. Имя должно быть уникальнымЕсли данный параметр не заполнен, то именем будет ИмяРеквизита.
Тип параметра - Строка. Параметр является НЕ обязательным.

10. Необходимо добавить для формы новую команду и разместить ее на форме.

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

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

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

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

Вторым параметром идет имя, которое будет присвоено новой команде. Имя должно быть уникальным!
Тип параметра - Строка. Параметр является обязательным.

Третьим параметром идет имя процедуры обработчика для новой команды. Если передать не корректное имя процедуры, то ошибки не возникнет, но и отрабатывать команда не будет.
Тип параметра - Строка. Параметр является обязательным.

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

Пятым параметром идет вид кнопки, к которой будет привязана команда. Если данный параметр не заполнен, то вид кнопки будет либо ОбычнаяКнопка, либо КнопкаКоманднойПанели, в зависимости от родителя.
Тип параметра - ВидКнопкиФормы. Параметр является НЕ обязательным.

Шестым параметром идет заголовок новой кнопки формы. Если данный параметр не заполнен, то заголовок будет определяться от имени команды.
Тип параметра - Строка. Параметр является НЕ обязательным.

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

Восьмым параметром идет картинка для новой кнопки формы.
Тип параметра - Картинка. Параметр является НЕ обязательным.

Девятым параметром идет вариант отображения новой кнопки на форме. Данный параметр будет учитываться только, если заполнен параметр Картинка.
Тип параметра - ОтображениеКнопки. Параметр является НЕ обязательным.

К данной статье я прилагаю обработку, в модуле объекта которой есть:

  • все эти процедуры,
  • дополнительная процедура, которую можно использовать в паре с процедурой общего модуля СобытияФорм.ПриСозданииНаСервере (если в вашей конфигурации она имеется),
  • примеры использования процедур библиотеки.

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

Наименование Файл Версия Размер
Библиотека программного изменения формы (УФ):

.epf 8,81Kb
30
.epf 1.1 8,81Kb 30 Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Yashazz 4308 07.08.20 19:52 Сейчас в теме
Накаркал. Только сегодня поминал про добавление элементов на форму, и вот очередное на эту тему. Воистину, неоскудевающий поток, не хуже перенумераторов)

Оформлено аккуратно, да. Но баян же неимоверный.
nekit_rdx; tsmult; sapervodichka; +3 Ответить
6. BuriyLesha 485 10.08.20 12:12 Сейчас в теме
(1) баян, а так, чтобы взял и вставил готовое в свою конфигурацию, я не нашел :)
поэтому и решил написать статью сам, чтобы всегда было под рукой :)
2. markers 266 08.08.20 04:07 Сейчас в теме
Извините, я не скачивал файл, не могу определить, где предполагается выполнять в частности методы:
ИзменитьСвойстваЭлементовФормы
ИзменитьСвойстваЭлементаФормы
ИзменитьСвойствоЭлементаФормы
Но если предполагается выполнение на стороне клиента, то перед установкой значения, стоит выполнить проверку на тот случай, что данное значение уже установлено. Чтобы например при установке свойства "Видимость", не вызывать лишний раз сервер.
За публикацию - спасибо!
7. BuriyLesha 485 10.08.20 12:18 Сейчас в теме
(2) на рабочей я базе я добавил в процедуру СобытияФорм.ПриСозданииНаСервере вызов экспортной процедуры уже из своего модуля ПрограммнаяМодификацияУФ.МодифицироватьФорму
процедура из модуля СобытияФорм вызывается абсолютно из всех интерактивных форм в конфигурации
а в своей процедуре я, в зависимости от имени открываемой формы, передаю управление в отдельную процедуру для каждой формы, и там вызываю методы библиотеки
но, чтобы было совсем бесшовно, можно использовать и расширение, но нам такой метод не подошел
3. Cmapnep 16 08.08.20 13:42 Сейчас в теме
Интересная реализация, прежде всего тем, что параметры передаются через структуры, а значит они легко расширяются без необходимости изменения существующего кода

Но есть несколько моментов:
1. Нужно бы включить в библиотеку функции инициализации структур для параметров - не верится чтобы вы их вручную создавали для каждого добавляемого реквизита - значит они существуют)
2. Не хватает примеров использования, так сказать best practices
3. Часть функций принимает вместо структуры "сарафан" параметров - имеет смысл их так же привести к единой структуре. Понимаю, что так быстрее и удобнее их использовать, но теряются плюсы, указанные выше
kalyaka; Terve!R; igee12; sapervodichka; +4 Ответить
4. Yashazz 4308 08.08.20 21:50 Сейчас в теме
(3)
Интересная реализация, прежде всего тем, что параметры передаются через структуры, а значит они легко расширяются без необходимости изменения существующего кода
Этой "интересной реализации" сто лет в обед, это одна из хороших практик неимоверной давности, и общеизвестная.
ivv1970; tsmult; sapervodichka; +3 Ответить
5. Cmapnep 16 09.08.20 14:40 Сейчас в теме
(4) Кто спорит-то? Все приемы программирования давно описаны )
Но те реализации программной модификации форм, которые мне попадались, принимают с десяток-другой параметров буквально для всех свойств элементов
А тут коллега сделал "красиво", да еще и выложил для всех - такое можно только приветствовать!
9. BuriyLesha 485 10.08.20 12:31 Сейчас в теме
(4) да, написанное мною общеизвестно и опубликовано на этом и других ресурсах. но когда лично у меня возникла потребность найти такую "библиотеку", которую бери готовую и внедряй себе, я не нашел ни на этом, ни на других ресурсах. поэтому пришлось делать самому. а теперь я делюсь с вами!
вся функциональная часть выложена в открытом доступе. если хотите совсем ничего не делать, то скачивайте обработку, копируйте и наслаждайтесь :)
abasovit; AlexeyMalko; Рамзес; semagin@gmail.com; +4 Ответить
8. BuriyLesha 485 10.08.20 12:27 Сейчас в теме
(3) 1. функций инициализации нет. тут немного другой подход: не нужно передавать ВСЕ, передавай только то, что НУЖНО. именно поэтому я все свойства структуры проверяю через метод "Свойство", чтобы точно знать, что его нужно обработать, а иначе "по умолчанию" ;)

2. с примерами - да, их предостаточно в приложенной обработке, но можно пару простых примеров вынести в сам текст статьи (я подумаю). Но я постарался объяснить все передаваемые свойства и параметры довольно подробно, чтобы вопросов не оставалось ни у кого.

3. пока не понимаю, как вы хотите все процедуры привести к общей структуре? мало общего у размещения реквизита в дерево элементов и изменения свойств элементов
10. Cmapnep 16 10.08.20 17:54 Сейчас в теме
(8)
3 - Имел в виду разные структуры, конечно. В частности для добавления группы и добавления реквизитА
1 - Ну вот, допустим мне нужно добавить 2 элемента с разным составом заполняемый свойств
Для вашей реализации это будет выглядеть примерно так:

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

СтруктураРеквизита = Новый Структура("Имя, Значение", "Элемент1", Новый Структура);
СтруктураРеквизита.Значение.Вставить("ИмяГруппы", "ГруппаШапка");
СтруктураРеквизита.Значение.Вставить("ВидПоляФормы", ВидПоляФормы.ПолеНадписи);
СтруктураРеквизита.Значение.Вставить("ПоместитьПеред", "ГруппаШапка.Дата");
МассивРеквизитов.Добавить(СтруктураРеквизита);

СтруктураРеквизита = Новый Структура("Имя, Значение", "Элемент2", Новый Структура);
СтруктураРеквизита.Значение.Вставить("ИмяГруппы", "ГруппаТаблица");
СтруктураРеквизита.Значение.Вставить("ПоместитьПеред", "ГруппаТаблица.Цена");
СтруктураРеквизита.Значение.Вставить("ОбработкаСобытий", Новый Массив);
СтруктураОбработчика = Новый Структура("Событие, Действие", "ПриИзменении", "Элемент2ПриИзменении");
СтруктураРеквизита.Значение.ОбработкаСобытий.Добавить(СтруктураОбработчика);
МассивРеквизитов.Добавить(СтруктураРеквизита);

ОбщийМодуль.РазместитьРеквизитыНаФорме(ЭтаФорма, МассивРеквизитов);
Показать


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

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

СтруктураРеквизита = ОбщийМодуль.СтруктураНовогоЭлемента("Элемент1");
СтруктураРеквизита.Значение.ИмяГруппы = "ГруппаШапка";
СтруктураРеквизита.Значение.ВидПоляФормы = ВидПоляФормы.ПолеНадписи;
СтруктураРеквизита.Значение.ПоместитьПеред = "ГруппаШапка.Дата";
МассивРеквизитов.Добавить(СтруктураРеквизита);

СтруктураРеквизита = ОбщийМодуль.СтруктураНовогоЭлемента("Элемент2");
СтруктураРеквизита.Значение.ИмяГруппы = "ГруппаТаблица";
СтруктураРеквизита.Значение.ПоместитьПеред = "ГруппаТаблица.Цена";
СтруктураОбработчика = ОбщийМодуль.СтруктураНовогоОбработчика("ПриИзменении", "Элемент2ПриИзменении");
СтруктураРеквизита.Значение.ОбработкаСобытий.Добавить(СтруктураОбработчика);
МассивРеквизитов.Добавить(СтруктураРеквизита);

ОбщийМодуль.РазместитьРеквизитыНаФорме(ЭтаФорма, МассивРеквизитов);
Показать


Так, ИМХО, более читабельно и меньше кода писать
Ну а в функциях вместо существования свойств можно проверять ЗначениеЗаполнено()
11. BuriyLesha 485 11.08.20 04:09 Сейчас в теме
(10) в моей базе это выглядит так
Процедура МодифицироватьФорму_КонтактныеЛицаПартнеров_ФормаЭлемента(Форма)
	
	СтруктураПараметров = Новый Структура;
	СтруктураПараметров.Вставить("ИмяГруппы", 		"ГруппаОсновныеСведения");
	СтруктураПараметров.Вставить("ПоместитьПеред", 	"ГруппаРодители");
	
	МассивРеквизитов = Новый Массив;
	МассивРеквизитов.Добавить(ПолучитьЗаполненнуюСтруктуру("ДолжностьДляПечати", СтруктураПараметров));
	
	РазместитьРеквизитыНаФорме(Форма, МассивРеквизитов);
		
КонецПроцедуры	

// Создает новую структуру для добавления элемента формы, и заполняет ее 
//
// Параметры:
//  ИмяРеквизита  - Строка - Имя добавляемого элемента
//
//  ПараметрыРеквизита  - Структура - см. описание РазместитьРеквизитыНаФорме
//
// Возвращаемое значение:
//   Структура   - заполненная структура
//
Функция ПолучитьЗаполненнуюСтруктуру(Имя, Значение)

	СтруктураПараметров = Новый Структура;
	
	СтруктураПараметров.Вставить("Имя", 	 Имя);
	СтруктураПараметров.Вставить("Значение", Значение);
	
	Возврат СтруктураПараметров;

КонецФункции
Показать


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


Ну а в функциях вместо существования свойств можно проверять ЗначениеЗаполнено()

специально избегал ЗначениеЗаполнено, ибо это свойство может быть не передано, и с-но красная ошибка. при работе со структурами предпочитаю использовать именно метод свойство, т.к. этого свойства там может и не быть
12. Cmapnep 16 11.08.20 09:18 Сейчас в теме
(11) Ну какая-то инициализация структуры все таки присутствует (ПолучитьЗаполненнуюСтруктуру)

думаю на вкус и цвет все мы разные :)

Тут не могу не согласиться))
13. dandykry 7 18.08.20 09:53 Сейчас в теме
14. BuriyLesha 485 18.08.20 09:58 Сейчас в теме
(13) может быть у Вас есть что-то, чем можно расширить мою библиотеку!
15. dandykry 7 18.08.20 10:01 Сейчас в теме
(14) Это текущее состояние реализации в боевой. Есть улучшенное состояние, с исправлением предыдущих ошибок на основании опыта, но еще не внедренное и прошедшее боевое крещение. Когда-нибудь будет время, выложу, или может нет, потому что "баяны" не качают)
16. BuriyLesha 485 18.08.20 12:15 Сейчас в теме
(15) эх, как часто ищешь на просторе интернета какой-нибудь "баян", чтобы быстро внедрить его себе, но их никто не пишет, ибо "баян"...
17. dandykry 7 18.08.20 12:36 Сейчас в теме
(16) Развивай тему библиотеки и будь первым. Это ж ниша для майнинга стартманей)
Собери активное сообщество, экосистему, можете даже на гитхаб выложить или сделать альфа/бетта версию, красиво все оформить в публикации и за реальные денюшки продавать)

У меня раньше были такие мысли, но что-то как то они поубавились)
18. retr0 20.08.21 10:04 Сейчас в теме
Так в ДО уже давно реализован модуль РаботаСФормами, уже есть че надо, можно расшарить по мере необходимости.
BuriyLesha; +1 Ответить
19. infosoft-v 619 31.08.21 09:24 Сейчас в теме
(18) Добрый день. ДО это конфигурация Документооборот 8 ред.2.1? Не могу найти в ней общий модуль РаботаСФормами. Уточните пожалуйста наименование конфигурации и общего модуля.
20. Дмитрий74Чел 217 02.12.21 15:01 Сейчас в теме
(19) ДО 3.0.4.41 - но очень примитивные методы на 3 строчки. Хуже чем в ЕРПУХ (УХ).
Оставьте свое сообщение

См. также

Работа со схемой запроса Промо

Инструментарий разработчика v8 v8::Запросы Абонемент ($m)

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

1 стартмани

24.04.2018    55611    kalyaka    41    

Автоматический перезапуск рабочих процессов (rphost) кластера 1С

Инструментарий разработчика v8 Абонемент ($m)

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

10 стартмани

08.07.2021    2939    zhichkin    0    

Запуск фонового задания во внешней обработке без регистрации в справочнике "Дополнительные отчеты и обработки"

Инструментарий разработчика v8::УФ ЗУП3.x Россия Абонемент ($m)

Описал, как показать прогресс выполнения длительной операции во внешней обработке, и при этом не регистрировать обработку в справочнике "ДополнительныеОтчетыИОбработки". Проверял на БСП версии "3.1.2.264".

1 стартмани

09.03.2020    10682    VinnieThePOOH    6    

Вывод сообщений в HTML поле средствами 1С

Инструментарий разработчика v8 v8::УФ Абонемент ($m)

Пример использования вывода большого количества сообщений в поле HTML. С возможностью открывать ссылочные объекты и создавать новые объекты передавая параметры прямо из HTML поля. Протестировано на релизах 8.3.12 и 8.3.15+

2 стартмани

31.01.2020    19912    burni4    16    

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов Промо

Универсальные функции HighLoad оптимизация Инструментарий разработчика v8 1cv8.cf Россия Абонемент ($m)

Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

26.05.2017    52744    DarkAn    87    

Массовое изменение режима поддержки объектов конфигурации

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Что делать, если при сравнении/объединении конфигураций нужно изменить режим поддержки для большого количества объектов? Штатного механизма для выполнения подобной задачи в Платформе нет. Изменять режим для всей конфигурации? Описывается способ, позволяющий выполнить изменение режима только для нужных объектов.

05.11.2019    5731    VKislitsin    12    

Многопоточная обработка данных на примере перепроведения документов

Инструментарий разработчика v8 ERP2 УТ11 КА2 Абонемент ($m)

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

1 стартмани

17.09.2019    14969    ids79    46    

Централизованное управление кластером 1С Предприятия, состоящим из нескольких рабочих серверов, работающих на платформе GNU/Linux

Инструментарий разработчика v8 Абонемент ($m)

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

1 стартмани

26.08.2019    4542    Sloth    0    

Hello world на metadata.js Промо

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Про браузерные offline-first приложения можно написать миллионы слов. Сэкономлю своё и ваше время и перейду сразу к делу. В статье не будет рекламы и агитации за новые технологии, не будет критики традиционных или попсовых решений. Рассмотрим по шагам разработку простейшей программы на metadata.js. Постараюсь сделать акцент не на том «как это сделано», а «почему сделано именно так»

1 стартмани

11.08.2016    70948    unpete    209    

Менеджер потоков: реализация "любой" задачи в потоках

Инструментарий разработчика v8 Абонемент ($m)

Менеджер потоков – один их новых инструментов, который упрощает работу разработчиков. Насколько легко с ним, на конференции Infostart Event 2018 Education показал начальник отдела автоматизации 1С Иван Филимонов компании «Трансстроймеханизация».

01.08.2019    12317    DarkAn    7    

Просто комбо, два в одном, или как напечатать два макета (стандартный и измененный) одной печатной формы

Инструментарий разработчика v8 БП3.0 БУ Абонемент ($m)

Алгоритм и расширение (как пример) демонстрируют механизм одновременного использования двух макетов (стандартного и измененного), принадлежащих одной записи регистра «Макеты печатных форм» («ПользовательскиеМакетыПечати») в конфигурации «1С:Бухгалтерия предприятия, редакция 3.0».

1 стартмани

26.06.2019    5152    delta    0    

Использование фреймворка "Тестирование 3.0" (https://testingtool.ru) для тестирования веб-приложений

Инструментарий разработчика v8 Абонемент ($m)

Рассматривается использование фреймворка "Тестирование 3.0" (https://testingtool.ru) для тестирования веб-приложений.

1 стартмани

24.12.2018    5812    AlexKo    9    

Создание внешних печатных форм под управляемым приложением с нуля Промо

Инструментарий разработчика v8 v8::УФ 1cv8.cf Абонемент ($m)

Когда мне пришлось создавать внешние печатные формы под приложения на БСП ("1С: Бухгалтерия предприятия 3.0", "1С: Управление торговлей 11"), я обнаружил, что нет грамотных инструкций. Те, что имелись, использовали так называемые шаблоны: готовые обработки, в которых необходимо выполнять определенные корректировки. Но как создать сам шаблон, конкретных мануалов не было, справочную информацию я нашел на сайте ИТС и, обработав ее, написал статью, где подробно и понятно объясняются все этапы создания внешней печатной формы для управляемого приложения на примере конфигурации "1С: Бухгалтерия предприятия 3.0"

1 стартмани

05.06.2014    343419    signum2009    133    

HTTP Сервисы: Путь к своему сервису. Часть 4

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

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

1 стартмани

28.09.2018    36086    dsdred    18    

Сортировка метаданных с учетом объектов на замке

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

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

1 стартмани

16.08.2018    4559    Olenevod    1    

HTTP Сервисы: Путь к своему сервису. Часть 2

Инструментарий разработчика v8 1cv8.cf ERP2 УТ11 КА2 Абонемент ($m)

Продолжение статьи «HTTP Сервисы: Путь к своему сервису. Часть 1». В этой части будет "Микс" из OData+HTTP-Сервис(Get)+СКД. Наш пример будет работать как в браузере, так и в написанной нами обработке. Работать будем с разными версиями платформ.

1 стартмани

13.08.2018    49388    dsdred    2    

Мониторинг журнала регистрации при помощи Powershell

Инструментарий разработчика v8 Абонемент ($m)

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

1 стартмани

12.07.2018    13970    user768334    7    

Заполнение документа Word без ComОбъект

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Идея написать публикацию пришла после прочтения очередного рассказа о том, как файл Word заполнялся через COM-объект в клиент-серверном варианте. При этом падал Сервер 1С. Зачем в принципе использовать файлы Word как шаблоны? Ну, допустим, в организации используется некая внутренняя отчетность, выполнения в корпоративном стиле, и переделать ее на привычные табличные документы нет возможности.

1 стартмани

08.07.2018    20017    nbeliaev    36    

Tool1CD: отрежем донорскую почку

Инструментарий разработчика v8 Розница Абонемент ($m)

Ваша база мертва? Что ж, кое-что в ней ещё теплится.

1 стартмани

15.05.2018    19686    dmpas    13    

Использование регулярных выражений (RegExp) в Linux

Инструментарий разработчика v8 Абонемент ($m)

Описывается способ использования регулярных выражений (RegExp) в Linux с использованием тех же компонентов, что и в Windows (COM-объекты VBScript.RegExp).

1 стартмани

20.04.2018    9617    vsbronnikov    12    

Тестирование: пример создания сценарного UI теста для платформы 1С

Инструментарий разработчика v8 ERP2 УТ11 Абонемент ($m)

В этой статье мы расскажем, как создать сценарный UI-тест. Опишем последовательность действий и покажем, как это сделать с использованием инструментария. Рассмотрим пример, максимально приближенный к боевому, покажем на примере конфигураций УТ11/ERP проверку бизнес-процесса "Продажа". Вы сможете убедиться, что создание сценарных тестов для платформы 1С на самом деле относительно быстрый и простой процесс.

1 стартмани

17.04.2018    24584    ivanov660    11    

Внешняя печатная форма с вводом параметров через дополнительную форму

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

Удобный ввод параметров в печатную форму с помощью дополнительной формы

1 стартмани

23.03.2018    34378    Margo462    23    

Обработка печатной формы WORD клиент-сервер УФ

Инструментарий разработчика v8::УФ 1cv8.cf Абонемент ($m)

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

2 стартмани

14.03.2018    30966    LeoKeyn    43    

Мониторинг изменений рабочих конфигураций. Часть 1. Сохранение конфигураций из базы SQL без конфигуратора

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

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

1 стартмани

28.02.2018    21039    user768334    25    

Консоль запросов со встроенным Конструктором запросов для 1с8.3 (8.2) своими руками

Инструментарий разработчика v8 v8::УФ v8::Запросы 1cv8.cf Абонемент ($m)

Мы можем сами создать свою консоль запросов - именно такую, которая подходит для наших нужд. Кроме того, создав собственную Консоль запросов, Вы не только получаете удобный для себя инструмент, а также получаете навык программирования в среде 1с8, что очень полезно будет начинающим программистам 1С.

1 стартмани

21.12.2017    25667    jan-pechka    24    

Практика доступа в базу 1С через протокол oData. Чтение данных

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Для чего нужен доступ в базу 1С через REST-интерфейс по протокол oData? Как его организовать? Как не будучи гуру в JavaScript и .NET получить быстрый визуальный доступ к данным базы 1С? Попробую дать ответ на эти вопросы и прокомментирую некоторые нюансы, с которыми я столкнулся.

1 стартмани

11.12.2017    135140    Dementor    73    

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

Инструментарий разработчика v8 Абонемент ($m)

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

1 стартмани

24.09.2017    45410    vandalsvq    80    

Интеграция сценарного тестирования в процесс разработки

Инструментарий разработчика v8::УФ Абонемент ($m)

Эта статья является практическим пособием по внедрению тестирования на основе сценариев в процесс разработки программного обеспечения на базе платформы 1С:Предприятие 8.3. Документ отличает прикладная направленность, в нем содержится много кода, подходов и конкретики. Все рассмотренные примеры основаны на использовании бесплатной конфигурации Тестер

1 стартмани

04.07.2017    32160    grumagargler    30    

Передача параметра из формы документа в форму выбора. 1С: 8.2, обычные формы

Инструментарий разработчика v8 УТ10 Абонемент ($m)

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

1 стартмани

18.05.2017    9679    Sanek32    6    

Перехват методов серверных (x64) контекстов с использованием DynamicWrapperX

Инструментарий разработчика v8 Абонемент ($m)

Применение COM-объекта DynamicWrapperX на x64-сервере приложений.

1 стартмани

23.03.2017    12213    chessman    7    

1С:Предприятие 8.2. Управляемая Форма. Меняем иконку рабочего стола.

Инструментарий разработчика v8 1cv8.cf Россия Абонемент ($m)

Для конфигураций имеющих свой дизайн важно иметь возможность сменить не только картинки разделов для созданных подсистем, но и картинку рабочего стола, но менять ее нет возможности. Сама 1С объясняет это тем что интерфейс любой конфигурации должен быть унифицирован: "Дело не в одной картинке, а в общей стилистике для любых конфигураций. Важно чтобы пользователи привыкали к общему стилю и одинаково воспринимали одинаковые элементы в разных конфигурациях - это ускорит и освоение конфигураций и повседневную работу пользователей с ними." Но все же можно попытаться ее сменить.

1 стартмани

28.09.2012    31239    ghostaz    39    

Как написать COM-объект для 1С на Visual Studio C# 2008

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Расширяем функционал 1С с помощью разработки подключаемого COM-объекта! Пишем код на Visual C# 2008 для открытия CD-ROM'а, получения списка процессов и использования возможностей системы text-to-speech.

5 стартмани

11.09.2012    86614    RainyAugust22    57    

Пример печатной формы "с выбором" без формы выбора

Взаиморасчеты Инструментарий разработчика v8 БП2.0 Россия БУ Абонемент ($m)

Пример реализации внешней печатной формы с выбором ответственного лица без формы выбора

1 стартмани

13.06.2012    13622    Dasty    8    

Подсветка синтаксиса 1C (в том числе языка запросов) в Notepad++

Инструментарий разработчика v8 1cv8.cf Россия Абонемент ($m)

Конфигуратор 1С как редактор кода не всегда удовлетворяет потребностям программиста в управлении кода. Я зачастую с завистью вспоминаю другие среды разработки программ, и нередко копировал куски 1С кода в стороннюю программу для каких-либо манипуляций - например, Notepad++. К сожалению, в нём нет встроенной поддержки синтаксиса кода 1С, из-за чего пришлось определять свой. Вот об этом я и расскажу.

1 стартмани

27.03.2012    38208    CratosX    35    

Текстовые экспандеры - в помощь программисту 1С

Инструментарий разработчика v8 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

27.07.2011    27223    tomvlad    44