Розміщення таблиці значень з допомогою доп реквізиту і розширення конфігурації 1С

Мене дуже часто запитують, як додати таблицю до документа або довідником?
І дійсно, як зробити таку задачу не ускладнюючи подальше оновлення конфігурації? І начебто є дод. реквізити і дод. відомості, але чому ж вони не можуть приймати тип таблиці значень?


У результаті найчастіше використовується 2 варіанти:

1. Простий спосіб. Прямо в об'єкті додається таблиця, а потім або програмно або жорстко(вручну) виводиться на форму.
Мінуси. Оновлення конфігурації буде вимагати дотримання змін і підвищеної пильності, щоб не втратити ці зміни.
Плюси. найпростіший варіант для розробки, до таблиці значень можна звертатися без танців з бубном, наприклад через запити.
2. Нормальний варіант, але теж з доопрацюванням конфігурації.
Додається об'єкт з таблицею значень і реквізитом з посиланням на об'єкт батько, дана таблиця значень виводиться, наприклад, через розширення конфігурації на форму основного об'єкта.
Плюси. Просте оновлення, до таблиці значень можна звертатися, наприклад через запити.
Мінуси. Потрібно більше передбачити різні обмеження на створений об'єкт, а, отже, вимагає певних знань. Можливо, буде потрібно додавання ролі\їй і налаштування профілів користувачів.
Є, звичайно, ще інші варіанти приміром з сховищем, але стаття не про це…

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

Уже понад півроку тримаю в голові цей спосіб, але жодного разу його не застосовував. Ось, нарешті, дійшли руки. Я не стверджую, що ніхто не придумував даний спосіб, але на подібне рішення я не натикався. Заздалегідь скажу, варіант не ідеальний, і згодиться тільки під певні завдання.

Самий головний мінус це те, що буде використовуватись рядок необмеженої довжини а, отже, з пошуком у неї будуть певні складнощі. Самий головний плюс, об'єкти конфігурації не правляться.

Приклад продемонструю на конфігурації Документообіг 2.1.6.8. Буду використовувати додатковий реквізит, але можна використовувати додаткові відомості. Весь код написаний в Розширенні конфігурації.

Завдання:
Відразу кажу задачка більше жартівлива для демонстрації методу. Наприклад, нам знадобилося додати табличну частину «Адекватність контактних осіб», вона повинна бути у довіднику Контрагенти і містити колонки: Контактна особа, Рада (певна рекомендація по спілкуванню з контактною особою), Тип контакту.

1 Додаємо дод. реквізит і називаємо його приміром «ТЗ_АдекватностьКонтактныхЛиц».
Я цей реквізит роблю загальним для всіх видів контрагентів. Тип його буде рядок необмеженої довжини.



2 Створюємо Розширення конфігурації і Допрацьовуємо форму Контрагентів.
Додаємо реквізити форми:

— «ДопТЗ» тип ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения
— ТЗ_АдекватностьКонтактныхЛиц тип ТаблицаЗначений:
КонтактноеЛицо тип СправочникСсылка.КонтактныеЛица
ТипКонтакта тип Рядок
Рада тип Рядок



Додаємо на форму сторінку «ГруппаАдекватностьКонтактныхЛиц» і знімаємо видимість.
В дану групу виводимо «ТЗ_АдекватностьКонтактныхЛиц»



3 Пишемо код.
ПриСозданииНаСервере.
Необхідно вважати сам доп реквізит нагадаю ми його обізвали «ТЗ_АдекватностьКонтактныхЛиц», далі прочитати його значення та побудувати за значенням таблицю значень.

Значення доп реквізиту я пропоную зберігати у форматі JSON, у кого більш стара платформа можна використовувати XML.

Процедура ДопТЗ_ПриСозданииНаСервере(Відмова, СтандартнаяОбработка)
//Зчитуємо доп реквізит
//ТЗ_АдекватностьКонтактныхЛиц - У моєму прикладі доп реквізит називається так
ДопТЗ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ТЗ_АдекватностьКонтактныхЛиц");

Якщо ЗначениеЗаполнено(ДопТЗ) Тоді
//Якщо знайшли властивість тоді робимо сторінку з ТЗ видимій
Елементи.ГруппаАдекватностьКонтактныхЛиц.Видимість = True;

//Зчитуємо значення доп реквізиту
НайденныеСтроки = Об'єкт.ДополнительныеРеквизиты.НайтиСтроки(Новий Структура("Властивість", ДопТЗ));
перЗначение = ?(НайденныеСтроки.Кількість() = 1, НайденныеСтроки[0].Значення, Визначено);

