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