Опубликован: 06.12.2011 | Уровень: для всех | Доступ: платный
Лекция 6:

Программная работа со справочниками, обработки, простые отчеты

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

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

При реализации метода в виде функции мы можем ничего не передавать в него, сформировать внутри функции табличный документ и вернуть уже заполненный документ в точку вызова, присвоив его нашему реквизиту ТабличныйДокумент.

Реализуем метод в виде функции. Готовый код формирования отчета ( рис. 5.19) будет выглядеть следующим образом:

Готовый отчет

Рис. 5.19. Готовый отчет
&НаКлиенте
Процедура СформироватьОтчет(Команда)
  ТабличныйДокумент=СформироватьОтчетНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Функция СформироватьОтчетНаСервере()
  ТабличныйДокумент=Новый ТабличныйДокумент();
  Макет=Отчеты.СписокКонтрагентов.ПолучитьМакет("Макет");
  Шапка=Макет.ПолучитьОбласть("Шапка");
  Элемент=Макет.ПолучитьОбласть("Элемент");
  Группа=Макет.ПолучитьОбласть("Группа");
  Шапка.Параметры.ДатаФормированияОтчета=ТекущаяДата();
  ТабличныйДокумент.Вывести(Шапка);
  Выборка=Справочники.Контрагенты.ВыбратьИерархически();
  Пока Выборка.Следующий() Цикл
    Если Выборка.ЭтоГруппа Тогда
      Область=Группа;
    Иначе
      Область=Элемент;
    КонецЕсли;
    Область.Параметры.Заполнить(Выборка);
    ТабличныйДокумент.Вывести(Область);
  КонецЦикла;
  Возврат (ТабличныйДокумент);
КонецФункции

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

В серверной функции мы создаем новую переменную с типом ТабличныйДокумент и именем ТабличныйДокумент. Именно в него мы будем выводить данные и именно его будем возвращать в точку вызова. Несмотря на то, что имя реквизита формы и имя данной переменной совпадают, между ними нет никакой связи. Это – отдельные объекты.

Далее, мы получаем макет из нашего отчета, пользуясь методом ПолучитьМакет() и задавая имя макета. Отчет может иметь несколько макетов, их выбор осуществляется по имени.

В переменную Шапка мы записываем область макета Шапка, соответственно поступаем с переменными Элемент и Группа.

Командой Шапка.Параметры.ДатаФормированияОтчета=ТекущаяДата(); мы заполняем ранее заданный в макете параметр ДатаФормированияОтчета, записав в него текущую дату. Дата, возвращаемая функцией ТекущаяДата, содержит, помимо года, месяца и дня, так же часы, минуты и секунды. При необходимости дату перед выводом можно отформатировать при помощи функции Формат().

После того, как параметр, находящийся в шапке, заполнен, мы можем вывести шапку в табличный документ командой ТабличныйДокумент.Вывести(Шапка);

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

В цикле обхода выборки мы сначала проверяем, является ли текущий элемент справочника группой. Если является, присваиваем переменной Область ранее полученную область отчета Группа. Если не является – присваиваем ей область Элемент.

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

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

Для формирования простейших отчетов, пользователь может воспользоваться стандартной функциональностью, присутствующей в 1С:Предприятие 8. Для этого, открыв, например, список справочника, он может выполнить команду Все действия > Вывести список. Появится окно Вывести список, рис. 5.20, где в поле Выводить в можно выбрать либо Табличный документ (его обычно и используют), либо – Текстовый документ.

Окно Настройка списка

Рис. 5.20. Окно Настройка списка

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

Вывод данных в табличный документ

увеличить изображение
Рис. 5.21. Вывод данных в табличный документ
Лариса Дятчина
Лариса Дятчина

Код 

&НаКлиенте

Процедура ОсновноеКонтактноеЛицоПриИзменении(Элемент)

Если НЕ ПроверитьЗаполнениеРеквизита() Тогда

 Сообщить("Выбранное контактное лицо, "+Объект.ОсновноеКонтактноеЛицо+",не работает у контрагента.");

КонецЕсли;

КонецПроцедуры

 

&НаСервере

Функция ПроверитьЗаполнениеРеквизита()

 Возврат (Объект.ОсновноеКонтактноеЛицо.ПредставительРаботает);  

КонецФункции

&НаСервере

Процедура УстановитьНомерПредставителя()

 

 Объект.ТелефонКонтактногоЛица=Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения;

КонецПроцедуры

При проверке выдает ошибку:

{Справочник.Контрагенты.Форма.ФормаСписка.Форма(12,11)}: Переменная не определена (Объект)
 Возврат (<<?>>Объект.ОсновноеКонтактноеЛицо.ПредставительРаботает);   (Проверка: Сервер)
{Справочник.Контрагенты.Форма.ФормаСписка.Форма(17,2)}: Переменная не определена (Объект)
 <<?>>Объект.ТелефонКонтактногоЛица=Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения; (Проверка: Сервер)
{Справочник.Контрагенты.Форма.ФормаСписка.Форма(17,32)}: Переменная не определена (Объект)
 Объект.ТелефонКонтактногоЛица=<<?>>Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения; (Проверка: Сервер)
{Справочник.Контрагенты.Форма.ФормаСписка.Форма(6,41)}: Переменная не определена (Объект)
 Сообщить("Выбранное контактное лицо, "+<<?>>Объект.ОсновноеКонтактноеЛицо+",не работает у контрагента."); (Проверка: Тонкий клиент)

 

работаю на версии 1С:Предприятие 8.3 (8.3.10.2650)

максим матасов
максим матасов
Леонид Альбрехт
Леонид Альбрехт
Россия, Екатеринбург, 10, 2004
Оксана Максимова
Оксана Максимова
Россия, Екатеринбург, Уральский государственный университет им. А. М. Горького, 2013