1с вывести таблицу результатов

1с вывести таблицу результатов

Войдите как ученик, чтобы получить доступ к материалам школы

Система компоновки данных 1С 8.3 для начинающих: представление отчёта в виде таблицы

Автор уроков и преподаватель школы: Владимир Милькин

На всех прошлых уроках мы выводили данные в отчет в виде списка. Сегодня разберёмся со вторым типом отчета: «Таблица».

Ставим цель

  • Написать отчёт, который выводит информацию о заказе еды клиентами в виде таблицы.
  • В строках таблицы должна выводиться еда, в колонках — клиенты, а на пересечении количество данной еды заказанной данным клиентом.
  • Информацию будем брать из документов «ЗаказКлиента».

Поехали!

Создаём новый отчёт

Открываем базу «Гастроном» в конфигураторе и через меню «Файл»->»Новый. » создаём новый отчёт:

Вид документа — «Внешний отчет»:

В новой форме отчёта указываем имя «Урок8» и нажимаем кнопку «Открыть схему компоновки данных»:

Имя схемы компоновки данных оставляем по умолчанию:

Составляем запрос

Добавляем новый набор данных — запрос:

Выделяем новый набор данных и вызываем конструктор запроса:

Будем выбирать из табличных частей документа «ЗаказКлиента» следующие поля:

Получился следующий текст запроса:

Сначала пробуем список

Перейдём на закладку «Настройки» и нажмём волшебную палочку, чтобы вызвать конструктор:

Вначале попробуем по старинке выбрать тип отчета «Список. «:

Укажем поля, которые будут отображаться в отчете:

Сохраним наш отчёт в конфигураторе и сформируем в режиме пользователя:

Получился привычный нам список с тремя колонками: Клиент, Еда и Количество.

Выводим в виде таблицы

Ах как замечательно было бы представить эти же самые данные в виде таблицы, в строках которой перечислена еда, в колонках — клиенты, а на пересечении количество данной еды, которое заказал данный клиент:

Сделать это действительно легко. Для этого вернёмся на закладку «Настройки» и вновь вызовем конструктор настроек через волшебную палочку:

На этот раз в качестве типа отчета выберем «Таблица..»:

Из полей, которые будут отображаться в отчёте уберём «Клиент» и «Еда», так как эти поля по нашей задумке уйдут в столбцы и строки соответственно:

Оставим только количество, которое будет отображаться на пересечении строк и столбцов:

Здесь нужно указать конструктору какие поля будут отображаться в строках, а какие в столбцах. Для нас очевидно (см. рисунок выше), что строки — это еда, а колонки — клиенты:

Получилось вот так:

Итоговая структура отчёта будет такой:

Сохраняем наш отчёт в конфигураторе и формируем в режиме пользователя:

Вроде бы неплохо. Еда отображаться в строках, а клиенты — в столбцах. Но показатели количества, которые мы ожидали увидеть на пересечении строк и столбцов почему-то оказались все слепёшены в одном столбце.

А причина в том, что строки и столбцы у нас сгруппированы, а показатели нет! Поэтому и такой разлад.

Чтобы сгруппировать количество нужно подвести по нему итоги (вычислить ресурсы). Это мы уже делать умеем.

Забыли подвести итоги

Переходим на закладку «Ресурсы» и перетаскиваем поле «Количество» из левой колонки в правую:

