МОДУЛЬ ЗВІТУ З ЗАПИТОМ

Довгий код за вибором даних прийнято заміняти запитами до файлів бази даних У СУБД загального призначення, наприклад FoxPro, запити не тільки компактніше за кодом, а й ефективніше за швидкодією В 1С остання якість запитів не настільки очевидно

Результатом виконання запиту є таблиця, яка містить відібрані запитом дані На основі цієї таблиці можна, наприклад, створити звіт, виконати необхідні обчислення або інші передбачені алгоритмом дії

Запит 1С це обєкт, наприклад ЗАПБТ, що зявляється в програмі в результаті

присвоювання

ЗАПБТ = СоздатьОбект (Запит)

Зміст запиту оформляється в 1С, як правило, у вигляді довгої, розташованої на декількох рядках символьної іменованої константи, наприкладтекст ЗАПБТ,яка потім використовується як параметр методу Виконати:

прапор = запСВиполніть (текстЗапС)

Метод Виконати поверне 1 при успішному виконанні запиту або 0-в разі невдачі

Залишимо діалог обробки Проба без змін, але видалимо з її модуля раніше внесений в нього код (крім процедури прочинене) і замінимо його на ніжепріводімие процедури і функції Перша, що має імя ЗапрСотр, виконує запит до довідника Сотруднікі_2, вибираючи в результаті дані, що задовольняють перерахованим в розд 5111 критеріям Процедура ВивТабСотр формує, використовуючи макет таблиці Сотруднікі_2 (див рис 557) обробки Проба, звіт Зрозуміло, якщо в діалозі (див рис 556) для змінної обр задано значення Вища, а для змінноїокл2000, то підсумковий звіт повністю співпаде з результатом, що містяться в табл 57

Призначення інших програмних компонентів модуля обробки Проба буде пояснюватися супроводжуючим їх коментарем

/ / Встановимо початкові значення змінних діалогу обр і окл

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

відобра = СоздатьОбект (СправочнікОбразованіе_2) відОбрВибратьЕлементи () відОбрПолучітьЕлемент ()

/ / Використовуємо в якості початкового значення змінної обр

// перший елемент довідника Образованіе_2 обр = відОбрТекущійЕлемент ()

окл = 20000 / / руб

КонецПроцедури / / прочинене

/ / Формуємо і виконуємо запит по співробітникам,

/ / Мають освіту обр і оклад, не менший окл

// Функція приймає і повертає параметр ЗАПБТ типу Запит функція ЗапрСотр (ЗАПБТ)

Перем текстЗапС / / Зміст запиту перем рабДат

рабДат = РабочаяДата () текстЗапС =

| Період з рабДат по рабДат / / Дата для періодичного реквізиту Оклад

/ / Змінні запиту

| Рід = СправочникСотрудники_2ТекущийЭлементРодитель

| ІмяСотр = СправочникСотрудники_2Наименование

| Код = СправочнікСотруднікі_2Код

| Освіту = СправочникСотрудники_2Образование

| Оклад = СправочникСотрудники_2Оклад

/ / Задаємо порядок вибірки даних

| Угруповання рід

| Угруповання імяСотр

| Умова ((освіта = обр) і (оклад> = окл)) ;

/ / Виконуємо запит і повертаємо 1 у випадку удачі, або 0, якщо є проблеми повернення запСВиполніть (текстЗапС)

КонецФункции / / ЗапрСотр

функція НайтіДП (ССОТР 2, код) далі

/ / Виводить дані в таблицю Сотруднікі_2 обробки Проба процедура ВивТабСотр (ЗАПБТ)

перем табл

/ / Створюємо обєктисСотр_2 і табл

// Обєкт сСотр_2 створюється для функції НайтіДП, що здійснює пошук

/ / Дати прийому на роботу співробітника

сСотр_2 = СоздатьОбект (СправочнікСотруднікі_2) табл = СоздатьОбект (Таблиця)

/ / Звяжемо змінну табл з таблицею Сотруднікі_2, що містить макет звіту таблІсходнаяТабліца (Сотруднікі_2)

/ / При виведенні застосовуємо задані за умовчанням параметри таблиці

/ / Для їх зміни слід звернутися до методу Опції таблВивестіСекцію (заг) / / Виводимо секцію заг

// Висновок запиту в таблицю Сотруднікі_2 поки запСГруппіровка (рід) = 1 цикл

