#Область Интерфейс
//Функция создает элемент Группа в коллекции Элементы по переданным параметрам
//Параметры:
// Форма - Форма
// ИмяГруппы - Строка - имя новой группы
// Группировка - ГруппировкаПодчиненныхЭлементовФормы
// Родитель - Элемент - Группа формы (куда поместить)
// Поведение - ПоведениеОбычнойГруппы
// Заголовок - Строка - заголовок группы
// Свернута - Булево - если установлено и ПоведениеОбычнойГруппы.Свертываемая, то сворачивается
Функция СоздатьГруппу(Форма, ВидГруппы, ИмяГруппы, Родитель, Заголовок = "", ГруппировкаПараметр = Неопределено, Поведение = Неопределено, Свернута = Истина) Экспорт
Группировка = ?(ЗначениеЗаполнено(ГруппировкаПараметр), ГруппировкаПараметр, ГруппировкаПодчиненныхЭлементовФормы.Вертикальная);
ОтображениеСтраниц = ОтображениеСтраницФормы.ЗакладкиСверху;
НоваяГруппа = Форма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"), Родитель);
НоваяГруппа.РастягиватьПоГоризонтали = Истина;
НоваяГруппа.РастягиватьПоВертикали = Истина;
НоваяГруппа.Вид = ВидГруппы;
НоваяГруппа.Заголовок = Заголовок;
Если НоваяГруппа.Вид = ВидГруппыФормы.Страницы Тогда
НоваяГруппа.ОтображениеСтраниц = ОтображениеСтраниц;
Иначе
НоваяГруппа.Группировка = Группировка;
Если НоваяГруппа.Вид = ВидГруппыФормы.ОбычнаяГруппа Тогда
Если Поведение = Неопределено Тогда
Поведение = ПоведениеОбычнойГруппы.Обычное
КонецЕсли;
НоваяГруппа.Поведение = Поведение;
НоваяГруппа.ЗаголовокСвернутогоОтображения = Заголовок;
НоваяГруппа.ОтображатьЗаголовок = ЗначениеЗаполнено(Заголовок);
Если Поведение = ПоведениеОбычнойГруппы.Свертываемая И Свернута Тогда
НоваяГруппа.Скрыть();
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат НоваяГруппа;
КонецФункции
//Функция создает элемент ПолеФормы для выбора из справочника "ЗначенияСвойствОбъектов) по переданным параметрам.
//Кроме основного, создается дополнительный реквизит формы для хранения соответствующего свойства (для создания связи с владельцем значения).
//Параметры:
// Форма - Форма
// ИмяПоля - Строка - имя нового основного элемента
// Родитель - Элемент - Группа формы (куда поместить)
// Заголовок - Строка - заголовок поля
// БыстрыйВыбор- Булево - если установлено, то устанавливается БыстрыйВыбор для нового элемента
Процедура СоздатьПолеДопЗначения(Форма, ИмяПоля, Родитель, Заголовок, БыстрыйВыбор = Истина, ВидПоля = Неопределено) Экспорт
ТипСвойства = Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения");
ТипДопЗначения = Новый ОписаниеТипов("СправочникСсылка.ЗначенияСвойствОбъектов");
ИмяВладельца = "Свойство" + ИмяПоля;
СоздатьРеквизит(Форма, ИмяВладельца, ТипСвойства);
Форма[ИмяВладельца] = ПолучитьСоздатьСвойство(ИмяПоля);
СоздатьРеквизит(Форма, ИмяПоля, ТипДопЗначения);
НовыйЭлемент = СоздатьПоле(Форма, ИмяПоля, Родитель, Заголовок, ВидПоля, , ИмяВладельца, БыстрыйВыбор);
КонецПроцедуры
//Функция создает реквизит и элемент ПолеФормы по переданным параметрам.
//Параметры:
// Форма - Форма
// ИмяПоляИРеквизита - Строка - имя нового поля и реквизита
// ТипРеквизита - (Описание типов) - тип реквизита для создания нового поля формы
// Родитель - Элемент - Группа формы (куда поместить)
// ЗаголовокПоля - Строка - заголовок поля
Функция СоздатьПолеСРеквизитом(Форма, ИмяПоляИРеквизита, ТипРеквизита, Родитель, ЗаголовокПоля = "", ВидПоля = Неопределено) Экспорт
СоздатьРеквизит(Форма, ИмяПоляИРеквизита, ТипРеквизита);
Возврат СоздатьПоле(Форма, ИмяПоляИРеквизита, Родитель, ЗаголовокПоля, ВидПоля);
КонецФункции
//Функция создает элемент КнопкаФормы по переданным параметрам.
//Параметры:
// Форма - Форма
// ИмяКнопкиИКоманды - Строка - имя новой кнопки и одноименной команды
// Родитель - Элемент - Группа формы (куда поместить)
// ЗаголовокКнопки - Строка - заголовок кнопки
Функция СоздатьКнопку(Форма, ИмяКнопкиИКоманды, Родитель, ЗаголовокКнопки = "") Экспорт
ИмяКоманды = ИмяКнопкиИКоманды;
НоваяКоманда = Форма.Команды.Добавить(ИмяКоманды);
НоваяКоманда.Действие = ИмяКоманды;
НовоеПоле = Форма.Элементы.Добавить(ИмяКнопкиИКоманды, Тип("КнопкаФормы"), Родитель);
НовоеПоле.ИмяКоманды = ИмяКоманды;
Если ЗначениеЗаполнено(ЗаголовокКнопки) Тогда
НовоеПоле.Заголовок = ЗаголовокКнопки;
КонецЕсли;
Возврат НовоеПоле;
КонецФункции
//Функция создает реквизит формы по переданным параметрам.
//Параметры:
// Форма - Форма
// ИмяРеквизита- Строка - имя создаваемого реквизита
// ТипРеквизита- (Описание типов) - тип нового реквизита
Процедура СоздатьРеквизит(Форма, ИмяРеквизита, ТипРеквизита) Экспорт
ДобавляемыеРеквизиты = Новый Массив();
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизита, ТипРеквизита));
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
КонецПроцедуры
//Функция создает элемент ПолеФормы (ввода или картинки) по переданным параметрам
//Параметры:
// Форма - Форма
// ИмяПоля - Строка - имя нового элемента
// Родитель - Элемент - Группа формы (куда поместить)
// Заголовок - Строка - заголовок поля
// ЭтоВставка - Булево - если установлено, то вставляется выше первого элемента родителя
// ЭтоКартинка - Булево - если установлено, то вид поля устанавливается ВидПоляФормы.ПолеКартинки, иначе ВидПоляФормы.ПолеВвода
// ИмяВладельца- Строка - имя элемента связь с которым будет установлена по "Отбор.Владелец"
// БыстрыйВыбор- Булево - если установлено, то устанавливается БыстрыйВыбор для нового элемента
Функция СоздатьПоле(Форма, ИмяПоля, Родитель, Заголовок = "", ВидПоля = Неопределено, ЭтоВставка = Ложь, ИмяВладельца = Неопределено, БыстрыйВыбор = Ложь) Экспорт
ТипПоляФормы = Тип("ПолеФормы");
Если ВидПоля = Неопределено Тогда
ВидПоля = ВидПоляФормы.ПолеВвода;
КонецЕсли;
ПодчиненныеЭлементыРодителя = Родитель.ПодчиненныеЭлементы;
Если ЭтоВставка И ПодчиненныеЭлементыРодителя.Количество() > 0 Тогда
НовоеПоле = Форма.Элементы.Вставить(ИмяПоля, ТипПоляФормы, Родитель, ПодчиненныеЭлементыРодителя[0]);
Иначе
НовоеПоле = Форма.Элементы.Добавить(ИмяПоля, ТипПоляФормы, Родитель);
КонецЕсли;
НовоеПоле.Вид = ВидПоля;
НовоеПоле.ПутьКДанным = ИмяПоля;
НовоеПоле.Заголовок = Заголовок;
Если БыстрыйВыбор Тогда
НовоеПоле.БыстрыйВыбор = БыстрыйВыбор;
КонецЕсли;
Если НовоеПоле.Заголовок = "" Тогда
НовоеПоле.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
КонецЕсли;
Если Не ИмяВладельца = Неопределено Тогда
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", ИмяВладельца);
НовыйМассив = Новый Массив();
НовыйМассив.Добавить(НоваяСвязь);
НовыеСвязи = Новый ФиксированныйМассив(НовыйМассив);
НовоеПоле.СвязиПараметровВыбора = НовыеСвязи;
КонецЕсли;
Возврат НовоеПоле;
КонецФункции
#КонецОбласти
#Область Свойства
// Универсальная функция. Получает ссылку на свойство по имени. В случае отсутствия, если задан тип, создает свойство.
// Параметры:
// ИмяСвойства - (Строка) Для поиска и создания, при отсутствии.
// ТипЗначения - (Описание типов) Для создания нового свойства, при отсутствии.
// Комментарий - (Строка)
// ЭтоДополнительноеСведение - (Булево)
// НаборСвойств - (СправочникСсылка.НаборыДополнительныхРеквизитовИСведений) Для включения в набор.
// НаименованиеСвойства - (Строка) Для назначения или изменения наименования и заголовка.
Функция ПолучитьСоздатьСвойство(ИмяСвойства, ТипЗначения = Неопределено, Комментарий = "", ЭтоДополнительноеСведение = Истина,
НаборСвойств = Неопределено, НаименованиеСвойства = "") Экспорт
Свойство = Неопределено;
СоздатьСвойство = Ложь;
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("ИмяСвойства", ИмяСвойства);
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка
|ИЗ
| ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
|ГДЕ
| ДополнительныеРеквизитыИСведения.Имя = &ИмяСвойства
| И НЕ ДополнительныеРеквизитыИСведения.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Свойство = Выборка.Ссылка;
Иначе
Если Не ТипЗначения = Неопределено Тогда
СоздатьСвойство = Истина;
КонецЕсли;
КонецЕсли;
Если СоздатьСвойство Или ЗначениеЗаполнено(НаименованиеСвойства) И Не Свойство.Наименование = НаименованиеСвойства Тогда
Попытка
Если СоздатьСвойство Тогда
СвойствоОбъект = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
Иначе
СвойствоОбъект = Свойство.ПолучитьОбъект();
КонецЕсли;
СвойствоОбъект.Наименование = ?(ЗначениеЗаполнено(НаименованиеСвойства), НаименованиеСвойства, ИмяСвойства);
СвойствоОбъект.Имя = ИмяСвойства;
СвойствоОбъект.Доступен = Истина;
СвойствоОбъект.ТипЗначения = ТипЗначения;
СвойствоОбъект.ЭтоДополнительноеСведение = ЭтоДополнительноеСведение;
СвойствоОбъект.Комментарий = Комментарий;
СвойствоОбъект.Заголовок = СвойствоОбъект.Наименование;
СвойствоОбъект.ДополнительныеЗначенияИспользуются = Истина;
СвойствоОбъект.Виден = Истина;
СвойствоОбъект.НаборСвойств = НаборСвойств;
СвойствоОбъект.Записать();
Свойство = СвойствоОбъект.Ссылка;
Если СоздатьСвойство И ЗначениеЗаполнено(НаборСвойств) Тогда
Если НаборСвойств.ДополнительныеРеквизиты.Найти(Свойство, "Свойство") = Неопределено Тогда
НаборДополнительныхРеквизитов = НаборСвойств.ПолучитьОбъект();
ТабЧасть = НаборДополнительныхРеквизитов.ДополнительныеРеквизиты;
НоваяСтрока = ТабЧасть.Добавить();
НоваяСтрока.Свойство = Свойство;
НаборДополнительныхРеквизитов.КоличествоРеквизитов = ТабЧасть.Количество();
НаборДополнительныхРеквизитов.Записать();
КонецЕсли;
КонецЕсли;
Исключение
КонецПопытки;
КонецЕсли;
Возврат Свойство;
КонецФункции
// Универсальная функция. Получает значение свойства. При заполненном параметре ЗначениеСвойства может свойство установить.
// Параметры:
// Свойство_Или_Имя - Либо свойство (ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения), либо Имя (строка)
// СсылкаНаОбъект - Объект в регистре сведений "ДополнительныеСведения"
// ЗначениеСвойства - Значение, передаваемое для установки.
Функция ПолучитьУстановитьЗначениеСвойства(Свойство_Или_Имя, СсылкаНаОбъект, ЗначениеСвойства = Неопределено) Экспорт
Ответ = Неопределено;
Если ТипЗнч(Свойство_Или_Имя) = Тип("Строка") Тогда
Свойство = ПолучитьСоздатьСвойство(Свойство_Или_Имя);
Иначе
Свойство = Свойство_Или_Имя;
КонецЕсли;
Если Не Свойство = Неопределено Тогда
Попытка
МЗ = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
МЗ.Объект = СсылкаНаОбъект;
МЗ.Свойство = Свойство;
МЗ.Прочитать();
Если Не МЗ.Выбран() Или (Не ЗначениеСвойства = Неопределено И Не МЗ.Значение = ЗначениеСвойства) Тогда
Если Не ЗначениеСвойства = Неопределено Тогда
МЗ.Объект = СсылкаНаОбъект;
МЗ.Свойство = Свойство;
МЗ.Значение = ЗначениеСвойства;
МЗ.Записать();
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(МЗ.Значение) Тогда
Ответ = МЗ.Значение;
КонецЕсли;
Исключение
КонецПопытки;
КонецЕсли;
Возврат Ответ;
КонецФункции
// Универсальная функция. Получает объект определенного типа по уникальному значению свойства.
// Параметры:
// Свойство_Или_Имя - Либо свойство (ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения), либо Имя (строка)
// ЗначениеСвойства - значение, передаваемое для поиска объекта.
// ИмяМетаданные - Имя метаданных (например - "Документ.ЗаказКлиента"). Сильно ускоряет запрос.
Функция ПолучитьОбъектПоЗначениюСвойства(Свойство_Или_Имя, ЗначениеСвойства, ИмяМетаданные) Экспорт
Ответ = Неопределено;
Если ТипЗнч(Свойство_Или_Имя) = Тип("Строка") Тогда
Свойство = ПолучитьСоздатьСвойство(Свойство_Или_Имя);
Иначе
Свойство = Свойство_Или_Имя;
КонецЕсли;
Если Не Свойство = Неопределено Тогда
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеСведения.Объект КАК Объект,
| ДополнительныеСведения.Свойство КАК Свойство,
| ДополнительныеСведения.Значение КАК Значение
|ИЗ
| РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Значение = &ЗначениеСвойства
| И ДополнительныеСведения.Свойство = &Свойство
| И ДополнительныеСведения.Объект ССЫЛКА Справочник.Номенклатура";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "Справочник.Номенклатура", ИмяМетаданные);
Запрос.УстановитьПараметр("Свойство", Свойство);
Запрос.УстановитьПараметр("ЗначениеСвойства", ЗначениеСвойства);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Ответ = Выборка.Объект;
КонецЕсли;
КонецЕсли;
Возврат Ответ;
КонецФункции
#КонецОбласти