Выражение «Сумма(Про. » оставляем без изменения:

Снова сохраняем отчет и формируем в режиме пользователя:

То, что надо! Мы хорошо поработали. А на следующем уроке — мы модифицируем этот отчёт (вернее его копию) и представим эти же данные в виде диаграммы.

Войдите на сайт как ученик

Авторизуйтесь, чтобы получить доступ ко всем материалам школы

Прибегайте к изучению эталонного варианта только после самостоятельного выполнения всех шагов.

На вопросы учеников — отвечаю по почте, но прежде загляните в ЧАВО (ссылка) .

Войдите как ученик, чтобы получить доступ к материалам школы

Источник

Передача результата запроса в таблицу управляемой формы. Мой алгоритм.

Как всегда — стала задача разработки проекта для работы через http. Руководство сказало — есть 8.2, там есть веб-клиент. Вперед и с песней.

До тех пор, пока на формы бросались динамические списки или таблицы привязывались к регистрам — все было вроде понятно и разработка шла хорошо, но на определенном этапе понадобилось делать выборки и забрасывать результат именно в таблицы. И тут оказалось, что сделать это выгрузкой результата в таблицу невозможно. В результате в коде начало появляться множество функций &НаСервере, которые, по сути, были идентичные. Читабельность кода от этого не повысилась.

В результате мною коллегам был предложен следующий алгоритм.

В общем модуле, который доступен и серверу и управляемой форме (у меня модуль называется ОбщегоНазначенияКлиентСервер) создаем функцию ВыполнитьЗапросВТаблицу. Она будет выполнять полученный запрос, делать обход результата запроса, формировать структуру из каждой строки результата и каждую заполненную структуру добавлять в массив.

&НаСервере
Функция ВыполнитьЗапросВТаблицу ( ЗапросТекст , СтруктураПараметров ) Экспорт
З = Новый Запрос ( ЗапросТекст );
Для каждого Параметр из СтруктураПараметров Цикл
З . УстановитьПараметр ( Параметр . Ключ , Параметр . Значение );
КонецЦикла;
Результат = З . Выполнить (). Выгрузить ();
СтрокаСтруктуры = «» ;
МассивКолонок = Новый Массив ;
Для каждого Рез из Результат . Колонки Цикл
Если НЕ СтрокаСтруктуры = «» Тогда
СтрокаСтруктуры = СтрокаСтруктуры + «, » ;
КонецЕсли;
СтрокаСтруктуры = СтрокаСтруктуры + Рез . Имя ;
МассивКолонок . Добавить ( Рез . Имя );
КонецЦикла ;
МассивСтрок = Новый Массив ;
Для каждого Рез из Результат Цикл
СтруктураСтроки = Новый Структура ( СтрокаСтруктуры );
Для каждого кол из МассивКолонок Цикл
СтруктураСтроки . Вставить ( кол , Рез [ кол ]);
КонецЦикла;
МассивСтрок . Добавить ( СтруктураСтроки );
КонецЦикла;
Возврат МассивСтрок ;
КонецФункции

В управляемой форме нам понадобится одна функция на &НаСервере на всю форму, которая будет вызывать функцию общего модуля и передавать ей параметры, потому что из процедуры или функции &НаКлиенте управляемой формы сделать это не получается.

Далее нам нужна еще одна процедура на управляемой форме &НаКлиенте, с помощью которой мы будем полученный результат вставлять в таблицу на форме.

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

ТекстЗапроса = «ВЫБРАТЬ . далее текст запроса . » ;
СтруктураПараметров = Новый Структура ( «Параметр1, Параметр2, Параметр3» , ЗначениеПараметра1 , ЗначениеПараметра2 , ЗначениеПараметра3 );
// Будем считать, что на форме есть ТаблицаЗначений с именем НашаТаблица
ПоместитьДанныеЗапросаВТаблицу ( ТекстЗапроса , СтруктураПараметров , НашаТаблица );

Важно: Запрос должен быть составлен таким образом, чтобы возвращаемый результат был структурно идентичен нашей таблице значений, то есть типы значений колонок в результате запроса должны совпадать с типами значений колонок нашей таблицы значений и имена колонок в результате запроса должны совпадать с именами колонок таблицы значений.

Вот такой вот алгоритм. Код разжевывать не буду, по-моему там и так все понятно. Мега-гуру просьба не пинать сильно.

Источник

1с8.2-8.3.Вывод на экран данных запроса с переданными Параметрами из Документа! 8 различных вариантов:от Сообщений, Таблицы и Отчетов до СКД без объекта-отчета

В ссылке лежит база-черновик, созданная на платформе 1С8.3 управляемые формы. У меня настроен безМодальный режим, его всегда можно изменить на модальный:правой клавишей мыши на саму конфигурацию Черновик-Свойства-вкладка Совместимость-режимы модальности(2 поля) см.рис1

В базе-Черновике создан пример Документа и необходимых для него справочников,все данные выдуманные. Эта база создавалась больше как напоминалка — как быстенько сделать тот или иной отчет (или др.способом вывести данные на экран). В реальной жизни — параметры,передающиеся из документа могут быть в разы сложнее,но разобравшись с азами вывода данных,-потом любой сложности отчет не составит труда сделать.

1.Вывод результатов запроса командой Сообщить() из ТаблицыЗначений

Допустим, у нас есть задача: выбрать данные из пары справочников (справочники организованы с табличной частью),но не все данные этих справочников нам нужны,а только те,которые соответствуют открытому на данный момент документу.

Для этого — мы на форму документа вывели кнопку «КонтактыКлиентов», в модуле формы данного документа — у нас есть исполняющая клиентская процедура КонтактыКлиента(Команда), вот здесь и начнем писать первый код.

Код уже в базе написан,просто ставьте/снимайте ремарки с нужного варианта нашего вывода данных на экран:

В данном варианте мы создаем Структуру,записываем в нее данные по Контрагентам и Партнерам из текущего открытого документа.А далее передаем управление в серверную процедуру КонтактыКлиентаНаСервере(Структура,ТабДок). Эта серверная процедура вызывает расчетную экспортную функцию сервера из ОбщегоМодуля.

Прежде чем идти дальше — поясню алгоритм что мы делаем: у нас есть два справочника из которых нам нужны данные,но только те, которые у нас присутствуют в текущем открытом документе. Самым простым и быстрым способом мы можем получить такую выборку,если в пользовательском режиме 1С откроем КонсольЗапросов, а в ней и составим сложный запрос,параметром которого будет временная таблица — именно в нее мы и передаем значения из документа,и именно она и будет являться фильтром-отбором в нашем запросе:

вот код подобного запроса, в параметрах которого внешняя временная таблица:

Логика понятна — как мы с помощью запроса с параметром «ВнешниеДанные» получаем необходимую нам выбоку, теперь вновь возвращаемся в наш документ.

Итак,расчетная серверная функция просто решает тот запрос,который мы только что составили в КонсолиЗапросов.

Здесь вы можете видеть, что в конце расчетной функции заремарен код вывода данных в виде сообщений. Поэкспериментируйте — разремарьте этот кусочек кода:

В документе в процедуре КонтактыКлиента -можете поставить ремарку на

Все,запускайте пользовательский режим 1С,открывайте любой документ, жмите кнопку «КонтактыКлиента»,у вас получится вот такой вывод данных выборки в виде Сообщений:

2.Вывод результатов запроса — просто в табличный документ

Востановите ремарки в расчетной серверной процедуре из ОбщегоМодуля, снимите ремарку в модуле формы документа ТабДок.Показать();

Запускайте вновь пользовательский режим 1С, после нажатия на кнопку «КонтактыКлиентов» — мы получаем вывод нашей выборки в обычный ТабличныйДокумент:

3.Вывод результатов запроса с помощью ДвумерногоМассива

Заремарьте в модуле формы в проц.КонтактыКлиента(Команда) код с 1-2 вариантов вывода данных на экран.

Разремарьте тут же 3-й вариант

Здесь и в 4-м варианте реализована прежде всего суть всех страданий 1.8.3: их работой в клиент-серверном режиме)).

