При разработке интерфейсов на обычных формах часто возникает необходимость вывести актуальные данные из периодического регистра сведений (срез последних) для конкретного элемента справочника или документа. По умолчанию реквизит формы с типом РегистрСведенийСписок отображает все записи регистра с учетом установленных отборов.
Рассмотрим подробно два основных подхода к решению этой задачи: использование встроенных свойств табличного поля платформы 1С и программное получение данных с помощью запроса.
Разберем самый простой метод, не требующий написания сложных запросов. В расширении табличного поля для источника данных типа РегистрСведенийСписок предусмотрено встроенное свойство ВыбиратьСрез.
Для настройки отображения среза последних выполним следующие шаги:
ВыбиратьСрез в положение ИспользованиеСреза.Последние (по умолчанию установлены значение ИспользованиеСреза.НеИспользовать).Также это свойство можно установить программно при открытии формы или инициализации элементов:
ЭлементыФормы.ИмяТабличногоПоля.ВыбиратьСрез = ИспользованиеСреза.Последние;
Проанализируем работу отборов при таком подходе. При активизации строки основного списка (например, справочника) мы можем наложить отбор по измерению регистра:
Процедура СправочникСписокПриАктивизацииСтроки(Элемент)
РС.Отбор.Карта.Установить(Элемент.ТекущиеДанные.Ссылка);
КонецПроцедуры
Обратите внимание на ограничения метода:
Отбор списка.Если штатного механизма недостаточно (например, требуется сложная обработка данных или вывод дополнительных реквизитов), можно использовать таблицу значений в качестве источника данных табличного поля и заполнять ее с помощью запроса к виртуальной таблице СрезПоследних.
Посмотрим на пример кода, аналогичный типовым решениям (например, выводу цен номенклатуры):
Процедура ОбновитьСрезПоследних()
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| Цены.ТипЦен КАК ТипЦен,
| Цены.Цена КАК Цена,
| Цены.СпособРасчетаЦены КАК СпособРасчетаЦены,
| Цены.Валюта КАК Валюта,
| Цены.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Цены.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен В (&ТипыЦен)
| И Номенклатура = &Номенклатура) КАК Цены";
Запрос.УстановитьПараметр("Дата", РабочаяДата);
Запрос.УстановитьПараметр("ТипыЦен", ТаблицаЦен.ВыгрузитьКолонку("ТипЦен"));
Запрос.УстановитьПараметр("Номенклатура", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаЦен = ТаблицаЦен.Найти(Выборка.ТипЦен, "ТипЦен");
Если СтрокаЦен <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(СтрокаЦен, Выборка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Выясним преимущества и особенности второго способа:
ТаблицаЗначений, что позволяет легко редактировать данные на форме и обрабатывать их перед записью.Таким образом, если задача простая — достаточно включить свойство ВыбиратьСрез у табличного поля. Если же требуется сложная логика обработки данных — следует использовать запрос к таблице СрезПоследних с выгрузкой в таблицу значений.