Переход с обычных форм на управляемые часто вызывает трудности у разработчиков, привыкших к классической архитектуре «1С:Предприятия». Одним из частых вопросов становится поиск источников данных для привычных интерфейсных элементов. В этой статье мы подробно разберем, как устроены банковские выписки в конфигурации «1С:Бухгалтерия предприятия 3.0», где искать их исходные запросы, как формируется реестр документов и как правильно выгрузить данные динамического списка в Систему компоновки данных (СКД).
Если мы попытаемся найти в дереве метаданных документ или журнал с именем «БанковскиеВыписки», то нас постигнет неудача. В «1С:Бухгалтерии 3.0» этот интерфейс устроен иначе. Давайте разберем по шагам, как локализовать нужный объект:
БанкИКасса) и выберем пункт Открыть командный интерфейс.Проанализировав командный интерфейс, мы выясним, что команда «Банковские выписки» ведет к журналу документов. Журнал, который объединяет поступления и списания по расчетным счетам, называется Деньги. Сама форма, которую видит пользователь на экране, называется БанковскиеВыписки и находится по пути: Журналы документов -> Деньги -> Формы -> БанковскиеВыписки.
Открыв форму БанковскиеВыписки, мы обнаружим, что данные на экран выводятся с помощью специального механизма платформы. Основной реквизит формы имеет имя Список и тип ДинамическийСписок.
Многие начинающие разработчики ищут макет СКД непосредственно внутри формы или журнала документов. Однако динамический список работает иначе. Рассмотрим, как увидеть его структуру и изменить SQL-подобный запрос:
Список (он выделен жирным шрифтом, так как является основным реквизитом формы).В открывшемся окне мы увидим флаг Произвольный запрос. Именно здесь расположен текст запроса, который собирает данные из таблиц Документ.ПоступлениеНаРасчетныйСчет, Документ.СписаниеСРасчетногоСчета и сопутствующих регистров. Платформа «1С:Предприятие 8» под капотом использует технологии СКД для генерации этого списка, оптимизируя выборку порциями и накладывая пользовательские отборы в реальном времени.
На форме банковских выписок пользователям доступна кнопка «Реестр документов». Эта кнопка не формирует печатную форму силами самой формы списка. Вместо этого задействован универсальный механизм печати реестров БП 3.0. Разберем алгоритм его работы:
Основным объектом для формирования отчета является Отчет.РеестрДокументов. Внутри него заложена эталонная схема компоновки данных — СхемаКомпоновкиДанныхЭталон.
Когда пользователь нажимает кнопку печати реестра, происходят следующие действия:
РеестрДокументов.ИнициализироватьОтчет(ОсновнаяТаблица, ТекстЗапроса). Она программно перестраивает запрос эталонной СКД под структуру конкретного журнала (в данном случае ЖурналДокументов.Деньги) и накладывает все пользовательские фильтры.Часто перед разработчиком встает задача: создать внешнюю печатную форму или отчет, который должен в точности повторять то, что пользователь видит на экране (с учетом всех его ручных отборов и поиска). Копировать запрос динамического списка вручную в макет СКД и пытаться программно воссоздать все отборы — это трудоемкий и неэффективный путь.
Давайте посмотрим на современный инструмент платформы «1С:Предприятие 8.3». Мы можем получить готовую схему компоновки и текущие настройки списка программно с помощью специальных методов:
ПолучитьИсполняемуюСхемуКомпоновкиДанных() — возвращает актуальную схему СКД динамического списка со всеми программными изменениями запроса.ПолучитьИсполняемыеНастройкиКомпоновкиДанных() — возвращает настройки компоновки, включая быстрые отборы, группировки, сортировки и результаты поиска.Проанализируем пример программного кода, который позволяет выгрузить данные из динамического списка Список в табличный документ на сервере:
// Код выполняется в серверном контексте формы
Сchema = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Settings = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
// Инициализируем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Сchema, Settings, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
// Запускаем процессор компоновки данных
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// Выводим результат в табличный документ
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Этот изящный способ позволяет избежать ручного дублирования запросов. В сформированный ТабличныйДокумент попадут ровно те строки и колонки, которые пользователь видит на экране своего монитора в данный момент.