Так как нельзя между клиентом и сервером перегонять таблицу значений, а нам,допустим, ну очень нужно итоговые данные из расчетной процедуры видеть на клиенте, то варианта два — передавать между клиентом и сервером Структуру или Массив!

В этом примере — мы так же с помощью нашего сложного запроса считаем все данные в серверной процедуре в ОбщемМодуле, результаты запроса по этим расчетам — выгружаем в двумерный Массив и отправляем его на клиента,где пока все просто выводится сообщениями.

4.Вывод результатов запроса с помощью МассиваСтруктур (с двумя вариантами)

точно такой же подход,как в примере выше,только мы не просто загоняем данные из результата запроса в определенного размера Массив, а загружаем их в МассивСтруктур — очень интересный способ, его мне подсказал Алексей (Alexey_) (в этой теме https://forum.infostart.ru/forum9/topic184275/).Спасибо.

5.Вывод обычным объект-Отчетом без СКД

Это все тот же запрос, просто в данном варианте — он находится в модуле формы объекта-Отчета.Все так же считает. Результат выводится через табличный документ в МакетОтчета, который сама как придумала,так и нарисовала:

п.с.Это самый стандартный способ вывода данных — через обычный объект-Отчет с обычным Макетом, без всяких СКД. и запрос для него очень быстро набрать в КонсолиЗапросов можно. Не знаю, мне больше всего нравится именно этот вариант, но как говорят -каждому на свой вкус и цвет.

6.Вывод объект-Отчетом-СКД+УстановкаПараметров

Начинается СКД — Схема Компановки Данных.

Сам отчет получился очень простой — в нем нет практически кода, всю работу выполняет СКД!

Но вот с составлением запросов в данном СКД — пришлось повозиться. Здесь нет никакой внешней временной таблицы — связь идет через Параметр документа &Ссылка. А вот как передать ее в СКД — я голову поломала немножко)) Потом просто пришлось использовать дополнительный реквизит на форме — в него загружать Параметр ссылки при процедуре ПриСозданииНаСервере,а потом из процедуры ПриКомпоновкеРезультата — выхватывать этот параметр с реквизита формы и устанавливать его стандартными настройками установки параметров для объекта-Отчета.

