Отчеты без программиста

Загрузить пример
Постановка задачи
Существующие решения
Отчеты без программиста. Суть технологии
Отчеты без программиста. Технология внутри
Разбор примера
Формула для расчета
Вывод секций
Пустые секции
Описание переменных и функций

  Загрузить пример

ert.rar (95 kb): баланс, отчет о прибылях и убытках и CashFlow.

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

 

  Постановка задачи

1С поставляется со средствами разработки. Средства разработки в 1С позволяют создавать отчеты практически любой сложности. И это хорошо. Однако такой подход имеет и обратную сторону — любой отчет в 1С требует программирования. А это значит, чтобы создать отчет в 1С, нужен программист.

Как предоставить предметникам возможность самостоятельно получить те данные, которые им нужны? Как минимизировать потребность в программисте? Как облегчить процесс создания отчетов?

Задача: Предоставить технологию, которая позволит на 1С создавать или тиражировать отчеты при минимальном участии программиста.

Надо сказать, что пользователи 1С настолько приучены к тому, что каждое изменение в 1С делается программистом, что такая задача осознается и ставится нечасто. Как правило, такая постановка задачи в 1С возникает при работе с финансовыми данными (есть много причин для этого, мне не хотелось бы здесь их обсуждать — это слишком уведет в сторону). Кроме того, на практике, обычно так задачу ставят те, кто готовит данные не из российского плана счетов, а из западного или корпоративного плана счетов (на это тоже есть причины). Поэтому в данной статье, я ограничусь только бухгалтерскими (финансовыми) отчетами по планам счетов. Однако, представленная технология может быть использована и для отчетов по регистрам.

 

  Существующие решения

Подобную задачу приходится решать разработчикам ГААПов. Дело в том, что в западных программах для создания финансовых отчетов программист не нужен — практически во всех западных программах имеется генератор финансовых отчетов, доступный для пользователя-непрограммиста. Поэтому разработчикам ГААПов приходится предоставлять похожее решение. Это одна из причин, которая заставляет задумываться об отчетах без программистов.

Я работал с ГААПами от фирмы Рарус и от фирмы ПиБи. Разработчики этих конфигураций пошли одним и тем же путем. Существуют справочники, которые описывают структуру финансовых отчетов. Каждый элемент справочника — одна строка финансового отчета. Элемент достаточно сложным образом определяет что и как будет рассчитываться в отчете.

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

Настройка финансовых отчетов в конфигурации 1C-Rarus:Gaap
Настройка финансовых отчетов в конфигурации 1C-Rarus:GAAP

Настройка финансовых отчетов в конфигурации GAAP для платформы 7.7 от фирмы ПиБи
Настройка отчета о прибылях и убытках в конфигурации GAAP для платформы 7.7 от фирмы ПиБи

Несомненное достоинство таких генераторов — для создания финансового отчета программист не нужен. Для этого генераторы и создавались.

У подобных генераторов есть только два существенных недостатка.

  1. Настроенный отчет чертовски трудно перенести куда бы то ни было, даже в другую базу 1С. Над отчетностью можно работать только в 1С и только в рабочей базе данных. И чем навороченнее генератор, тем труднее перенести настроенный отчет в другое место.

    Комментарий: Зачем нужно переносить настройку отчетов? Во-первых, у каждого появляются свои наработки, удачные решения и шаблоны, которые имеет смысл использовать повторно. Во-вторых, очень часто хочется протестировать отчет и только затем перенести его в основную базу. В-третьих, бывают холдинги, в каждом подразделении которых отчеты почти одинаковы, и разработав структуру отчета один раз хочется иметь возможность копирования. В-четвертых, для того, чтобы обсуждать отчет с другими (например, с консультантами). И т.п.

  2. В генераторе практически невозможно задать циклы. Например, повторить строку по всем статьям затрат или вывести колонки для каждого подразделения.

