Управляемая форма списка с данными двух таблиц — иерархического справочника и регистра сведений для мобильной платформы

Суть проблемы в отсутствии возможности делать запросы на мобильной платформе 8.3 — дерево (иерархия если)/таблица значений, выборка справочника, срез регистра сведений. В остальных клиентах эта проблема легко решается динамическим списком со своим запросом, это не является предметом данной статьи.

Если нужна иерархия, то приходится использовать рекурсию. Предлагаю свой рабочий код для тестовой конфигурации. Простой случай без иерархии, надеюсь, рассматривать смысла нет.

Создаём форму списка для справочника (или общую форму), удаляем от туда Реквизит Список и добавляем Реквизит Дерево — с типом ДеревоЗначений. Добавляем необходимые колонки внутри реквизиты (в моём случае Ссылка и Цена) [для ссылки Заголовок указал — Товар].

Далее при создании на сервере описываем событие формы «ПриСозданииНаСервере»

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ТолькоПросмотр =  Истина;

ВидЦен = ПолучитьВидЦен();
НачалоДня = НачалоДня(ТекущаяДата());

ОбновитьСписок();

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

Ну и сопутствующие функции в этот же модуль формы:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ТолькоПросмотр =  Истина;

ВидЦен = ПолучитьВидЦен();
НачалоДня = НачалоДня(ТекущаяДата());

ОбновитьСписок();

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

&НаСервере
Процедура ОбновитьСписок()
ТоварыВыборка = Справочники.Товары.ВыбратьИерархически(,,,"Наименование");
Корень = Дерево.ПолучитьЭлементы();
Корень.Очистить();

ЦеныТоваров = РегистрыСведений.ЦеныТоваров;
ЦеныТоваровОтбор = Новый Структура("Товар, ВидЦен");
ЗаполнитьЗначенияСвойств(ЦеныТоваровОтбор, ЭтаФорма);
//ЦеныТоваровОтбор.ВидЦен = ВидЦен;

Пока ТоварыВыборка.Следующий() Цикл
//выходИзИерархии:
текЭлемент = Корень.Добавить();
ЗаполнитьЗначенияСвойств(текЭлемент, ТоварыВыборка);
Если ТоварыВыборка.ЭтоГруппа Тогда
Если ЗаполняемВеткуДерева(текЭлемент, ТоварыВыборка, ЦеныТоваровОтбор, ЦеныТоваров) Тогда
Перейти ~выходИзИерархии;
КонецЕсли;

Возврат;
Иначе
ПодгружаемДополнительныеДанные(текЭлемент, ТоварыВыборка, ЦеныТоваровОтбор, ЦеныТоваров);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

&НаСервере
Функция ЗаполняемВеткуДерева(текКорень, ТоварыВыборка, ЦеныТоваровОтбор, ЦеныТоваров)
Корень = текКорень.ПолучитьЭлементы();
текСсылка = ТоварыВыборка.Ссылка;

Пока ТоварыВыборка.Следующий() Цикл
//выходИзИерархии:
Если ТоварыВыборка.Родитель <> текСсылка Тогда Возврат Истина; КонецЕсли;

текЭлемент = Корень.Добавить();
ЗаполнитьЗначенияСвойств(текЭлемент, ТоварыВыборка);
Если ТоварыВыборка.ЭтоГруппа Тогда
Если ЗаполняемВеткуДерева(текЭлемент, ТоварыВыборка, ЦеныТоваровОтбор, ЦеныТоваров) Тогда
Перейти ~выходИзИерархии;
КонецЕсли;

Возврат Ложь;
Иначе
ПодгружаемДополнительныеДанные(текЭлемент, ТоварыВыборка, ЦеныТоваровОтбор, ЦеныТоваров);
КонецЕсли;
КонецЦикла;

Возврат Ложь;
КонецФункции

&НаСервере
Процедура ПодгружаемДополнительныеДанные(текЭлемент, ТоварыВыборка, ЦеныТоваровОтбор, ЦеныТоваров)
ЦеныТоваровОтбор.Товар = ТоварыВыборка.Ссылка;
СрезТоваров = ЦеныТоваров.СрезПоследних(НачалоДня, ЦеныТоваровОтбор);
Если СрезТоваров.Количество() > 0 Тогда
ЗаполнитьЗначенияСвойств(текЭлемент, СрезТоваров[0]);
КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьВидЦен()
выборкаВидыЦен = Справочники.ВидыЦен.Выбрать();
выборкаВидыЦен.Следующий();
Возврат выборкаВидыЦен.Ссылка;
КонецФункции

PS  в тестовом примере я работал с некоторой своей конфигурацией. ВидыЦен на этом этапе справочник, используется в измерении регистра сведений ЦеныТоваров, там всего одно значение, оно же прописано в записях самого регистра в реальных данных. ВидЦен и НачалоДня (Дата) — реквизиты формы в моём случае.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *