1С 8.3 Библиотека программного изменения формы (УФ) - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

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

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

   Команда = Форма.Команды.Добавить(ИмяКоманды);
   Команда.Действие = ДействиеКоманды;

   Если ЗначениеЗаполнено(Заголовок) Тогда
       Команда.Заголовок = Заголовок;
   КонецЕсли;

   Если Картинка <> Неопределено Тогда

       Команда.Картинка = Картинка;

       Если ОтображениеКнопки <> Неопределено Тогда
           Команда.Отображение = ОтображениеКнопки;
       КонецЕсли;

   КонецЕсли;

   Если ИмяГруппы = Неопределено Тогда
       Возврат;
   ИначеЕсли ЗначениеЗаполнено(ИмяГруппы) Тогда
       ЭлементРодитель = Форма.Элементы[ИмяГруппы];
   Иначе
       ЭлементРодитель = Форма;
   КонецЕсли;

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

   Если ВидКнопки <> Неопределено Тогда
       КнопкаФормы.Вид = ВидКнопки;
   КонецЕсли;

   Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
       Форма.Элементы.Переместить(КнопкаФормы, ЭлементРодитель, Форма.Элементы[ПоместитьПеред]);
   КонецЕсли;

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

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

   Если ЗначениеЗаполнено(ТипРеквизита) Тогда
       СтруктураРеквизита.Вставить("ТипРеквизита", ТипРеквизита);
   КонецЕсли;

   Если ЗначениеЗаполнено(ЗаголовокРеквизита) Тогда
       СтруктураРеквизита.Вставить("ЗаголовокРеквизита", ЗаголовокРеквизита);
   КонецЕсли;

   Если ЗначениеЗаполнено(Путь) Тогда
       СтруктураРеквизита.Вставить("Путь", Путь);
   КонецЕсли;

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

   Если ЗначениеЗаполнено(РодительЭлемента) Тогда
       СтруктураРеквизита.Вставить("РодительЭлемента", РодительЭлемента);
   КонецЕсли;

   Если ЗначениеЗаполнено(ИмяЭлемента) Тогда
       СтруктураРеквизита.Вставить("ИмяЭлемента", ИмяЭлемента);
   КонецЕсли;

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

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

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

   ДобавляемыеРеквизиты     = Новый Массив;
   РеквизитыДляРазмещения     = Новый Массив;

   Для Каждого ОписаниеРеквизита Из МассивРеквизитов Цикл

       ИмяРеквизита = ОписаниеРеквизита.ИмяРеквизита;

       Если ОписаниеРеквизита.Свойство("ТипРеквизита") Тогда
           ТипРеквизита = ОписаниеРеквизита.ТипРеквизита;
       Иначе
           ТипРеквизита = Новый ОписаниеТипов("Строка");
       КонецЕсли;

       ЗаголовокРеквизита = "";

       Если ОписаниеРеквизита.Свойство("ЗаголовокРеквизита") Тогда
           ЗаголовокРеквизита = ОписаниеРеквизита.ЗаголовокРеквизита;
       КонецЕсли;

       Путь = "";

       Если ОписаниеРеквизита.Свойство("Путь") Тогда
           Путь = ОписаниеРеквизита.Путь;
       КонецЕсли;

       СохраняемыеДанные = Ложь;

       Если ОписаниеРеквизита.Свойство("СохраняемыеДанные") Тогда
           СохраняемыеДанные = ОписаниеРеквизита.СохраняемыеДанные;
       КонецЕсли;

       РеквизитФормы = Новый РеквизитФормы(ИмяРеквизита, ТипРеквизита, Путь, ЗаголовокРеквизита, СохраняемыеДанные);

       ДобавляемыеРеквизиты.Добавить(РеквизитФормы);

       //+ Дополнительное размещение реквизитов на форме
       Если ОписаниеРеквизита.Свойство("РодительЭлемента") Тогда

           СтруктураЭлемента = Новый Структура;
           СтруктураЭлемента.Вставить("ИмяГруппы", ОписаниеРеквизита.РодительЭлемента);

           Если ОписаниеРеквизита.Свойство("Путь") Тогда
               Шаблон = "%1.%2";
               ПутьКДанным = СтрШаблон(Шаблон, ОписаниеРеквизита.Путь, ИмяРеквизита);
           Иначе
               ПутьКДанным = ИмяРеквизита;
           КонецЕсли;

           СтруктураЭлемента.Вставить("ПутьКДанным", ПутьКДанным);

           ИмяЭлемента = ИмяРеквизита;

           Если ОписаниеРеквизита.Свойство("ИмяЭлемента") Тогда
               ИмяЭлемента = ОписаниеРеквизита.ИмяЭлемента;
           КонецЕсли;

           СтруктураРеквизитов = Новый Структура;
           СтруктураРеквизитов.Вставить(ИмяЭлемента, СтруктураЭлемента);

           РеквизитыДляРазмещения.Добавить(СтруктураРеквизитов);

       КонецЕсли;
       //- Дополнительное размещение реквизитов на форме

   КонецЦикла;

   Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
   РазместитьРеквизитыНаФорме(Форма, РеквизитыДляРазмещения);

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

   Для Каждого ТекРеквизит Из МассивРеквизитов Цикл

       ИмяРеквизита         = ТекРеквизит.Имя;
       ПараметрыРеквизита     = ТекРеквизит.Значение;

       Если ПараметрыРеквизита.Свойство("ИмяГруппы") Тогда
           ЭлементРодитель = Форма.Элементы[ПараметрыРеквизита.ИмяГруппы];
       Иначе
           ЭлементРодитель = Форма;
       КонецЕсли;

       Элемент = Форма.Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), ЭлементРодитель);

       Если ПараметрыРеквизита.Свойство("ПутьКДанным") Тогда
           Элемент.ПутьКДанным = ПараметрыРеквизита.ПутьКДанным;
       Иначе
           Элемент.ПутьКДанным = "Объект." + ИмяРеквизита;
       КонецЕсли;

       Если ПараметрыРеквизита.Свойство("ВидПоляФормы") Тогда
           Элемент.Вид = ПараметрыРеквизита.ВидПоляФормы;
       Иначе
           Элемент.Вид = ВидПоляФормы.ПолеВвода;
       КонецЕсли;

       Если ПараметрыРеквизита.Свойство("Видимость") Тогда
           Элемент.Видимость = ПараметрыРеквизита.Видимость;
       КонецЕсли;

       Если ПараметрыРеквизита.Свойство("ТолькоПросмотр") Тогда
           Элемент.ТолькоПросмотр = ПараметрыРеквизита.ТолькоПросмотр;
       КонецЕсли;

       Если ПараметрыРеквизита.Свойство("Доступность") Тогда
           Элемент.Доступность = ПараметрыРеквизита.Доступность;
       КонецЕсли;

       Если ПараметрыРеквизита.Свойство("ПоместитьПеред") Тогда
           Форма.Элементы.Переместить(Элемент, ЭлементРодитель, Форма.Элементы[ПараметрыРеквизита.ПоместитьПеред]);
       КонецЕсли;

       //--- обработчики событий
       Если ПараметрыРеквизита.Свойство("ОбработкаСобытий")
           И ТипЗнч(ПараметрыРеквизита.ОбработкаСобытий) = Тип("Массив") Тогда

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

       КонецЕсли;

   КонецЦикла;

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

   //Для каждого ТекРеквизит Из МассивРеквизитов Цикл

       УстановитьПривилегированныйРежим(Истина);
       Если ЗначениеЗаполнено(ИмяГруппы) Тогда
           ЭлементРодитель = Форма.Элементы[ИмяГруппы];
       Иначе
           ЭлементРодитель = Форма;
       КонецЕсли;


       Элемент = Форма.Элементы.Добавить(Имя, Тип("ПолеФормы"), ЭлементРодитель);

       Если ЗначениеЗаполнено(Заголовок) Тогда
           Элемент.Заголовок = Заголовок;
       КонецЕсли;

       Если ЗначениеЗаполнено(ПутьКДанным) Тогда
           Элемент.ПутьКДанным = ПутьКДанным;
       Иначе
           Элемент.ПутьКДанным = "Объект." + Имя;
       КонецЕсли;

       Если ЗначениеЗаполнено(ПутьКДаннымПодвала) Тогда
           Элемент.ПутьКДаннымПодвала = ПутьКДаннымПодвала;
       КонецЕсли;

       Если ПВидПоляФормы <> Неопределено Тогда
           Элемент.Вид = ПВидПоляФормы;
       Иначе
           Элемент.Вид = ВидПоляФормы.ПолеВвода;
       КонецЕсли;

       Если ЗначениеЗаполнено(Видимость) Тогда
           Элемент.Видимость = Видимость;
       КонецЕсли;

       Если ЗначениеЗаполнено(ТолькоПросмотр) Тогда
           Элемент.ТолькоПросмотр = ТолькоПросмотр;
       КонецЕсли;

       Если ЗначениеЗаполнено(Доступность) Тогда
           Элемент.Доступность = Доступность;
       КонецЕсли;

       Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
           Форма.Элементы.Переместить(Элемент, ЭлементРодитель, Форма.Элементы[ПоместитьПеред]);
       КонецЕсли;

       //--- обработчики событий
       Если ОбработкаСобытий <> Неопределено
           И ТипЗнч(ОбработкаСобытий) = Тип("Массив") Тогда

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

       КонецЕсли;

   //КонецЦикла;

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

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

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

   Если НЕ ПустаяСтрока(РодительГруппы) Тогда
       ЭлементРодитель = Форма.Элементы[РодительГруппы];
   Иначе
       ЭлементРодитель = Форма;
   КонецЕсли;

   ГруппаФормы = Форма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"), ЭлементРодитель);

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

   Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
       Форма.Элементы.Переместить(ГруппаФормы, Форма.Элементы[РодительГруппы], Форма.Элементы[ПоместитьПеред]);
   КонецЕсли;

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


       Если ЗначениеЗаполнено(ИмяГруппы) Тогда
           ЭлементРодитель = Форма.Элементы[ИмяГруппы];
       Иначе
           ЭлементРодитель = Форма;
       КонецЕсли;


       Элемент = Форма.Элементы.Добавить(Имя, Тип("ТаблицаФормы"), ЭлементРодитель);

       Если ЗначениеЗаполнено(ПутьКДанным) Тогда
           Элемент.ПутьКДанным = ПутьКДанным;
       Иначе
           Элемент.ПутьКДанным = "Объект." + Имя;
       КонецЕсли;

       Если ЗначениеЗаполнено(Видимость) Тогда
           Элемент.Видимость = Видимость;
       КонецЕсли;

       Если ЗначениеЗаполнено(ТолькоПросмотр) Тогда
           Элемент.ТолькоПросмотр = ТолькоПросмотр;
       КонецЕсли;

       Если ЗначениеЗаполнено(Доступность) Тогда
           Элемент.Доступность = Доступность;
       КонецЕсли;

       Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
           Форма.Элементы.Переместить(Элемент, ЭлементРодитель, Форма.Элементы[ПоместитьПеред]);
       КонецЕсли;

       Элемент.Подвал = Подвал;

       //--- обработчики событий
       Если ОбработкаСобытий <> Неопределено
           И ТипЗнч(ОбработкаСобытий) = Тип("Массив") Тогда

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

       КонецЕсли;

   //КонецЦикла;

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

   //Защита от дурака
   Если ТекстЗапроса = "" И ТаблицаСписка = "" Тогда Сообщить("Ошибка формирования динамического списка, укажите запрос или таблицу"); Возврат; КонецЕсли;

   Элементы = Форма.Элементы;

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

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

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

   //Заполняем параметры если они были указаны
   Если ПараметрыЗапроса <> Неопределено Тогда
       Для Каждого Параметра Из ПараметрыЗапроса Цикл
           РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);
       КонецЦикла;
   КонецЕсли;

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

   //Если своя панель тогда скрываем стандартную
   Если СвояКоманднаяПанель Тогда
       Элементы[ИмяСписка].ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
   КонецЕсли;

   //Создание колонок на основание МассивКолонок
   Для Каждого Элемента Из МассивКолонок Цикл
       ПараметрыКолонки = СтрЗаменить(Элемента,",",Символы.ПС);
       Если СтрЧислоСтрок(ПараметрыКолонки) > 1 Тогда
           Заголовок = СтрПолучитьСтроку(ПараметрыКолонки, 1);
           ИмяКолонки = СтрПолучитьСтроку(ПараметрыКолонки, 2);
       Иначе
           Заголовок = "";
           ИмяКолонки = ПараметрыКолонки;
       КонецЕсли;
       НоваяКолонкаТаблицы = Элементы.Добавить(ИмяСписка + ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы);
       Если Заголовок <> "" Тогда НоваяКолонкаТаблицы.Заголовок = Заголовок; КонецЕсли;
       НоваяКолонкаТаблицы.ПутьКДанным = ИмяСписка + "." + ИмяКолонки;
   КонецЦикла;

   //Задаем действия (События) на основание СписокДействий, если он определен
   Если СписокДействий <> Неопределено Тогда
       ПереченьСвойств = "ПриИзменении
      |Выбор
      |ПриАктивизацииСтроки
      |ВыборЗначения
      |ПриАктивизацииПоля
      |ПриАктивизацииЯчейки
      |ПередНачаломДобавления
      |ПередНачаломИзменения
      |ПередУдалением
      |ПриНачалеРедактирования
      |ПередОкончаниемРедактирования
      |ПриОкончанииРедактирования
      |ОбработкаВыбора
      |ПередРазворачиванием
      |ПередСворачиванием
      |ПослеУдаления
      |ПриСменеТекущегоРодителя
      |ОбработкаЗаписиНового
      |ПриСохраненииПользовательскихНастроекНаСервере
      |ПередЗагрузкойПользовательскихНастроекНаСервере
      |ПриЗагрузкеПользовательскихНастроекНаСервере
      |ПриОбновленииСоставаПользовательскихНастроекНаСервере
      |ОбработкаЗапросаОбновления
      |ПриПолученииДанныхНаСервере
      |НачалоПеретаскивания
      |ПроверкаПеретаскивания
      |ОкончаниеПеретаскивания
      |Перетаскивание";
       Для Счетчик = 1 По 28 Цикл
           ИмяСвойства = СтрПолучитьСтроку(ПереченьСвойств, Счетчик);
           Элементы[ИмяСписка].УстановитьДействие(ИмяСвойства,?(СписокДействий.Свойство(ИмяСвойства),СписокДействий[ИмяСвойства],""));
       КонецЦикла;
   КонецЕсли;

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

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

КонецПроцедуры
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 21.12.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому