Данная публикация является первой в цикле публикаций, посвящённых используемых технологий в решении РеСольДо. Основная цель публикаций поделиться используемыми технологиями с читателями, которые смогут воспользоваться представленными материалами для решения своих практических задач. Каждая публикация будет посвящена описанию отдельной задачи с приведением описания её решения. Автор не претендует на новаторство – большинство (если не все) из предложенных технологий ранее уже были представлены публике.
Задача №1: Динамическое отражение структуры и значений табличных частей документа на форме
Первой решаемой задачей будет динамическое отражение структуры и значений всех табличных частей выбранного документа. Для экспериментов возьмём документ ‘Авансовый отчет’, который представлен в большинстве учётных решений 1С. Также его наименование в разных конфигурациях 1С не отличается (в отличие от документов поступлений/реализаций, наименование которых отличается в 1С:Бухгалтерия, 1С:УНФ и 1С:ERP).
Решение задачи №1
Для начала создадим внешнюю обработку с единственным реквизитом ‘АвансовыйОтчет’ с соответствующим типом.
Затем создадим форму и вынесем реквизит ‘АвансовыйОтчет’ на неё. Также активируем ‘КнопкуВыбора’.
Создадим два события. Сначала ‘ПриСозданииНаСервере’.
Для события напишем код, который при создании формы на сервере будет программно создавать элемент формы ‘Страницы’.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// создадим главную страницу
СтраницаСТЧ = ЭтаФорма.Элементы.Добавить("СтраницаСДТЧ",Тип("ГруппаФормы"));
СтраницаСТЧ.Вид = ВидГруппыФормы.Страницы;
КонецПроцедуры
Теперь создадим второе событие ‘АвансовыйОтчетПриИзменении’, которое будет инициализироваться при изменении (выборе) документа ‘Авансовый отчет’.
Для события напишем следующий программный код:
&НаКлиенте
Процедура АвансовыйОтчетПриИзменении(Элемент)
СоздатьСтраницыСТЧДокументаНаФорме();
КонецПроцедуры
Создадим процедуру ‘СоздатьСтраницыСТЧДокументаНаФорме’ со следующим кодом:
&НаСервере
Процедура СоздатьСтраницыСТЧДокументаНаФорме() Экспорт
ВидРасходногоДокумента = "АвансовыйОтчет";
МассивДобавленныхЭлементов = Новый Массив;
ТабличныеЧасти = Метаданные.Документы[ВидРасходногоДокумента].ТабличныеЧасти;
ПерваяЗаполненнаяСтраница = "";
// добавим страницу с ТЧ документа
Для Каждого ТекСтрока Из ТабличныеЧасти Цикл
КоличествоСтрокВТЧ = Объект[ВидРасходногоДокумента][ТекСтрока.Имя].Количество();
ЕстьДанныеВТекТЧ = Объект[ВидРасходногоДокумента][ТекСтрока.Имя].Количество() > 0;
ТекТЧДокумента = Объект[ВидРасходногоДокумента][ТекСтрока.Имя];
РеквизитыТабличнойЧасти = ТабличныеЧасти[ТекСтрока.Имя].Реквизиты;
// эти страницы надо добавить
НазваниеЭлементаДляДобавления = "Страница" + ТекСтрока.Имя;
ТакойЭлементУжеЕсть = ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ЭтаФорма.Элементы, НазваниеЭлементаДляДобавления);
Если ТакойЭлементУжеЕсть Тогда
// страница была создана ранее
Иначе
СтраницаНастройкаТЧ = ЭтаФорма.Элементы.Добавить(НазваниеЭлементаДляДобавления,Тип("ГруппаФормы"), ЭтаФорма.Элементы.СтраницаСДТЧ);
СтраницаНастройкаТЧ.Вид = ВидГруппыФормы.Страница;
КонецЕсли;
ЭтаФорма.Элементы[НазваниеЭлементаДляДобавления].Заголовок = ТекСтрока.Синоним + " ("+ КоличествоСтрокВТЧ + ")";
// сохраним название первой заполненной страницы
Если Не ЗначениеЗаполнено(ПерваяЗаполненнаяСтраница) и КоличествоСтрокВТЧ > 0 Тогда
ПерваяЗаполненнаяСтраница = НазваниеЭлементаДляДобавления;
КонецЕсли;
ТЧДляСоздания = "ДТЧ" + ТекСтрока.Имя;
ТакойЭлементУжеЕсть = ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ЭтаФорма, ТЧДляСоздания);
Если ТакойЭлементУжеЕсть Тогда
// страница была создана ранее
Иначе
нРеквизиты = Новый Массив;
нРеквизиты.Добавить(Новый РеквизитФормы(ТЧДляСоздания, Новый ОписаниеТипов("ТаблицаЗначений"),, ТекСтрока.Синоним));
ЭтаФорма.ИзменитьРеквизиты(нРеквизиты);
РеСольДоЭлемент = ЭтаФорма.Элементы.Добавить(ТЧДляСоздания, Тип("ТаблицаФормы"), СтраницаНастройкаТЧ);
РеСольДоЭлемент.ПутьКДанным = ТЧДляСоздания;
РеСольДоЭлемент.КоманднаяПанель.Видимость = Ложь;
// создаем элементы табличной части
нРеквизиты = Новый Массив;
нРеквизиты.Добавить(Новый РеквизитФормы("Выбрана", Новый ОписаниеТипов("Булево"), ТЧДляСоздания, "Выбрана"));
Для Каждого ТекРеквизитТЧ ИЗ РеквизитыТабличнойЧасти Цикл
нРеквизиты.Добавить(Новый РеквизитФормы(ТекРеквизитТЧ.Имя, Новый ОписаниеТипов(ТекРеквизитТЧ.Тип), ТЧДляСоздания, ТекРеквизитТЧ.Синоним));
КонецЦикла;
ЭтаФорма.ИзменитьРеквизиты(нРеквизиты);
// описываем элементы
// создаем для всех ТЧ поле выбора строк
РеСольДоЭлемент = ЭтаФорма.Элементы.Добавить(ТЧДляСоздания + "Выбрана", Тип("ПолеФормы"), ЭтаФорма.Элементы[ТЧДляСоздания]);
РеСольДоЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
РеСольДоЭлемент.ПутьКДанным = ТЧДляСоздания + ".Выбрана";
РеСольДоЭлемент.Видимость = Истина;
Для Каждого ТекРеквизитТЧ ИЗ РеквизитыТабличнойЧасти Цикл
РеСольДоЭлемент = ЭтаФорма.Элементы.Добавить(ТЧДляСоздания + ТекРеквизитТЧ.Имя, Тип("ПолеФормы"), ЭтаФорма.Элементы[ТЧДляСоздания]);
// поле ввода
РеСольДоЭлемент.Вид = ВидПоляФормы.ПолеВвода;
РеСольДоЭлемент.ПутьКДанным = ТЧДляСоздания + "." + ТекРеквизитТЧ.Имя;
КонецЦикла;
КонецЕсли;
ЭтаФорма[ТЧДляСоздания].Загрузить(ТекТЧДокумента.Выгрузить());
КонецЦикла;
Если ЗначениеЗаполнено(ПерваяЗаполненнаяСтраница) Тогда
// сделаем активной первую заполненную страницу
Элементы.СтраницаСДТЧ.ТекущаяСтраница = ЭтаФорма.Элементы[ПерваяЗаполненнаяСтраница];
КонецЕсли;
КонецПроцедуры
После этого сохраним обработку, откроем её в режиме ‘Предприятие’ и после выбора документа ‘Авансовый отчет’ должны отразиться табличные части документа.
Особенность предложенного решения заключается в следующем:
- табличные части и их реквизиты создаются на форме программно;
- каждая новая табличная часть создаётся как отдельная страница на форме;
- программно создаётся столбец ‘Выбрана’ с типом Булево;
- после создания всех элементов на форме осуществляется автоматический переход на первую страницу, содержащую заполненную (количество строк больше нуля) табличную часть.
Вы можете самостоятельно создать обработку для динамического отражения структуры и значения табличных частей документа. Для этого вам помогут приведенные в данной публикации модули. Или можете скачать уже готовую обработку, приложенную к данной публикации.
Разработка и тестирование обработки осуществлялись на типовой конфигурации «1С:Бухгалтерия предприятия, редакция 3.0 (3 3.0.152.23)» и платформе 1С:Предприятие 8.3 (8.3.22.2239). Работать данная обработка должна практически на любой типовой управляемой конфигурации 1С, содержащий документ ‘Авансовый отчет’.