підр = запСРод

таблВивестіСекцію (підр)

поки запСГруппіровка (імяСотр) = 1 цикл співр = запСІмяСотр

код = запСКод

дП = НайтіДП (сСотр_2, код) ставка = запСОклад

/ / Висновок черговий рядки в звіт

таблВивестіСекцію (співр) конецЦікла / / Поки

конецЦікла / / Поки

таблВивестіСекцію (датаОтч) / / Дата звіту

/ / Забороняємо редагування результуючої таблиці таблТолькоПросмотр (1)

/ / Задаємо в методі Показати заголовок вікна з результуючої таблицею таблПоказать (Вибірка з довідника Сотруднікі_2)

КонецПроцедури / / ВивТабСотр

/ / Знаходить, якщо є посилання на наказ про прийом на роботу, дату працевлаштування співробітника функція НайтіДП (ССОТР 2, код)

сСотр_2НайтіПоКоду (код, 0) / / Шукаємо у всьому довіднику

/ / Повернемо або дату наказу про прийом на роботу, або символ -, якщо

/ / В розглянутій запису довідника Сотруднікі_2 немає посилання на наказ повернення (ПустоеЗначеніе (сСотр_2ПріказПріем) = 0,

сСотр_2ПриказПриемДатаПриема, -)

КонецФункции / / НайтіДП

процедура Виконати () / / Повязана з кнопкою Пуск обробки Проба перем ЗАПБТ, тЗнач

/ / Створюємо обєкти ЗАПБТ і тЗначЗАПБТ = СоздатьОбект (Запит) якщо ЗапрСотр (ЗАПБТ) = 0 тоді

повернення / / Запит не вдався

КонецЕсли

/ / Якщо в звіті немає відомостей про співробітників якщо запСГруппіровка (рід) = 0 тоді

Попередження (Співробітників, що відповідають заданим умовам, немає”)

повернення інакше

запСВНачалоВиборкі () КонецЕсли

/ / Створюємо обєкт тЗнач для проміжної демонстрації вибірки запиту тЗнач = СоздатьОбект (ТабліцаЗначеній)

/ / Вивантажуємо всі змінні запиту в таблицю значень тЗнач

// для його попереднього перегляду запСВигрузіть (тЗнач, 1)

/ / Перегляд таблиці значень (результатів запиту) тЗначВибратьСтроку (, Запит в таблиці значень)

/ / Виводимо вибірку запиту в таблицю Сотруднікі_2

ВивТабСотр (ЗАПБТ) КонецПроцедури / / Виконати

Результат наведено в табл 57

Зробимо деякі пояснення

Результатом запиту євибірка,що є послідовністюзаписів Фактично вибірка є таблицею, в шпальтах якої розташовані значення заданих в тексті запиту змінних в нашому випадку змінних родг імяСотр, код, освіта іокладУ загальному випадку вибірка складається з декількох груп, що задаються в тексті запиту оператором Угруповання

Швидкий перегляд вибірки запиту можна організувати, виконавши два наступних методу:

/ / Вивантажуємо всі змінні запиту в таблицю значень тЗнач

запСВигрузіть (тЗнач, 1)

/ / Перегляд таблиці значень

тЗначВибратьСтроку (, Запит в таблиці значень)

Результат см на рис 558

Рис 558 Запит ЗАПБТ, відображений в таблиці значень тЗнач

Перегляд таблиці показує, що в ній розташовані всі потрібні нам дані (крім дати наказу про прийом на роботу), причому згруповані і впорядковані належним чином Обсяг обираних даних, спосіб угруповання і їх порядок визначається текстом запиту

Текст запиту текстЗапСмістить, по-перше, дату, що задається рядком період з рабДат по рабДат. Дата в цьому запиті потрібна тільки для визначення значення періодичного реквізиту Оклад і грає ту ж роль, що й метод ІспользоватьДату при простій вибірці з довідника Далі перераховуються реквізити, значення яких необхідно розмістити в запиті (у результуючій таблиці), та порядок вибірки, встановлюваний операторами Угруповання Критерій вибору даних задається оператором Умова

Послідовність операторів Угруповання, наприклад

| Угруповання рід

| Угруповання імяСотр

призводить до створення вкладених груп даних Так, в нашому випадку спожиті угруповання відображають наявну в довіднику Сотруднікі_2 ієрархію даних