Думаю, что со временем генераторы разовьются и снимут большинство проблем. Но это также означает, что генераторы станут очень сложными и узконаправленными. А они уже сейчас непросты в освоении.

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

 

  Отчеты без программиста. Суть технологии

Форма для пользователя Введем три роли:

Пользователь отчета — указывает период и другие параметры отчета, запускает отчет, работает с результирующими данными. Работает в режиме 1С:Предприятие;

Таблица для консультанта Консультант — создает структуру отчета, указывает описание строк, указывает формулы, разбивает выводимые секции, занимается оформлением. Работает в режиме 1С:Конфигуратор только с Таблицей. Может копировать таблицу в Excel и обратно.

Модуль для программиста Программист — да, без него никак! создает итоги, указывает параметры расчета итогов, создает циклы по колонкам и горизонтальным секциям. Работает в режиме 1С:Конфигуратор с двумя функциями модуля отчета.

Комментарий: Очень часто пользователь и консультант является один и тем же человеком. Чаще всего ни пользователь, ни консультант совершенно не обладают навыками программирования.

Суть технологии состоит в том, чтобы предоставить консультанту удобный механизм создания отчета без программирования. 95% работы выполняет консультант работая с 1С как с привычным Excel'ем. Мало того, основную часть своей работы консультант может выполнять в Excel'е, а в 1С выполнять только оформление и отладку отчета.

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

 

  Отчеты без программиста. Технология внутри

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

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

Допуск консультанта к конфигуратору достаточно сильное требование как с точки зрения безопасности, так и с точки зрения целостности конфигурации. В крайнем случае, можно заставить консультанта всю подготовку выполнять в Excel'е, а в 1С переносит уже программист.

Что должен сделать консультант?

Основное время консультанта уходит на первые два пункта — создание структуры и определение формул расчета. Достаточно большое время уходит на следующие два пункта — детализация и выводимые секции. И совсем небольшое время уходит на общение с программистом.

Результат работы консультанта — отчет, с заданной структурой и отлаженными формулами расчета.

Настроенная консульатнтом таблица

Что должен делать программист?

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

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

Расчет итогов и обработка детализации в модуле "Сформировать"

Функции ВывестиСекцию и ПриОткрытии

Иногда необходимо подредактировать функцию ПриОткрытии для того, чтобы обработать дополнительные параметры.

Главное, что программист не обязательно должен присутствовать постоянно. Программист может получать задания и внешние отчеты и возвращать результаты своего труда по почте. Главное, что получить большинство отчетов можно совсем без программиста только на основе уже имеющихся шаблонов. Но также немаловажно то, что если необходимо, можно получить все преимущества и гибкость программирования. Важно соблюсти баланс.

 

  Разбор примера

В качестве демонстрации к статье приложен архив, который содержит три внешних отчета:

bs.ert - баланс;
pl.ert - отчет о прибылях и убытках;
cashflow.ert - отчет о движении денежных средств.

Эти отчеты взяты из реального внедрения западного учета.

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

Эти отчеты получают итоги по плану счетов GAAP. Предполагается, все счета в плане счетов GAAP не имеют субчетов, а итоговые счета работают по диапазонам. Так, например, итого по активам это запрос по диапазону с 1000 по 1999, а итого по денежным счетам в данном плане счетов это запрос по диапазону с 1000 по 1049.

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

Данный пример позволяет посмотреть на практическое использование технологии отчетов без программиста.

Ниже приведено описание технических аспектов, необходимых для понимания отчетов их архива.

 

  Формула для расчета

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

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

Также можно передать имя переменной, в которую надо запомнить промежуточный результат, и Итоги. Итоги используются очень, очень редко.

Вот заголовок функции:

Функция ПолучитьСумму(Знач ИмяФунк,Интервал="",ИмяПерем="",Итоги="")

Полный синтаксис можно посмотреть в описании отчета, в комментарии к функции ПолучитьСумму. Приведу описание синтаксиса и здесь:

