Получить свойство по имени, создать его при отсутствии
Теги: 1С,вдв

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

# Код реализации

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

	Свойство = Неопределено;

	СоздатьСвойство = Ложь;

	Запрос = Новый Запрос();
	Запрос.УстановитьПараметр("ИмяСвойства", ИмяСвойства);
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка
	|ИЗ
	|	ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
	|ГДЕ
	|	ДополнительныеРеквизитыИСведения.Имя = &ИмяСвойства
	|	И НЕ ДополнительныеРеквизитыИСведения.ПометкаУдаления";

	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Свойство = Выборка.Ссылка;
	Иначе
		Если Не ТипЗначения = Неопределено Тогда
			СоздатьСвойство = Истина;
		КонецЕсли;
	КонецЕсли;

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

	Возврат Свойство;

КонецФункции
```