Создание дополнительного реквизита в наборе
Теги: 1С,вдв

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

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

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

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

	Свойство = ПолучитьСоздатьСвойство(ИмяСвойства, ТипЗначения, , Ложь, Набор, НаименованиеСвойства);

	Если Не Свойство = Неопределено И Не МассивЗначений = Неопределено Тогда

			ТаблицаНужныхЗначений = Новый ТаблицаЗначений();
		    ТаблицаНужныхЗначений.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка", , , , Новый КвалификаторыСтроки(100)));
			Для Сч = 1 По МассивЗначений.Количество() Цикл
			    ТаблицаНужныхЗначений.Добавить();
			КонецЦикла;
		    ТаблицаНужныхЗначений.ЗагрузитьКолонку(МассивЗначений, "Наименование");

			ЗапросЗначения = Новый Запрос();
			ЗапросЗначения.УстановитьПараметр("Владелец", Свойство);
			ЗапросЗначения.УстановитьПараметр("ТаблицаНужныхЗначений", ТаблицаНужныхЗначений);
			ЗапросЗначения.Текст = "ВЫБРАТЬ
			                       |	ТаблицаНужныхЗначений.Наименование КАК Наименование
			                       |ПОМЕСТИТЬ ТаблицаНужныхЗначений
			                       |ИЗ
			                       |	&ТаблицаНужныхЗначений КАК ТаблицаНужныхЗначений
			                       |;
			                       |
			                       |////////////////////////////////////////////////////////////////////////////////
			                       |ВЫБРАТЬ
			                       |	ТаблицаНужныхЗначений.Наименование КАК Наименование
			                       |ИЗ
			                       |	ТаблицаНужныхЗначений КАК ТаблицаНужныхЗначений
			                       |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
			                       |		ПО ТаблицаНужныхЗначений.Наименование = ЗначенияСвойствОбъектов.Наименование
			                       |			И (ЗначенияСвойствОбъектов.Владелец = &Владелец)
			                       |ГДЕ
			                       |	ЗначенияСвойствОбъектов.Наименование ЕСТЬ NULL";

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

	КонецЕсли;

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

# Примечания

- Функция ПолучитьСоздатьСвойство(), которая используется в шаблоне:
https://fastcode.im/Templates/10022/poluchit-svojstvo-po-imeni-sozdat-ego-pri-otsutstvii