<ИмяФунк>:
= [<|>]<Функ>[<|>]
если указан знак сравнения, то возвращает сумму только в том случае, если результат вычисления меньше или больше нуля, иначе возвращает 0. Если знак указан до функции, то сравнение выполняется для каждого поддиапазона после сравнения результаты вычисления поддиапазонов суммируются. Если знак указан после функции, то сравнение выполняется для всей суммы после суммирования

<Функ>:
= СНД | СНК | СКД | СКК | СНДР | СНКР | СКДР | СККР | СНДРС | СНКРС | СКДРС | СККРС | ДО-КО | КО-ДО | ДО | КО | КОРДО-КОРКО | КОРКО-КОРДО | КОРДО | КОРКО

<Интервал>:
= <Диапазон>[,<Диапазон>]...

<Диапазон>:
= [+|-]<Поддиапазон>[@<НомерИтогов>[@<НомерИтогов>[@...]]]

<НомерИтогов>:
= <Целое Число>

Сначала вычисляются функции по счетам в итогах (по-умолчанию, Ит[НомерИтогов]) с первым номером, затем - по счетам в итогах со вторым номером. И т.д. Уже обработанные счета повторно не вычисляются.

<Поддиапазон>:
= "ИмяПерем" расчитанный ранее результат выбирается из кэша
= "####" используется один счет
= "####-####" конец диапазона указан после минуса
= "####/####" считать функцию с корреспонденцией
= "####-####/####" считать функцию с корреспонденцией
= "####/####-####" считать функцию с корреспонденцией
= "####-####/####-####" считать функцию с корреспонденцией
= "." используется диапазон, который был задан в предыдущем вызове или диапазоне
= "&" используется субсчет, предварительно заданный в переменной субсчет (обычно в цикле) модификаторы "." и "&" можно использовать вместо явного указания счета "####"

<ИмяПерем>:
= [+|-]<Произвольная строка без запятых минусов плюсов двоеточий и знаков деления>[:&]
Если <ИмяПерем> указано, то результат запоминается(кэшируется) с именем ИмяПерем в дальнейшем можно получить этот результат без расчета. Кэшируется имя переменной без(!) имени функции. Т.е. в дальнейшем можно вызывать эту переменную из кэша с любой функцией! ИмяПерем может содержать префикс "+" или "-". Если префикс присутствует, то результат не просто запоминается, а прибавляется или вычитается к/из уже запомненного значения в кэше.

<Итоги>:

= Объект, созданный методом СоздатьОбъект("БухгалтерскиеИтоги")

По умолчанию используются <итоги> из переменной Ит[НомерИтогов].
Если функция ПолучитьСумму вызывается из таблицы, то итоги указывать не надо. Если есть необходиомсть вызвать эту функцию из модуля отчета, то
можно сюда передать переменную, созданную методом СоздатьОбъект("БухгалтерскиеИтоги").

Интервал может содержать несколько диапазонов, разделенных запятыми.
Например, "1111, 2000-2999, Отложенные налоги". Это выражение означает, что надо вычислить функцию по счету 1111, прибавить результат функции, вычисленный по диапазону 2000-2999, и прибавить результат функции из кэша, запомненный в переменной "Отложенные налоги".

Интервал может использовать модификаторы "." и "&".
Например, "1111, ./2000-2999" означает, что надо
вычислить функцию по счету 1111, прибавить результат функции,
вычисленный по диапазону 1111 в корреспонденции с 2000-2999.

 

  Вывод секций

По-умолчанию, секции выводятся в порядке их нумерации. По-умолчанию, названия секций должны иметь вид Таб1, Таб2, Таб3 и т.п.

Как только алгоритм не находит очередную секцию, то вывод отчета прекращается. Это значит, что в данном варианте номера секций не должны иметь пропусков. Т.е. если будут заданы секции Таб1, Таб2, Таб4, то будут выведены только первые две секции.

 

  Пустые секции

Иногда не хочется выводить строки, если они содержат нулевые значения. В этом случае, такие строки надо выделить в горизонтальные секции.

