d9e5a92d

Глава 6. Отчеты

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

дура генерации запроса Сформировать.

Процедура Сформировать()'

Перем Запрос, ТекстЗапроса, Таб; .

//Создание объекта типа Запрос

Запрос = СоздатьОбъект("Запрос");

Если ВыбНачПериодаПолучитьДатуТА() Тогда

ВыбНачПериода=ПолучитьДатуТА(); КонецЕсли;

Если ВыбКонПериода=ПолучитьДатуТА() Тогда

ВыбКонПериода^ПолучитьПустоеЗначение(); КонецЕсли;

ТекстЗапроса =

"//{{ЗАПРОС(Сформировать)

(Период с ВыбНачПериода^ ВыбКонПериода;

[Клиент = Регистр.Взаиморасчеты.Контрагент;

(СумРуб - Регистр.Взаиморасчеты.ДолгРуб;

(СумВал - Регистр.Взаиморасчеты.ДолгУЕ;

[Функция СумРубНачОст - НачОст(СумРуб};

(Функция СумВалНачОст = НачОст(СумВал);

(Функция СумРубПриход = Приход{СумРуб);

[Функция СумВалПриход - Приход(СумВал);

(Функция СумРубРасход = Расход(СумРуб);

(Функция СумВалРасход = Расход(СумВал);

(Функция ДолгКлиентаРуб = КонОст(СумРуб) когда(СумРуб=0)-

(Функция ДолгКлиентаВал = КонОст(СумВал) когда(СумВал-0);

(Функция НашДолгРуб = КонОст(СумРуб) когда(СумРуб0);

[Функция НашДолгВал = КонОст(СумРуб) когда(СумВал0);

(Группировка Клиент упорядочить по Клиент.Наименование;

(Группировка Документ;

[Условие(Клиент в ВыбКлиент);

("//}}ЗАПРОС

// Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

Возврат; КонецЕсли;

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

1C предприятие 7.7. Компонента Оперативный учет

Таб.Опции(0, 0, Таб.ВысотаТаблицы{), 0); Пока Запрос.Группировка(1) = 1 Цикл // Заполнение полей Клиент Если Запрос.ЭтоГруппа(1)=1 Тогда

Таб.ВывестиСекцию{"Группа"); Иначе

Таб.ВывестиСекцию("Клиент"); КонецЕсли;

Пока Запрос.Группировка{2) = 1 Цикл // Заполнение полей Документ Таб.ВывестиСекцию("Документ"); КонецЦикла; КонецЦикла;

// Заполнение полей "Итого"

Таб.ВывестиСекцию("Итого");

// Вывод заполненной формы

Таб.ТолькоПросмотр(1};

Таб.Показать{"Сформировать", ""} ;

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

6.2. Отчет «Остатки товаров»



6.3. Диалог формы отчета «ОетаткиТоваров»

Этот отчет должен отображать текущее состояние склада, т.е. состояние регистра «ОстаткиТоваров» на момент ТА. Данный отчет также можно построить с помощью конструктора отчетов. В качестве дополнительной возможности мы в этом отчете реализуем расшифровку партий товара.

97

Глава 6. Отчеты

6.2.1. Диалог формы отчета

После работы конструктора запросов в диалог отчета необходимо внести изменения (см. 6.3). Тогда пользователь сможет вводить конкретный товар или группу товаров, причем выбор товара для обработки осуществляется из справочника «Номенклатура». Кроме того, предусмотрена возможность выбора конкретного склада, по которому будут выводиться значения остатков товаров. Выбор склада осуществляется из справочника «Места хранения».

При выводе информации формируется полный или частичный отчет (в зависимости от состояния полей ввода «ВыбТовар» и «ВыбСклад»).

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



Шабло печатной формы отчета «ОстаткиТоваров»

6.2.2. Алгоритм построения отчета

После работы конструктора в процедуру ОстаткиТоваров {) были внесены некоторые изменения.

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

При задании значений упорядочивания можно указывать на реквизиты справочника. Однако нужно помнить, что метод ЗначениеУпорядочивания(п,т) по-зволяет извлекать значения только базовых типов данных. Поясним это на примере:

(Группировка Товар упорядочить по Товар.Код, Товар.Наименование, Товар.ЕдиницаИзмерения, Товар.ЦенаЗакупки;

Поэтому вы не сможете в отчете отобразить значение 3-го параметра упорядо

чивай;^ .

[Запрос.ЗначениеУпорядочивания(1,3)

Правильный способ сосгоит в следующем:

I Группировка Товар упорядочить по Товар.Код, Товар.Наименование, Товар.ЦенаЗакупки;





Методические материалы обучения партнеров

апрель 2004 г.







Глава 6. Отчеты

99

98

1С:Предприятие7.7

Те мы в качестве параметров упорядочивания указываем только объекты базовых типов, а шаблоне печатной формы используем: Товар -^""*ц^э Двойствах

Далее, поскольку мы планируем сделать расшифроДО «™*™ то в CBO"°™* ячеек шаблона печатной формы мы задаем в поле «Расшифровка:» следующее вы-

ражение: _ __ __ , - - - - ~ I

_

Перед выводом соответствующих секций отчета п следующим образом:

|расшифровка#

мы

Пока Запрос.Группировка(1} = 1 Цикл

// Заполнение полей Товар ^

Расшифровка=СоздатьОбъект("СписокЗнахДении }; ^

Расшифровка.ДобавитьЗначение(Запрос.'Товар/ ю р },

Таб.ВывестиСекцию("Товар");

Пока Запрос.Группировка(2) = 1 Цикл

// Заполнение полей Склад wt

Расшифровка=СоздатьОбъект("СписокЗ^ачении );

Расшифровка.ДобавитьЗначение{Запрос-ТоваР'„^°Вар„ ' Расшифровка.ДобавитьЗначение(Запрос-Склад, Склад );

Таб.ВывестиСекцию{"Склад");

КонецЦикла;

КонеиДикла;

Таким образом, мы на каждой итерации цикла создаем список значений и по-мещаем в него товар, а при обработке группировки «Сю*Д» еще й текущий Склад. Расшифровку отчета мы реализуем следующим обраЗ°м:

Процедура ОбработкаЯчейкиТаблицы(Значение*Флаг)

Перем КонтФормы; „

Флар=0;// запретим стадартную обработку значения ячейки

// Примем значение расшифровки передами его как параметр

//в открываемую форму отчета КонтФормы=Значение; ОткрытьФорму ("Отчет. ПартииТоваров",

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

В форме отчета «ПартииТоваров» мы сможем получить переданное значение, используя атрибут контекста формы: Форма. Параметр.

В результате выполнения запроса мы получим военную таблицу, которая будет иметь спруктуру, которую сокращенно можно приставить следующим обра-зом:

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

чета можно представить в следующем виде:

// Процедура генерации запроса ОстаткиТоваров.

// .. i

Процедура ОстаткиТоваров() . :

Перем Запрос, ТекстЗапроса, Таб;

//Создание объекта типа Запрос

Запрос = СоздатьОбъект("Запрос");

ТекстЗапроса =

"//{{ЗАПРОС(ОстаткиТоваров)

(Товар = Регистр.ОстаткиТоваров.Товар;

I Склад = Регистр.ОстаткиТоваров.Склад;

IКолво = Регистр.ОстаткиТоваров.Количество;

(Функция Количество = КонОст{Колво);

(Группировка Товар упорядочить по Товар.Код, Товар.Наименование, Товар.ЦенаЗакупки;

[Группировка Склад упорядочить по Склад.Наименование;

(Условие(Товар в ВыбТовар);

(Условие(Склад в ВыбСклад);

I"//}}ЗАПРОС

// Если ошибка в запросе, то выход из процедуры 1 Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда ! ' ' Возврат;

КонецЕсли;





Методические материны обучения партнеров

апрель 2004 г.



100

1C предприятие 7.7. Компонента Оперативный учет

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

Расшифровка=СоздатьОбъект("СписокЗначений") ; Расшифровка.ДобавитьЗначение(Запрос.Товар,"Товар") ; Таб.ВывестиСекцию{"Товар"}; Пока Запрос.Группировка{2} = 1 Цикл // Заполнение полей Склад

Расшифровка=СоздатьОбъект("СписокЗначений"); Расшифровка.ДобавитьЗначение(Запрос.Товар,"Товар"); Расшифровка.ДобавитьЗначение(Запрос.Склад,"Склад"); Таб.ВывестиСекцию("Склад"); КонецЦикла;

КонецЦикла; ^

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

101

Глава 6. Отчеты

Этот отчет может быть получен путем расшифровки отчета «ОстаткиТоваров». Учитывая эту возможность, процесс его создания был разбит на два этапа. Вначале с помощью Конструктора отчета был создан сам отчет, а затем в модуль формы была включена предопределенная процедура Приоткрытии (), которая осуществляет прием параметров и построение отчета.

6.3.1. Диалог и шаблон печатной формы отчета



После работы конструктора запросов в диалог отчета необходимо внести изме

нения (см. 6.5). В окне диалога отчета можно вводить даты начала и конца

периода, за который желательно

получить отчет, или вызвать специ

альное окно для ввода этого периода.

Кроме этого имеется возможность

формировать отчет только по кон

кретному товару или группе товаров,

занесенных в справочник

«Номенклатура», с учетом возможности выбора конкретного склада из справочника «Места хранения».

При выводе информации фор

мируется полный или частичный (в

зависимости от состояния полей 6.6. Диалог формы отчета

ввода «ВыбТовар» и «ВыбСклад») «ПартииТоваров»

список товаров, вид шаблона печатной формы, которой представлен на рис 6.6.

Заметим, что в сформированном отчете выходные данные группируются по отдельным товарам, при этом объединение товаров по группам справочника







Процедура ОбработкаЯчейкиТаблицы(Значение,Флаг)

Перем КонтФормы;

Флаг=0;// запретим стадартную обработку значения ячейки // Примем значение расшифровки, передав его как параметр // в открываемую форму отчета

КонтФормы=Значение;

ОткрытьФорму("Отчет.ПартииТоваров",КонтФормы);

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

6.3. Отчет «Партии товаров»

Отчет «ПартииТоваров» детализирует состояние товарных запасов на предприятии по сравнению с отчетом «ОстаткиТоваров», дополнительно отображая еще движение товаров за указанный период в разрезе партий.

6.5. Шаблон печатной формы отчета «ПартииТоваров»





Методические материалы обучения партнеров

апрель 2004 г.





102 1С:Предприятие 7.7. Компонента Оперативный учет

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

6.3.2. Алгоритм работы отчета

Прежде чем привести текст модуля отчета полностью, обратим ваше внимание

на то, что запись на языке запросов:

(Группировка Товар упорядочить по Товар.Код, Товар.Наименование без групп;

приводит к тому, что во временной таблице, сформированной объектом Запрос, не будут накапливаться итоги по группам справочника «Номнеклатура».

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

103

Глава 6. Отчеты

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

// Процедура генерации запроса ПартииТоваров.

Процедура ПартииТоваров()

Перем Запрос, ТекстЗапроса, Таб;

//Создание объекта типа Запрос

Запрос = СоздатьОбъект("Запрос");

ТекстЗапроса =

"//{{ЗАПРОС(ПартииТоваров)

[Период с ВыбНачПериода по ВыбКонПериода;

(Товар = Регистр.ОстаткиТоваров.Товар;

[Склад = Регистр.ОстаткиТоваров.Склад; -

[Партия = Регистр.ОстаткиТоваров.Партия;

IКолво = Регистр.ОстаткиТоваров.Количество;

[СтРуб - Регистр.ОстаткиТоваров.СтоимостьРуб;

IСтВал = Регистр.ОстаткиТоваров.СтоимостьУЕ;

[Функция НачОстКол = НачОст(Колво);

[Функция НачОстРуб = НачОст(СтРуб);'

(Функция НачОстВал = НачОст(СтВал);

[Функция ПриходКол = Приход(Колво};

[Функция ПриходРуб = Приход(СтРуб);

(Функция ПриходВал = Приход(СтВал);

[Функция РасходКол = Расход(Колво);

[Функция РасходРуб = Расход(СтРуб);

(Функция РасходВал = Расход(СтВал);

[Функция КонОстКол = КонОст(Колво);

[Функция КонОстРуб = КонОст(СтРуб);

[Функция КонОстВал = КонОст(СтВал);

[Группировка Товар упорядочить по Товар.Код, Товар.Наименование без групп;

(Группировка Склад упорядочить по Склад.Наименование

[Группировка Партия;

(Условие(Товар в ВыбТовар);

(Условие(Склад в ВыбСклад);

Г//ИЗАПРОС

// Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

Возврат; КонецЕсли;





Методические материалы обучения партнеров

апрель 2004 г.



104

1С:Предприятие 7.7. Компонента Оперативный учет

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

// Заполнение полей Склад , .

Таб-ВывестиСекцию("Склад"); °

Пока Запрос.Группировка(3) = 1 Цикл ,

// Заполнение полей Партия Таб.ВывестиСе кцию("Партия"); КонецЦикла; КонецЦикла;

КонецЦикла; J

// Заполнение полей "Итого"

Таб.ВывестиСекцию{"Итого");

// Вывод заполненной формы

Таб.ТолькоПросмотр{1};

Таб.Показать("ПартииТоваров", "");

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

105

Глава J. Отчеты

// определимся с периодом отчета

Если ПустоеЗначение(ВыбНачПериода)=1 Тогда

// "по умолчанию" в качестве начальной даты принимается //дата начала того месяца, в котором лежит дата ТА ЗыбНачПериода=НачМесяца(ПолучитьДатуТА(});

КонецЕсли;

Если (ПустоеЗначение(ВыбКонПериода)=1) или (ВыбКонПериода=ПолучитьДатуТА()) Тогда // Если конечная дата не введена или она больше даты // ТА, то конечной дате присваивается значение даты ТА ЗыбКонПериода=ПолучитьДатуТА();

КонецЕсли;

// Сформируем отчет не открывая диалог

ПартииТоваров();

Стс1тусВозврата (0) ; "'

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

i. ., _ . .1

Если Форма. Параметр будет иметь пустое значение, тогда процедура завершает свою работу и пользователь формирует отчет интерактивным образом.

В противном случае этот атрибут содержит ссылку на объект типа «СписокЗначнний». Поэтому мы можем извлечь предварительно сохранные отчетом «ОстаткиТоваров», значения:

ВыбТовар=Форма.Параметр.Получить("Товар"); ВыбСклад=Форма.Параметр.Получить("Склад");







6.3.3. Вызов отчета «Партии товаров» из отчета «Остатки товаров»

Рассмотрим связь между отчетами «Остатки товаров» и «Партии товаров». Для приема параметров из отчета «ОстаткиТоваров» мы воспользуемся атрибутом контекста формы: Форма. Параметр. Тогда предопределенная процедура ПриОткрытии {) будет выглядеть следующим образом:

Процедура ПриОткрытии()

// Если отчет вызван через пункт меню, то продолжим работу Если ПустоеЗначение(Форма.Параметр)=1 Тогда

Возврат; КонецЕсли;

// Отчет вызван из отчета "ОстаткиТоваров" ВыбТоварФорма.Параметр.Получить("Товар"); ВыбСклад=Форма.Параметр.Получить{"Склад");

Эти значения были сохранены отчетом «ОстаткиТоваров» в содержимое поля «Расшифровка» свойств соответствующей ячейки отчета (см. 6.7).

6.7. Свойства ячейки таблицы

Вызов процедуры выполняется по , , .j.,j.l^_^^_^___^^ ,i двойному щелчку левой кнопкой мыши или нажатию клавиши Enter на выбранной ячейке. В конце выражения, записанного в поле «Расшифровка» поставлен управляющий символ «#» без кавычек, означающий, что выражение расшифровки будет использовано как расшифровка для всех ячеек данной строки. Предопределенная процедура ОбработкаЯчейкиТаблицы{) модуля формы отчета «Остатки товаров» была рассмотрена в предыдущем разделе.





Методические материалы обучения партнеров

апрегнь 2004 г.



106

1C предприятие 7.7. Компонента Оперативный учет

6.4. Отчет «Резервы товаров»

Этот отчет позволяет посмотреть остатки и движение резерва товаров за период от некоторой даты по ТА. В отчете отображается только количество товара. Кроме того, можно увидеть движение: сколько товара было отложено и сколько снято с резерва.

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

6.4.1. Диалог и шаблон печатной формы отчета

Диалог отчета представлен на 6.8. Обратим внимание на то, что в диалоге выбирается только начало периода, а в качестве конца периода используется ТА.



Кроме этого, в окне диалога отчета предусмотрен выбор для обработки кон

кретного товара или группы товаров,

причем этот выбор осуществляется из

справочника «Номенклатура». Созда

ние списка зарезервированных товаров

может быть осуществлено по конкрет

ному покупателю или их группе, вы

бранных из справочника

«Контрагенты».

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

6.8. Диалог формы отчета «РезервыТоваров»



Отчет о езервировании товаров

6.9. Шаблон печатной формы отчета «РеэервыТоваров»

Вид шаблона печатной формы, которой представлен на рис 6.9.

107

Глава 6. Отчеты

6.4.2. Алгоритм построения отчета

в процедуру

После работы конструктора мы внесли изменения резерыТоваров (), которые мы рассмотрим ниже.

Для того чтобы построить отчет «по Точку Актуальности» мы из секции «Период» текста запроса удалим конец периода:

Период с ВыбНачПериода.

i

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

Пока Запрос.Группировка(2) = 1 Цикл // Заполнение полей Документ Если Запрос.ПрихКолоО Тогда

Таб.ВывестиСекцию("Приход"); КонецЕсли; Если Запрос. РасхКолоО Тогда

Таб.ВывестиСекцию("Расход"); КонецЕсли; КонецЦикла;

В результате выполнения запроса мы получим временную таблицу, которая будет иметь структуру, которую сокращенно можно представить следующим обра-

зом:



1

' Товар/ Документ Начальный Отл'оже- Снято Конечный

резерв но резерв

1С:Предприятие 7.7.

2

' 5

6

1

ПРОФ на CD-ROM

Расходная накладная №1

2

Счет №2

3

Расходная накладная №2

3

Счет№3

2

Расходная накладная №3

1

1C .'Торговля и склад 7.5

1

4

3

2

ПРОФ

Счет №2

3

Расходная накладная №2

3

Счет №3

1

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





Методические материалы обучения партнеров

апрель 2004 г.



108

1С:Предприятие 7.7. Компонента Оперативный учет

у/*** *****

// Процедура генерации запроса РезервыТоваров.

II-

Процедура РезервыТоваров()

Перем Запрос, ТекстЗапроса, Таб;

//Создание объекта типа Запрос

Запрос = СоздатьОбъект("Запрос"};

ТекстЗапроса =

"//{{ЗАПРОС{РезервыТоваров}

I Период с ВыбНачПериода;

(Товар = Регистр.РезервыТоваров.Товар;

[Клиент = Регистр.РезервыТоваров.ПоСчету.Покупатель;

|Кол = Регистр.РезервыТоваров,РезервТовара;

(Функция НачКол = НачОст(Кол);

|Функция ПрихКол = Приход(Кол);

(Функция РасхКол = Расход(Кол);

I Функция КонКол = КонОст(Кол);

(Группировка Товар упорядочить пр Товар.Наименование;

(Группировка Документ;

(Условие(Товар в ВыбТовар);

(Условие(Клиент в ВыбКлиент);

("//}}ЗАПРОС

;

// Если ошибка в запросе, то выход из процедуры

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

Возврат; КонецЕсли;

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

Таб.ВывестиСекцию("Товар") ; ; : .

Пока Запрос.Группировка(2) = 1 Цикл // Заполнение полей Документ Если Запрос.ПрихКолоО Тогда

Таб.ВывестиСекцию("Приход") ; КонецЕсли;

Отчеты

Если Запрос. РасхКолОО Тогда

Таб.ВывестиСекцию("Расход"); КонецЕсли; КонецЦикла; КонецЦикла;



Содержание раздела