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