Для управления выводом предусмотрена специальная вертикальная секция Проверка. Эта секция может отсутствовать, тогда все горизонтальные секции всегда выводятся.

Если же вертикальная секция Проверка присутствует, то в этой секции можно указать следующие символы:

Для оптимизации стоит указывать что-нибудь в верхней ячейке секции Проверка.

Для примера смотри баланс bs.ert и секцию Таб2.

  Описание переменных и функций

Прочие функции не должны использоваться консультантом. Описание дается только для программиста.

Перем или функц Описание
Ит[] Здесь хранятся рассчитанные итоги. Из этого массива консультант получает итоги. Когда консультант указывает номер итогов в диапазоне, то он получает элемент с данным номером из этого массива. По-умолчанию, используются Ит[1]. Консультант не должен напрямую обращаться к этой переменной.
Суб Текущее рассчитываемое Субконто. Консультант никогда не управляет этим значением. Однако, в отчете он может получить описание или реквизиты текущего субконто из этой переменной.
СубСчет Аналогично Суб. Содержит текущий субсчет.

ПредыдущНачДиапазона
ПредыдущКонДиапазона
ПредыдущНачКорДиапазона
ПредыдущКонКорДиапазона
ПредыдущНомераИтогов

Используется для раскрытия псевдодиапазона "."
СписокРезультатов Список со значениями рассчитанных переменных. Консультант не должен использовать этот список напрямую. Консультант должен указывать имена переменных в диапазоне.
РазбитьНаЧасти Вспомогательная функция. Разбивает диапазон на поддиапазоны, определяет начальный и конечный счета.
ПолучитьНаименованиеСправочника Возвращает наименование справочника английсоке или русское в зависимости от выбранного языка. Фукнция должна использоваться консультантом, если он хочет вывести наименование справочника в отчете. Внимание! По-умолчанию, английксое наименование берется из реквизита НаименованиеАнгл. Внимание! программист должен изменить эту функцию, если добавляется язык или наименование на разных языках хранится по-другому.
ПолучитьНаименованиеСчета Аналогично ПолучитьНаименованиеСправочника.
ЭлементВГруппе Вспомогательная функция.
ПолучитьСумму1

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

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

ПолучитьСуммуПоСубконто

Выборка по субконто, если субконто указано в переменной Суб.

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

ПолучитьСуммуПоКорСчету

Выборка по корсчетам.

Обычно эта функция вызывается из ПолучитьСумму. Консультант не должен вызывать эту функию. Программист тоже не должен. Но для того, чтобы итоги по коррсчетам появились, программист должен рассчитать итоги в режмие с коррсчетами (по-умолчанию, этот режим включен).

ИмяВСпискеРезультатов Функция используется для кэширования. Консультант не должен вызывать эту функцию.
ПолучитьСумму

Основная функция расчета. Консультант должен вызывать именно ее.

ВывестиСекцию_НадоЛи Проверка надо ли выводить секцию. Вызывается из функции ВывестиСекцию. Править ничего не надо. Консультант не должен вызывать эту функцию.
ВывестиСекцию Выводит горизонтальную секцию. Консультант не должен вызывать эту функцию. Программист должен добавить цикл и внести исправления, если отчет растет в ширину. Именно здесь программист должен установить значение переменной Суб.
ПриОткрытии Предопределенный метод. Консультант не должен вызывать. Нужно модифицировать, если появились дополнительные параметры на форме или нужно какое-либо нестандартное поведение.
Сформировать

Основная функция для программиста. Консультант никогда не должен вызывать эту функцию.

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

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

 

Буду рад Вашим замечаниям и предложениям.
Мазуркин Сергей, mazzy@mazzy.ru

Rambler's Top100 Рейтинг@Mail.ru
Телефон: (095) 937-72-84
Адрес для связи: Мазуркин Сергей mazzy@mazzy.ru
Вся контактная информация