Главная » 1С Предприятие » ПРОСТОЙ ОТЧЕТ ДЛЯ СПРАВОЧНИКА

0

5.11.1.   ДИАЛОГ  И  ТАБЛИЦА  ОТЧЕТА

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

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

Рис. 5.57. Макет отчета о сотрудниках

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

5.11.2.   МОДУЛЬ  ОТЧЕТА

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

Алгоритм   формирования   отчета:

1.       Начало.

2.       Создать  объект  сСотр_2, имеющий разновидность типа Справочник.Сотрудники_2.

3.      Установить дату для  периодического  реквизита Оклад.

4.       Открыть выборку из справочника  Сотрудникик_2.

5.      Если  текущий  элемент это  группа, то  найти,  нужно  ли  выводить секцию  подр.

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

функция  НайтиФлагПодр.  Предварительно, когда  найдено первое  подразделение (числоПодр     =  1), создается объект  табл,  имеющий тип Таблица,   и  выводится заголовок отчета  секция заг.

6.       Если  текущий  элемент это  сотрудник, то  вывести  секцию  сотр,  если  сотрудник удовлетворяет  заданным условиям,  или  перейти  на  начало   цикла  в  противном случае.

7.       После  завершения выборки, если в отчете  есть данные о сотрудниках   (числоПодр  > 0), вывести дату отчета  и  показать отчет, иначе вывести предупреждение  о том, что отчет пуст.

8.       Конец.

// Установим начальные значения переменных диалога обр и окл

процедура ПриОткрытии() перем  видОбр; ОчиститьОкноСообщений();

видОбр =  СоздатьОбъект("Справочник.Образование_2");

видОбр.ВыбратьЭлементы(); видОбр.ПолучитьЭлемент();

// Используем в качестве начального значения переменной обр

// первый элемент справочника Образование_2 обр = видОбр.ТекущийЭлемент();

окл  = 2000.0                     //                             руб.

конецПроцедуры // ПриОткрытии

функция ЕслиПродолжить(сСотр_2) далее функция НайтиФлагПодр(кодПодр) далее

процедура Выполнить()                     //              Связана с кнопкой Пуск обработки Проба  перем сСотр_2, сотр, код, дП, ставка, подр, текПодр;

перем табл, числоПодр;

// Создаем объекты сСотр_2 и табл

сСотр_2  =  СоздатьОбъект("Справочник.Сотрудники_2");

// Дата для периодического реквизита Оклад справочника Сотрудники_2 сСотр_2.ИспользоватьДату(РабочаяДата());

// Позиционируемся на первой записи справочника Сотрудники_2

сСотр_2.ВыбратьЭлементы(1);

//

Задаем  выборку с учетом иерархии

числоПодр  = 0;

//

Число выбранных  подразделений

// Включаем в выборку все подчиненные элементы

пока сСотр_2.ПолучитьЭлемент(1)= 1 цикл если сСотр_2.ЭтоГруппа() = 1 тогда

// Найдем, нужно ли выводить секцию подр

если НайтиФлагПодр(сСотр_2.Код) = 0 тогда

продолжить;                   //           В этом  подразделении нет сотрудников, иначе                            //                 удовлетворяющих условиям обр и окл

числоПодр = числоПодр + 1;

// Если есть хотя бы один сотрудник, удовлетворяющий заданным условиям,

// то начинаем формировать тотчет

если числоПодр =  1 тогда

табл = СоздатьОбъект("Таблица");

// Свяжем переменную  табл с таблицей Сотрудники_2,

// содержащей макет отчета табл.ИсходнаяТаблица("Сотрудники_2");

// При выводе применяем заданные по умолчанию  параметры таблицы;

// для  их изменения следует  обратиться  к методу Опции табл.ВывестиСекцию("заг");   // Выводим  секцию заг

конецЕсли;

подр = сСотр_2.Наименование; табл.ВывестиСекцию("подр"); продолжить;