На идею — попробывать создать сложные запросы без внешней временной таблицы натолкнул Sergey Andreev (starik-2005).Спасибо.

Вот такая красота в итоге:

7.Вывод объект-Отчетом-СКД+ВнешняяВременнаяТаблица

В этом варианте у нас как и раньше (кроме п.6) фильтр по отбираемым данным справочникам идет с помощью внешней временной таблицы, в которую мы загружаем данные из документа.

Только здесь так же пришлось переработать запросы в СКД, а так же изменить структуру самой временной таблицы Параметров. Чтобы связать временную таблицу в СКД с выборкой из справочника — данную таблицу пришлось превратить в однуколоночную, но с составным типом данных! ссылки на сайты,где я нашла как сделать составной тип данных есть вот в этой теме https://forum.infostart.ru/forum9/topic184320/#message1911641

вот такой вид имеет этот вариант:

8.Вывод программно СКД без объекта-Отчета с Параметром=ВнешняяВременнаяТаблица

А теперь представим, что нам срочно нужно вывести какие-нибудь расчеты, но по непонятным причинам — мы не можем воспользоваться объектом-Отчет))

Здесь просто создаем Обработку, на форму ей скидываем все наши параметры, которые нужны для построения запроса в СКД, потом подтягиваем эти параметры из другой процедуры — и результат выводим в программно созданный табличный документ.

Оставила в этом варианте прикрепленный еще один МакетСКД — возможно кто-то сможет с помощью него пойти по пути передачи параметра,н-р, &Ссылки (у меня в этом вареанте решено через внешнюю врем.таб) — я сколько не пыталась подгрузить в Параметры СКД при режиме отсутствия объекта-Отчета — у меня не пошло.

Но так как рабочим механизмом здесь является программно вызываемый СКД, то в нашей табличке мы можем установить шаблонМакетов — все же красивее смотрится!))

Вот и все. Теперь не только начинающие программисты смогут быстренько что-то вывести на экран, а и опытные пользователи смогут разобраться в приведенных примерах и вуа-ля! самой большой сложности отчет готов.

Источник

Читайте также:  Как чистить муранское стекло
Оцените статью