Добавление таблицы значения с помощью дополнительных реквизитов и расширения конфигурации. На примере Документооборот 2.1.6.8

Публикация № 551045

Разработка - Практика программирования

Расширения конфигурации ТЗ Таблицы значений доп реквизит

15
Способ хранения таблицы значений в доп. реквизитах, ну или в доп. сведениях без редактирования конфигурации.

Я не утверждаю, что никто не придумывал данный способ, но на подобное решение я не натыкался. Заранее скажу, вариант не идеален, и сгодится только под определенные задачи.

Самый главный минус это то, что будет использоваться строка неограниченной длины а, следовательно, с поиском в ней будут определенные сложности. Если таблица значений не большая, тогда можно ограничение поставить 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;
		КонецЕсли;	
	КонецЕсли;	
КонецПроцедуры

 

15

Скачать файлы

Наименование Файл Версия Размер
Расширение с примером для Документооборота 2.1.6.8
.cfe 46,17Kb
24.09.16
12
.cfe Документооборота 2.1.6.8 46,17Kb 12 Скачать

См. также

Специальные предложения

Лучшие комментарии
5. kn 92 22.06.18 13:00 Сейчас в теме
Хоть в Дополнительных сведения в режиме Предприятия и можно указывать тип строка неограниченной длины, в конфигураторе видно что максимально там можно хранить строку длиной 1024.И экспериментально тоже строка длинная обрезалась.
За работу с json спасибо пригодилась, в итоге пришлось хранить строку json в прикрепленном файле. https://infostart.ru/public/610983/
Прикрепленные файлы:
9. AneJIbcuH 5 16.01.19 09:01 Сейчас в теме
(5) Просто не правильно "готовите" доп. реквизит.
подробнее тут в комментарии http://forum.infostart.ru/forum9/topic207792/message2125779/#message2125779

А в данной публикации поправить одну строчку:
перЗначение = ?(НайденныеСтроки.Количество() = 1, НайденныеСтроки[0].ТекстоваяСтрока, Неопределено);
Остальные комментарии
Избранное Подписка Сортировка: Древо
1. vik.senuty 26.09.16 10:23 Сейчас в теме
2. dsdred 1187 26.09.16 16:43 Сейчас в теме
(1) vik.senuty,
Да, действительно близко, но для отчетов, согласен смысл практически тот же.
3. Waanneek 84 28.07.17 15:01 Сейчас в теме
делали таким способом ТЗ в строку, можно даже не JSON а СтрокаТЗ = ЗначениеВСтрокуВнутр(ТЗ);


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

сделали таким образом....

несколько месяцев спустя клиент дает пример отчета, где участвуют остатки по материалам из регистров накопления и колонки где нужны данные из этой ТЗ )))) приплыли..))

не в курсе чем дело кончилось (другому программисту отдали задачу), кажется всетаки добавили реквизиты в регистр накопления и как-то эти данные туда засунули))
4. dsdred 1187 28.07.17 15:27 Сейчас в теме
(3) Поэтому нужно сразу с клиентом обговаривать такие моменты.
Хотя опять же смотря какая сложность отчета...
Варианты делать без изменений придумать можно (к примеру конфа для хранения данных с подключением по oData), но всегда ли это оправдано?
5. kn 92 22.06.18 13:00 Сейчас в теме
Хоть в Дополнительных сведения в режиме Предприятия и можно указывать тип строка неограниченной длины, в конфигураторе видно что максимально там можно хранить строку длиной 1024.И экспериментально тоже строка длинная обрезалась.
За работу с json спасибо пригодилась, в итоге пришлось хранить строку json в прикрепленном файле. https://infostart.ru/public/610983/
Прикрепленные файлы:
6. dsdred 1187 22.06.18 13:15 Сейчас в теме
(5) Спасибо за информацию.
9. AneJIbcuH 5 16.01.19 09:01 Сейчас в теме
(5) Просто не правильно "готовите" доп. реквизит.
подробнее тут в комментарии http://forum.infostart.ru/forum9/topic207792/message2125779/#message2125779

А в данной публикации поправить одну строчку:
перЗначение = ?(НайденныеСтроки.Количество() = 1, НайденныеСтроки[0].ТекстоваяСтрока, Неопределено);
10. dsdred 1187 16.01.19 11:33 Сейчас в теме
(9)Спасибо за комментарий.
Одной строчкой тут не обойтись, но смысл понятен. На досуге поправлю.
7. fomix 26 25.07.18 14:51 Сейчас в теме
Улыбнуло - ТЗ <АдекватностьКонтактныхЛиц> ))))
8. dsdred 1187 06.08.18 21:13 Сейчас в теме
(7) Немного юмора в нашей жизни не помешает ))
Оставьте свое сообщение