World 1C

Блог для программистов и пользователей платформы 1С:Предприятие

Отчет на СКД. Базовые приемы разработки (часть 2)

В этой статье мы познакомимся с таким удобным инструментом разработки отчетов платформы 1С: Предприятие 8, как система компоновки данных (СКД). СКД позволяет разрабатывать гибкие (настраиваемые) отчеты с минимальными трудозатратами в кратчайшие сроки. Однако, если не знать всех тонкостей этого механизма, то легко допустить ошибку, которая приведет к тому, что отчет будет как минимум неудобен в использовании или, что ещё хуже, будет выдавать некорректные результаты.
Мы будем разрабатывать отчет “Ведомость взаиморасчетов” для демонстрационной конфигурации из моей прошлой статьи “Управляемое приложение. Базовые примеры разработки (часть 1)”. Отчет должен будет выводить данные об изменении состояния взаиморасчетов с контрагентами за выбранный период в разрезе организаций, контрагентов и документов, которыми были сделаны эти изменения. Схематически наш будущий отчет можно представить в виде следующей таблицы.
Организация\Контрагент\Документ Начальный долг Увеличение долга Уменьшение долга Конечный долг
ЗАО “Конфетпром” 500,00 300,00 200,00
   ООО “Леденец” 500,00 300,00 200,00