//Якщо значення прочитали намагаємося прочитати з JSON
Якщо перЗначение <> Визначено Тоді
//Читаємо JSON
ЧтениеJSON = Новий ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(перЗначение);
Спроба
ДопДанные = ПрочитатьJSON(ЧтениеJSON);
Виняток
ДопДанные = "";
КонецПопытки;
//Якщо повернувся масив значить JSON прочитали нормально
//Заповнюємо ТЗ_АдекватностьКонтактныхЛиц
Якщо ТипЗнч(ДопДанные) = Тип("Масив") Тоді
Для Кожного СтрокаДД з ДопДанные Цикл 
СтрАдекватов = ТЗ_АдекватностьКонтактныхЛиц.Додати();
//Ми вже наперед знаємо який елемент потрібно шукати по унікальному ідентифікатору
СтрАдекватов.КонтактноеЛицо = ПолучитьСсылкуПоGUIDИВидуОбъекта(СтрокаДД.КонтактноеЛицо,"Довідники.КонтактныеЛица");
СтрАдекватов.ТипКонтакта = СтрокаДД.ТипКонтакта;
СтрАдекватов.Рада = СтрокаДД.Рада;
КонецЦикла;
КонецЕсли;

КонецЕсли;
КонецЕсли;

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

//Функція повернення Посилання по унікальному ідентифікатору і виду об'єкта
&НаСервере
Функція ПолучитьСсылкуПоGUIDИВидуОбъекта(GUIDВх,ВидОбъектаВх) Експорт
Результат=Визначено;
Спроба
Виконати("Результат = "+ВидОбъектаВх+".ПолучитьСсылку(Новий УникальныйИдентификатор("""+GUIDВх+"""));");
Виняток
КонецПопытки;
Повернення Результат;
КонецФункции


ПриОткрытии. Програмно ховаємо дод. реквізит. Він зберігає JSON, тому особливо нецікавий.

&НаКлиенте
Процедура ДопТЗ_ПриОткрытии(Відмова)
Якщо ЗначениеЗаполнено(ДопТЗ) Тоді
//Шукаємо на формі потрібний нам доп реквізит
//Свойства_ОписаниеДополнительныхРеквизитов - У документообігу, в інших конфігураціях швидше за все по іншому.
НайденныеСтроки = ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(Новий Структура("Властивість", ДопТЗ));
//Ховаємо елемент програмно
Якщо НайденныеСтроки.Кількість() = 1 Тоді 
Елементи[НайденныеСтроки[0].ИмяРеквизитаЗначение].Видимість = False;
КонецЕсли; 
КонецЕсли;
КонецПроцедуры

ПередЗаписьюНаСервере. Якщо ТЗ змінилася зберігаємо її у вигляді рядка JSON в дод. реквізит.

Процедура ДопТЗ_ПередЗаписьюНаСервере(Відмова, ТекущийОбъект, ПараметрыЗаписи)
Якщо ЗначениеЗаполнено(ДопТЗ) Тоді 
//Свойства_ОписаниеДополнительныхРеквизитов - У документообігу, в інших конфігураціях швидше за все по іншому.
НайденныеСтроки = ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(Новий Структура("Властивість", ДопТЗ));

//Описуємо параметри запису і створюємо запис JSON
ПараметрыJSON = Новий ПараметрыЗаписиJSON(ПереносСтрокJSON.Ні, " " , Істина, ЭкранированиеСимволовJSON.Ні, Брехня, Брехня, Брехня, Брехня);
ЗаписьJSON = Новий ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = True;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
//Створюємо масив структур на підставі ТЗ_АдекватностьКонтактныхЛиц
МассивАдекватов = Новий Масив;
Для Кожного СтрокаТЗ з ТЗ_АдекватностьКонтактныхЛиц Цикл
МассивАдекватов.Додати(Новий Структура("КонтактноеЛицо,ТипКонтакта,Рада",
Рядок(СтрокаТЗ.КонтактноеЛицо.УникальныйИдентификатор()),
СтрокаТЗ.ТипКонтакта,
СтрокаТЗ.Порада));

КонецЦикла;
//Записуємо масив вигляді рядка JSON 
ЗаписатьJSON(ЗаписьJSON, МассивАдекватов);
СтрокаJSON = ЗаписьJSON.Закрити();

//Якщо ТЗ змінили записуємо нове значення доп реквізиту
Якщо ЭтаФорма[НайденныеСтроки[0].ИмяРеквизитаЗначение] <> СтрокаJSON Тоді
ЭтаФорма[НайденныеСтроки[0].ИмяРеквизитаЗначение] = СтрокаJSON;
КонецЕсли; 
КонецЕсли; 
КонецПроцедуры


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.