конецЕсли;

конецЕсли;

если ЕслиПродолжить(сСотр_2) =  1 тогда

продолжить;                        //                Переход на начало  цикла конецЕсли;

сотр = сСотр_2.Наименование;

код = сСотр_2.Код;

если ПустоеЗначение(сСотр_2.ПриказПрием) = 0 тогда

// Дату трудоустройства берем из соответствующего приказа о приеме на работу дП = сСотр_2.ПриказПрием.ДатаПриема;

иначе

дП = "-"; конецЕсли;

ставка =  сСотр_2.0клад;

// Вывод очередной строки в отчет табл.ВывестиСекцию("сотр");

конецЦикла; // пока

если числоПодр = 0 тогда

Предупреждение("Сотрудников, отвечающих заданным условиям,  нет.");

иначе                                         //

В отчете  есть сотрудники

табл.ВывестиСекцию("датаОтч");

//

Дата  отчета

// Запрещаем  редактирование результирующей таблицы

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

// Задаем в методе  Показать заголовок  окна  с результирующей таблицей табл.Показать("Выборка из справочника  Сотрудники_2");

конецЕсли;

конецПроцедуры // Выполнить. Результат приведен в табл. 5.7

// Возвращает 1, если  сотрудник  не удовлетворяет требованиям обр и  окл

функция ЕслиПродолжить(сСотр_2)

если  (сСотр_2.Оклад < окл)  или (сСотр_2.Образование <>  обр)  тогда

возврат 1;                         //               Условия, заданные в диалоге,  не выполняются иначе

возврат 0;                       //               Цикл не прерывается

конецЕсли;

конецФункции // ЕслиПродолжить

// Функция  НайтиФлагПодр вернет 1, если в подразделении есть

// хотя  бы  один сотрудник, удовлетворяющий  условиям,

// заданным переменными обр и окл,  или 0 -в противном случае Функция НайтиФлагПодр(кодПодр)

перем  сСотр_2а;

сСотр_2а  =  СоздатьОбъект("Справочник.Сотрудиики_2");

// Дата для периодического реквизита Оклад справочника Сотрудники_2 сСотр_2а.ИспользоватьДату(РабочаяДата());

// Найдем группу. Ищем во всем справочнике

сСотр_2а.НайтиПоКоду(кодПодр,  0);

// Задаем  родителя, в пределах  которого будет осуществляться последующая выборка сСотр_2а.ИспользоватьРодителя(сСотр_2а.ТекущийЭлемент());

// или проще: сСотр_2а.ИспользоватьРодителя(сСотр_2а);

сСотр_2а.ВыбратьЭлементы(1);  //          Задаем  выборку с учетом  иерархии

// Включаем в выборку все подчиненные элементы пока сСотр_2а.ПолучитьЭлемент(1) = 1 цикл

если ЕслиПродолжить(сСотр_2а) = 0 тогда

возврат 1;

//

Сотрудник, подходящий  под условия

конецЕсли;

//

обр и окл, найден

конецЦикла;

возврат 0;  // Нет нужного сотрудника конецФункции // НайтиФлагПодр

Таблица 5.7

Сотрудники,  имеющие высшее образование  и оклад,  не меньший 2000  руб.

Сотрудник

Код

Дата  трудоустройства

Оклад

Подразделение 01 Цех

Подразделение 01/1

Агальцов  Юрий Алексеевич

111

-

2900

Подразделение  01 / 2

Кузьмина Раиса Николаевна

122

-

2700

Подразделение 02 Цех

Абрамова Лариса Сергеевна

201

-

2000

Горюнова  Ульяна  Валерьевна

2010

20.11.01

2700

Дата отчета 29.11.01

-

Источник: Бартеньев О. В. 1С:Предприятие:  программирование для  всех.  Базовые объекты и расчеты на одной дискете. М.: Диалог-МИФИ, 2005. 464 с.

По теме:

  • Комментарии