Документ №1 от 01.11.2012 300,00 300,00
Документ №2 от 02.11.2012 300,00 200,00 500,00
Документ №3 от 02.11.2012 500,00 300,00 200,00
Итого 500,00 300,00 200,00
Приступим к разработке. Добавим в дереве конфигурации новый отчет, введем название и нажмём на кнопку “Открыть схему компоновки”. При этом откроется конструктор макета схемы компоновки данных. Жмём кнопку “Готово”. На закладке “Наборы данных” добавляем новый набор данных “Запрос” (назовём его “Взаиморасчеты”). Вызовем конструктор запроса. Будем выбирать данные из таблицы итогов “ОстаткиИОбороты” регистра накопления “Взаиморасчеты” (это, так называемая, “виртуальная” таблица, предназначенная для хранения итогов и оборотов по ресурсам регистра для различных наборов измерений). Откроем таблицу параметров виртуальной таблицы, где установим значения параметра “Периодичность” равным “Авто” (это позволит выбирать данные из таблицы итогов регистра с разной периодичностью). В поле “Условие” внесём текст “Организация = &Организация” (для дальнейшей фильтрации отчета по выбранному значению параметра “&Организация”.  Определим набор полей, которые будем использовать в отчёте. Поле “ВзаиморасчетыОстаткиИОбороты.Регистратор” заменим на следующую конструкцию (далее будет ясно для чего).
ВЫБОР
    КОГДА ВзаиморасчетыОстаткиИОбороты.Регистратор = НЕОПРЕДЕЛЕНО
        ТОГДА NULL
    ИНАЧЕ ВзаиморасчетыОстаткиИОбороты.Регистратор
КОНЕЦ
Установим для этого поля наименование “Документ” на закладке “Объединения/Псевдонимы. На закладке “Дополнительно” установим флаг “Разрешенные” (тем самым в тексте запроса к предложению “ВЫБРАТЬ” будет добавлено ключевое слово “РАЗРЕШЕННЫЕ”). Это означает, что запрос выберет только те записи на которые у пользователя установлено право чтения. Так, если попытаться выбрать таким запросом данные без фильтра по организации под пользователем с правами на просмотр данных только одной организации, то будут выбраны данные только этой организации. Без использования ключевого слова “РАЗРЕШЕННЫЕ” в такой ситуации возникнет ошибка “Нарушение прав доступа”.
Особое внимание хотелось бы обратить на то, что кроме права “Чтение” для объектов, выбираемых отчетом, у пользователя должно быть установлено право “Просмотр”. В противном случае данные, связанные с этим объектом не будут выведены в отчёт без каких-либо сообщений об ошибке.

Завершим работу с конструктором запроса. В получившемся тексте запроса заменим строку “Оргаизация = &Оргаизация” на “{Организация = &Организация}”. Использование фигурных скобок в тексте запроса является расширением языка запросов для СКД (для обычных запросов такая возможность отсутствует). Заключенное в фигурные скобки условие в запросе схемы компоновки данных будет игнорироваться в случае, если хотя бы один из параметров, использованных в условии не задан.

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

Основные настройки уже сделаны платформой. Например, для полей периодов установлены необходимые настройки в колонке “Роль”. В качестве роли для этих полей установлен вариант “Период” и задан порядковый номер. Поля нумеруются в порядке возрастания, от наименьшего периода к наибольшему (это необходимо для правильного расчета остатков по полям периода в отчёте). Обратите внимание, что для поля “Документ” (Регистратор регистра накопления “Взаиморасчеты”) в колонке “Роль” тоже необходимо установить вариант “Период” и установить порядковый номер равным единице (порядковые номера остальных периодов необходимо увеличить на единицу). Как вы помните, ранее мы изменили поле “Документ” таким образом, что в ряде случаев оно может принимать значение “NULL”. Такое возможно, когда мы формируем отчет с детализацией до документов за период, на начало которого есть остатки. В таком случае мы получаем дополнительную строку начального остатка с “пустым” регистратором. Чтобы этого избежать мы установим в настройках роли поля “Документ” флаг “Игнорировать значения NULL”. Для полей остатков установлены соответствующие роли – начальный и конечный остаток. Это позволяет системе корректно выполнять расчет значений. В частности, итоги для полей остатков вычисляются ни как сумма всех строк таблицы, а как остаток по регистру.
Теперь перейдём на закладку “Ресурсы”. Здесь выберем поля, данные которых мы хотим видеть в итогах группировок и в общих итогах отчётаЗакладка "Ресурсы" отчета на СКДПерейдем на закладку “Параметры”. Здесь уже присутствуют предопределенные параметры “НачалоПериода” и “КонецПериода” (их значения будут использоваться в качестве параметров виртуальной таблицы “ОстаткиИОбороты” регистра “Взаиморасчеты”) и параметр “Организация”, который мы добавили в текст запроса вручную, заключив в фигурные скобки, чтобы он был необязательным. Закладка "Параметры" отчета на СКДДля удобства заполнения значений параметров “НачалоПериода” и “КонецПериода” добавим в список параметров “Период” с типом “СтандартныйПериод”. В поле “Выражение” для параметров “НачалоПериода” и “КонецПериода” внесём текст “&Период.ДатаНачала” и “&Период.ДатаОкончания” соответственно, а для самих параметров отключим флаги “Ограничение доступности”.
И наконец перейдём на закладку “Настройки”. На вложенной закладке “Параметры” для параметров “Организация” и “Период” установим флаг “Включать в пользовательские настройки” (он устанавливается в окне “Пользовательские настройки элемента” – правая кнопка мыши на параметре, пункт выпадающего меню “Свойства элемента пользовательских настроек”). Закладка "Настройки -> Параметры" отчета на СКДПосле выполнения данной настройки параметры будут отображаться в основой форме отчёта.
Откроем конструктор настроек компоновки данных. На первом шаге выберем тип отчета (пусть это будет “Таблица”), на втором – поля, которые хотим выводить в отчёт, а на третьем – настроим группировку строк. В результате получим следующую настройку компоновки.Настройки компоновки данныхОтчет готов. Посмотрим на результат.
Отчет "Ведомость взаиморасчетов"

Поделиться
  • Twitter
  • Добавить ВКонтакте заметку об этой странице
  • Facebook
  • Одноклассники
  • LiveJournal
  • Мой Мир
  • В закладки Google
  • FriendFeed
  • Блог Я.ру

,

8 комментария(ев) к “Отчет на СКД. Базовые приемы разработки (часть 2)
  • Ирина:

    Скажите, пожалуйста. где находится поле “Регистратор”? Спасибо.

    • admin:

      Что Вы имеет ввиду, говоря “где находится”? Если говорить о структуре данных, то в дереве метаданных конфигурации для регистров нет специального измерения “Регистратор”, однако у Вас есть возможность работать с ним в программном коде (в запросах) при использовании регистров накопления (любых) или регистров сведений с установленным свойством “Режим записи” – “Подчинение регистратору”

  • Написано все хорошо, но не работает так как надо. Для регистра остатков в измерении регистратор указывать NULL – безполезно. Проверте на версии 8.2.18.109. У меня ни разу не получилось. Делается это по другому!

    • admin:

      Я, конечно, могу попробовать и на платформе 8.2.18.109, но не думаю, что это что-то изменит. Такой принцип работы с регистратором применяется давно, можете посмотреть как это сделано в какой-нибудь типовой конфигурации. Фокус в том, что не достаточно просто указывать NULL, нужно ещё и правильно выполнить настройку СКД. Посмотрите внимательно на первую картинку (под текстом “Настройка полей схемы компоновки должна быть выполнена следующим образом.”) На ней в красную рамку обведена настройка роли для поля “Документ”. Такая настройка позволяет игнорировать значения “NULL” при выводе данных. Таким образом в приведенном примере мы добиваемся того, что при наличии остатков на начало периода и включенной группировке по регистратору в отчет не будут выводится строки с пустым регистратором (как это происходит по-умолчанию).

    • admin:

      Почему Вы считаете, что не работает? Скачайте пример, посмотрите и Вы убедитесь, что всё работает.

  • Света:

    У меня тоже не работает “Игнорировать значение Null”.
    Тестирую на 1С:Предприятие 8.2 (8.2.18.96) толстый клиент

  • Serge_ASB:

    Добрый день.
    В регистре (УТ11) Безналичные Денежные средства регистратором является документ Выписка. А в отчете мне нужно показать приход и расход по документам выписки. Как делать, если в таблице Остатки и обороты Платежный документ выбрать нельзя напрямую?

Добавить комментарий

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

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>