У тексті запиту можна розміщувати зовнішні стосовно запиту змінні, але тільки ті, до яких є доступ в програмному компоненті, що містить команду виконання запиту

/ / Повинні бути видні наявні в тексті запиту змінні рабДат, обр і окл

запСВиполніть (текстЗапС)

Оскільки в тексті запиту не можна розмістити рядок дП = СправочникСотрудники_2ПриказПриемДатаПриема”

задающую вибірку (ці обмеження накладає 1С), то для отримання дати прийому співробітника на роботу в код введена функція НайтіДП, що працює зі спеціально створеним для неї обєктом  сСотр_1,мають різновид типу СправочнікіСотруднікі_2

Так як текст запиту є символьної змінної, то для його формування можна використовувати кілька рядків, обєднуючи їх за допомогою уживаної з рядками операцією конкатенації (Додавання) Наприклад:

/ / Дата для періодичного реквізиту Оклад датаЗапр = період з рабДат по рабДат”;

перемЗапр = / / Змінні запиту

| Рід = СправочникСотрудники_2ТекущийЭлементРодитель

| ІмяСотр = СправочникСотрудники_2Наименование

| Код = СправочнікСотруднікі_2Код

| Освіту = СправочникСотрудники_2Образование

| Оклад = СправочникСотрудники_2Оклад ;

групЗапр = угруповання рід / / Групи запиту

| Угруповання імяСотр ; услЗапр = / / Умова вибірки

| Умова ((освіта = обр) і (оклад> = окл)) ;

/ / Формуємо текст запиту

текстЗапС = датаЗапр + перемЗапр + групЗапр + услЗапр

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

/ / Позиціонуємо перед першим рядком таблиці значень тЗнач

тЗначВибратьСтрокі ()

/ / Перебір рядків таблиці значень починається з її першого рядка поки тЗначПолучітьСтроку () = 1 цикл

підр = тЗначРод

якщо ПустоеЗначеніе (підр) = 1 тоді / / Нічого не вводимо

продовжити / / Перехід на початок циклу КонецЕсли

співр = тЗначІмяСотр

/ / Висновок черговий рядки в звіт

якщо ПустоеЗначеніе (співр) = 1 тоді / / Рядок містить імя підрозділи

таблВивестіСекцію (підр)

інакше / / Рядок містить дані про співробітника

код = тЗначКод

дП = НайтіДП (сСотр_2, код) ставка = тЗначОклад таблВивестіСекцію (співр)

КонецЕсли конецЦікла / / Поки

Однак для перебору елементів вибірки, створеної запитом, в більшості випадків зручніше користуватися методом Угруповання, які приймають назву групи та отримують чергове значення вибірки в заданій групі Оскільки відразу після виконання запиту він позиціонується перед першою своєю записом, то перше вживання методу Угруповання з імям старшої групи, наприклад

запСГруппіровка (рід)

забезпечить переміщення на перший запис вибірки

Перебір записів починається з першої старшої групи Після її вибору можна перебрати належні їй записи, знову вживши метод Угруповання, але передавши йому як параметр імя групи, розташованої на наступному рівні ієрархії вибірки Метод Угруповання поверне 0, якщо або обрана запис іншого рівня ієрархії вибірки, або вибірка вичерпана В іншому випадку Угрупування повертає число 1 Зрозуміло, що для перебору найбільше підходить керуюча конструкція цикл Поки, яку ми і застосували у вищенаведеній процедурі Виконати

Оскільки наш запит має дві вкладені групи, рід іімяСотр,то для перебору їх записів довелося використовувати вкладені конструкції Поки Якщо потрібно вивести тільки значення старшої групи, то достатньо одного циклу, наприклад такого:

поки запСГруппіровка (рід) = 1 цикл підр = запСРод таблВивестіСекцію (підр)

конецЦікла / / Поки

Нам вже зрозуміло, що доступ до окремого компоненту записи вибірки запиту здійснюється за відомою схемою <Ім'я запиту> <Ім'я змінної запиту>, наприклад

Повідомити (запСІмяСотр) / / Друкуємо імя співробітника

Джерело: Бартеньев О В 1С: Підприємство: програмування для всіх Базові обєкти та розрахунки на одній дискеті М: Діалог-МІФІ, 2005 464 с

Схожі статті:


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

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*