Создание отчетов в 1С Предприятие 7.7

Хоть и не очень часто, но встречаются еще организации, работающие с 1С:Предприятие 7.7. Язык этой версии серьезно отличается от языка 1С:Предприятие 8, поэтому даже создание простого отчета может стать проблемой для человека, который не работал с 1С 7.7 (вроде меня). Информации в интернете нашлось немного, в основном все отсылают к ЖКК (желто-красным книгам мануалов), поэтому попробую в этой статье обобщить все, что нашел. Буду описывать создание отчета без использования конструкторов, хотя они могут упростить задачу.

Итак, задание: создать отчет — реестр приходных накладных на металл (организация занимается приемом лома). Реестр представляет собой таблицу с номером и датой накладной, названием металла, и т.д. Содержание не так важно, важно, что данные будем получать запросом к документу Поступление товаров и его табличной части. Пользователь сможет задать фильтры для отчета по датам, по складу и по типу металла (черный или цветной).

Создание отчета

  1. Создаем отчет. Мой будет называться ЖурналПСА. Это делается так же, как в 1С 8. При открытии созданного отчета сразу отображается его форма. Внизу на вкладках кроме режима Диалог есть режимы Модуль и макеты отчета. Макеты можно добавлять, щелкнув правой кнопкой на уровне вкладок и выбрав Добавить таблицу.
  2. В режиме Диалог добавляем поля ввода, в которые будут заноситься данные для фильтров. Аналогично 1С 8, на нижней панели инструментов находятся элементы управления. При добавлении поля ввода откроется окно свойств, в котором нужно указать Идентификатор и Тип данных. Идентификатор — это Имя элемента, по которому можно будет получить выбранное пользователем значение. Итак, я добавил следующие поля: ВыбНачПериода, ВыбКонПериода, ВыбМеталл, ВыбМестоХранения.Еще нам будет нужна кнопка Сформировать, скорее всего она уже есть. Обращу только внимание на параметр Формула в ее свойствах. Там прописывается имя процедуры, которую вызывает нажатие кнопки. Т.е., например, Сформировать().
    Создание отчетов в 1С Предприятие 7.7
  3. Создаем макет отчета. Тут все похоже на макеты в 1С 8. Тот же табличный документ, в котором есть секции (они же области). Имена секций назначаются через меню Таблица. Ячейки имеют несколько типов заполнения, которые аналогичны типам в 1С 8: текст, параметр, шаблон. Только параметр здесь называется Выражение.Есть и отличие от 1С 8. Выражениям-параметрам здесь не присваиваются имена, а прописывается имя переменной, из которой нужно брать значение для подстановки в макет. Например, у меня в запросе будет получен номер накладной, поэтому в свойствах соответствующей ячейки макета с типом Выражение я напишу Запрос.Номер.Шаблон работает так же, как в 1С 8. Текстовая часть пишется как обычно, а выражение заключается в квадратные скобки. И оно тоже должно содержать переменную, из которой берется значение. Например, мне нужно вывести из результата запроса уровень радиоактивности принятого лома и добавить к числу единицу измерения мкзв/ч. Для этого подойдет шаблон следующего содержания: [Запрос.радиация] мкзв/ч
    Создание макета отчета 1С 7.7

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

    Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(запрос)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Без итогов;
    |Номер = Документ.ПоступлениеТоваров.НомерДокВходящий;
    |Дата = Документ.ПоступлениеТоваров.ДатаДокВходящий;
    |Сдатчик = Документ.ПоступлениеТоваров.Контрагент.Наименование;
    |ЮридическийАдрес = Документ.ПоступлениеТоваров.Контрагент.ЮридическийАдрес;
    |ДокументСерия = Документ.ПоступлениеТоваров.Контрагент.ДокументСерия;
    |ДокументНомер = Документ.ПоступлениеТоваров.Контрагент.ДокументНомер;
    |ДокументКемВыдан = Документ.ПоступлениеТоваров.Контрагент.ДокументКемВыдан;
    |Металл = Документ.ПоступлениеТоваров.Товар.Металл;
    |Вес = Документ.ПоступлениеТоваров.Количество;
    |Радиация = Документ.ПоступлениеТоваров.Радиация;
    |МестоХранения = Документ.ПоступлениеТоваров.МестоХранения;
    |Группировка СтрокаДокумента;
    |Группировка Документ;
    |Условие(Металл.Цветной = ВыбМеталл);
    |Условие(МестоХранения = ВыбМестоХранения);
    |"
    //}}ЗАПРОС
    ;

    Текст запроса, я думаю, понятен. Для его формирования можно воспользоваться конструктором запросов (верхнее меню Конструкторы). Обращу внимание на некоторые особенности:

    • Каждое поле запроса записывается в отдельную переменную, их можно видеть перед знаком =. В принципе, это аналогично заданию псевдонимов в языке запросов 1С 8.
    • В запросе обязательно должна быть хотя бы одна группировка. Иначе будет невозможно обойти результат запроса. В данном случае группировка идет сначала по строкам документа ПоступлениеТоваров, а потом по самим документам. Если оставить в группировке только строки документа, то будет выведен один документ.
    • Запрос может брать данные с формы. Например, условие МестоХранения = ВыбМестоХранения говорит о том, что будет взято значение из поля ввода с именем ВыбМестоХранения.
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("макет");
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);

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

    Пока Запрос.Группировка() = 1 Цикл
    // Заполнение полей запрос
    Сдатчик=СокрЛП(Запрос.Сдатчик) + ", "+СокрЛП(Запрос.ЮридическийАдрес)+", паспорт " + Запрос.ДокументСерия + " " +Запрос.ДокументНомер + " выдан "+Запрос.ДокументКемВыдан;
    Таб.ВывестиСекцию("Данные");
    КонецЦикла;
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Отчет", "");
    КонецПроцедуры

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

Вот и все, отчет готов.

 

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

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