Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Проектирование структуры метаданных↑ Стр 1 из 3Следующая ⇒ Содержание книги
Поиск на нашем сайте
СОДЕРЖАНИЕ
1. Цель работы.. 4 2. Теоретические сведения. 4 2.1 Методология разработки. 4 2.2 Язык запросов..........................................................................................12 2.3 Аналитическая отчетность. 13 3. Пример выполнения.......................................................................................14 4. Порядок выполнения работы.. 28 5. Варианты заданий. 28 6. Контрольные вопросы.. 28 Библиография. 29 Приложение А 30
ЦЕЛЬ РАБОТЫ Ознакомиться с формированием аналитической отчетности. Разработать небольшую систему учета на основе описания предметной области.
ОСНОВНЫЕ ПОЛОЖЕНИЯ
2.1 Методология разработки
Можно сказать, что собственно создание будущего прикладного решения начинается с его проектирования. Предполагается, что к этому моменту задача, стоящая перед будущим прикладным решением, уже полностью сформулирована: проведено обследование заказчика, формализованы требования, выработано техническое задание и получена полная информация, которая необходима для того, чтобы начать непосредственное создание конфигурации. Уже на этом этапе начинаются серьезные отличия. При создании простых прикладных решений, собственно процесс проектирования может зачастую вообще отсутствовать. Это связано с тем, что структура объектов метаданных позволяет разработчику мыслить не таблицами и полями, а объектами, описывающими сущности конкретной прикладной области. Поэтому зачастую термины предметной области однозначно и полностью могут быть перенесены в структуру метаданных. Например, если заказчик использует каталог товаров и два документа, которые регистрируют поступление и расход товаров, то ровно таким же образом эта структура может быть перенесена и в прикладное решение: один справочник и два документа. Если требуемая функциональность решения невелика, то разработчик вполне может держать структуру метаданных «в голове» и запись ее «на бумаге» может потребоваться лишь для отражения в документации. Совершенно другая картина возникает, когда начинается разработка крупного проекта. Здесь уже требуются усилия нескольких человек, как для постановки задачи, так и для проектирования. Причем в процессе проектирования приходится решать ряд дополнительных задач. Прежде всего, это решение вопроса о том, каким образом будет реализовываться та или иная функциональность будущей системы. В крупных решениях, как правило, всегда присутствует большое количество функциональности, которая не может быть реализована только каким-либо одним объектом конфигурации. Возникает необходимость задействовать несколько различных объектов, причем далеко не всегда можно однозначно, без внимательного рассмотрения, сказать, какие именно объекты конфигурации лучше использовать в данном случае. Одна и та же задача, в принципе, может быть решена с использованием различных объектов конфигурации, поэтому вопрос правильного выбора используемых объектов и построения эффективной структуры метаданных приобретает первостепенное значение. Если бы важность правильного выбора объектов метаданных была бы обусловлена только этой причиной — одно это явилось бы достаточно серьезным поводом, чтобы уделить процессу проектирования значительное внимание. Однако есть еще целый ряд факторов, которые еще больше поднимают значимость этапа проектирования. Если в простой конфигурации при проектировании метаданных будет допущена ошибка, то это, конечно, неприятный факт, но не катастрофический. При определенных условиях даже полная переделка всего прикладного решения может быть выполнена в разумные сроки и разумными средствами. Однако если ошибка в проектировании метаданных будет допущена в крупном проекте, это может стать полной катастрофой, поскольку потребует огромных ресурсов для ее исправления и «встраивания» новых объектов и новых алгоритмов в уже существующее прикладное решение. Другим важным аспектом правильного проектирования структуры метаданных является производительность системы. Производительность простых прикладных решений, как правило, «непроизвольно» тестируется самим разработчиком в процессе проверки правильности реализуемых алгоритмов. Таким образом, он сразу видит, например, что тот или иной отчет работает медленно и может, как уже говорилось, даже изменить структуру метаданных без особых затрат времени и сил. В отличие от этой ситуации, большие проекты, как правило, рассчитаны на интенсивную многопользовательскую работу, поэтому, помимо собственно быстродействия, они должны обеспечивать также высокую параллельность работы пользователей. А значит, при проектировании метаданных следует внимательно анализировать создаваемую структуру на предмет возникновения «узких мест» при одновременной работе большого количества пользователей. Как говорится, «гладко было на бумаге, да забыли про овраги». Это тем более важно, поскольку быстродействие системы, которое видит разработчик в процессе отладки создаваемых алгоритмов, совершенно не имеет ничего общего с реальным быстродействием системы при полной нагрузке. Простой пример: разработчик создал документ и убедился, что он проводится быстро и правильно. Но когда несколько пользователей стали одновременно интенсивно создавать эти документы, выяснилось, что их одновременная работа просто невозможна, поскольку структура объектов метаданных, задействованных в алгоритме проведения, такова, что, проводя эти документы, пользователи блокируют одни и те же записи в таблицах базы данных. Проектирование структуры метаданных Как уже говорилось выше, этап проектирования структуры метаданных имеет одно из первостепенных значений при разработке крупных прикладных решений. Однако и для более простых решений создание правильной структуры объектов является важным и ответственным этапом разработки. От правильно принятого решения зависит не только удобство разработки и производительность создаваемого прикладного решения, но и возможность его развития и адаптации к возможным изменениям состава решаемых задач. В большинстве случаев выбор подходящего объекта конфигурации не представляет большой сложности, так как для каждого вида объекта конфигурации определено основное назначение и имеется достаточно примеров, как в методических материалах, так и в типовых конфигурациях. Однако, разумеется, состав видов объектов конфигурации, предоставляемый платформой, как любая классификация не может однозначно определять выбор подходящего объекта во всех случаях. Поэтому в спорных ситуациях, когда выбор вида объекта конфигурации не очевиден, нужно внимательно проанализировать все особенности устройства и поведения объектов соответствующего вида. Язык запросов
Запросы реализуют табличный способ доступа к данным, которые хранятся в базе данных 1С:Предприятия. Это означает, что все данные представляются в виде совокупности связанных между собой таблиц, к которым можно обращаться как по отдельности, так и к нескольким таблицам во взаимосвязи.
Таблица 2 – Язык запросов
Аналитическая отчетность Конструктор выходной формы
Конструктор выходной формы помогает разработчику создавать отчеты и представлять данные отчетов в удобном табличном или графическом виде. Конструктор может быть вызван, например, из окна редактирования отчета:
Рисунок 2.1 – Конструктор выходной формы
Конструктор включает в себя все возможности конструктора запросов и кроме этого позволяет создавать и настраивать форму, которая будет использована для вывода результатов запроса пользователю. Конструктор поддерживает вывод результатов в разнообразные элементы управления: ● табличный документ - представляет результаты в виде документа, похожего на электронную таблицу; ● сводную таблицу - многомерная таблица с возможностью интерактивного формирования состава строк и столбцов; ● диаграмму - поддерживает несколько различных видов диаграмм (линейная, круговая, гистограмма и пр.); ● сводную диаграмму - диаграмма с возможностью интерактивного формирования состава строк и столбцов.
Рисунок 2.2 – Формирование табличного документа
Допускается использование перечисленных элементов управления в различных комбинациях, так что итоговый документ может содержать, например, график и расположенную рядом с ним таблицу с данными этого графика. Конструктор позволяет управлять размещением группировок, итогов и реквизитов в итоговом документе, а также выбирать один из вариантов стандартного оформления документа. Результатом работы конструктора является набор связанных процедур, которые могут располагаться в различных модулях, и готовый макет отчета. Разработчику остается лишь запустить отчет на выполнение и проверить правильность его работы. Никакого дополнительного программирования или конфигурирования не требуется - конструктор создает полностью работоспособный элемент системы.
3. Пример ВЫПОЛНЕНИЯ
Приступим к изучению языка запросов на примере документа «РасходнаяНакладная». Нам необходимо переписать все возможные алгоритмы, описанные в модуле объекта и в модуле формы, при помощи языка запросов. Однако запросы нам понадобятся не во всех алгоритмах, а только в тех, где происходит выборка данных из БД. Если открыть модуль формы документа, то окажется, что в нём всего одна процедура, которую можно переписать с использованием языка запросов - это ТоварыНоменклатураПриИзменении, в которой нам из регистра «Цены» нужно выбрать актуальную цену на товар. Удаляем весь текст, который написан в обработчике, ставим курсор на свободное место внутри процедуры и нажимаем правую кнопку мыши. В появившемся списке выбираем «Конструктор запросов».
На вопрос, нужно ли создавать новый запрос, можно смело отвечать «Да».При этом появится окно конструктора запросов. Конечно запрос можно писать и вручную, исходя из тех правил, которые описаны в пункте 2.2, но это достаточно сложный процесс, поэтому мы воспользуемся конструктором, который заметно упрощает работу и позволяет создавать сложные запросы. Перед вами 3 колонки: в 1-ой располагаются все возможные таблицы, из которых можно делать выборку; во 2-ой будут размещаться таблицы, которые необходимы нам непосредственно для запроса; в 3-ей колонке мы будем определять, а какие поля из выбранных таблиц нам нужны.
Из левого списка выберем РегистрыСведений->Цены->ЦеныСрезПоследних. Выбранная нами таблица появится в средней колонке. Откроем список её полей и выберем «Цена». Выбранные поля перемещаются в 3-ю колонку. Теперь окно должно выглядеть так.
Что мы сейчас сделали - мы показали конструктору, что хотим выбрать данные из регистра «Цены», при этом для выборки нам нужна таблица ЦеныСрезПоследних. Данная таблица не является объектом конфигурации и просмотреть её из конфигуратора невозможно. Она является встроенной таблицей регистра и обновляется автоматически при внесении в регистр каких-либо данных. Срез последних на определённую дату означает, что в регистре будет искаться самая последняя запись в интервале от 01.01.01 00:00:00 по нашу дату. Срез первых выполняет похожую функцию - ищет ближайшую запись в регистре от заданной даты до текущей. Если регистру не указывать, на какую дату искать записи, то данные будут выбираться для текущей даты.
Тем самым мы задаём 3 параметра, согласно которым будет происходить выборка. Сами параметры будут передаваться в запрос из модуля формы. Однако такой подход нас не устраивает и вот почему. Условие «Где» работает на верхнем уровне, т.е. сначала происходят соединения, объединения таблиц или другие возможные действия, а только потом на это накладываются ограничения. Намного проще сначала наложить ограничения на каждую из таблиц, а только потом соединять или объединять их - это приводит к заметному ускорению работы запроса на больших объёмах данных. Пока разница нам не видна, ведь мы работаем с одной таблицей, но стоит сразу приучать себя к правильному написанию. Поэтому все ограничения, сделанные во вкладке «Условия», мы удалим.
Во 2-ой колонке выделим нашу таблицу и нажмём на пиктограмму «Параметры виртуальной таблицы».
В поле «Период» напишем &Дата. Это означает, что в запрос будет передан некоторый параметр с именем Дата, который будет определять, на какую дату регистру брать записи. Откроем поле «Условие» и напишем следующее
По сути мы здесь написали то же самое, что до этого писали во вкладке «Условия», с той лишь разницей, что мы не передаём параметром тип цен, а указываем его сразу как предопределённый элемент перечисления. Здесь функция ЗНАЧЕНИЕ нужна для того, чтобы конструктор понял, что это вычисляемое значение, которое нужно взять из объекта конфигурации Перечисления, иначе конструктор бы считал, что Перечисление - это измерение или реквизит регистра и не найдя подобного, выдал бы ошибку. Ещё один нюанс - если во встроенном языке мы писали Перечислени Я, то в языке запросов нужно писать Перечислени Е. Теперь наш запрос вернёт всего лишь одну строчку, состоящую из 1 колонки Цена. Нужно предусмотреть момент, когда регистр не будет содержать ни одной записи, тогда запрос в качестве цены вернёт NULL, а должен вернуть число, поэтому мы явно укажем конструктору как быть в этой ситуации. В 3-ей колонке нажмём 2 раза мышкой на поле «ЦеныСрезПоследних.Цена». В открывшемся окне изменим первоначальный текст на такой: Если цена примет значение NULL, то конструктор подставит вместо NULL ноль.
Вроде бы всё, но мы забыли ещё об одном - если мы не продавили товар указанному контрагенту, мы ищем цену, по которой продавали этот товар любому контрагенту. Для этого нам потребуется ещё один запрос, но чтобы было интереснее, сделаем 2-ую выборку в этом запросе. Из 1-ой колонки ещё раз выберем ЦеныСрезПоследних. Т.к. такая таблица во 2-ой колонке уже есть конструктор переименует новую таблицу, дописав 1 к имени. Все остальные действия точно такие же за исключением настроек виртуальной таблицы - необходимо убрать строку Контрагент = &Контрагент. Тем самым мы уточняем, что нам не важен контрагент, поэтому из регистра будет взята ближайшая к указанной дате запись о продаже этой номенклатуры.
Теперь наш запрос вернёт 2 строчки, в которых указаны цены с уточнением по контрагенту и без. Но можно эти 2 строчки соединить в одну. Для этого зайдём во вкладку «Связи» и настроим связи таблиц следующим образом.
Мы связали 2 таблицы по номенклатуре, т.е. результатом соединения будет одна строка, состоящая из 2 цен. Обратите внимание на галочки Все, которые мы поставили при настройке связи. Эти галочки отвечают за вид соединения.
Наш запрос готов. Нажмём «ОК» и увидим текст запроса, который сформировал конструктор:
Когда мы воспользовались функцией ЕстьNULL, конструктор автоматически переименовал поля Цена и Цена1 в Поле1 и Пол2. Такая замена не является ошибкой, и мы сможем обращаться к этим полям, однако читабельность такого кода резко снижается, т.к. совсем не ясно, к чему именно мы обращаемся. Исправить эту ситуацию можно 2 способами: 1) Наведите курсор на текст запроса и снова зайдите в конструктор. Перейдите на вкладку «Объединения/Псевдонимы» и переименуйте поля. 2)Не заходя в конструктор, просто сотрите Поле1 и Поле2, а вместо них можно написать ЦенаПоКонтрагенту и Цена.
Теперь текст запрос нужно присвоить некоторой переменной типа Запрос, передать ей необходимые параметры и выполнить сам запрос. Законченный вариант процедуры будет выглядеть так:
Теперь перепишем с помощью языка запросов обработку проведения. При этом удалим процедуру ПроверитьКорректность, а все проверки заполнения реквизитов формы будет производить непосредственно в обработчике проведния. Текст обработчика представлен ниже:
Если НЕ Отказ Тогда Движение = Движения.Цены.Добавить(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Номенклатура = Выборка.Номенклатура; Движение.ТипЦен = Перечисления.ТипыЦен.ЦенаПродажи; Движение.Цена = Выборка.Цена; Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Склад = Склад; Движение.Номенклатура = Выборка.Номенклатура; Движение.Количество = Выборка.Количество; Если Выборка.Количество = Выборка.КоличествоОстаток Тогда Движение.Сумма = Выборка.СуммаОстаток; Иначе Движение.Сумма = Выборка.СуммаОстаток/Выборка.КоличествоОстаток*Выборка.Количество; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры
Обработка проведения в приходной накладной намного проще, поэтому её текст может быть некоторой базой для лучшего понимания расходной.
Если НЕ Отказ Тогда Движение = Движения.Цены.Добавить(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Номенклатура = Выборка.Номенклатура; Движение.ТипЦен = Перечисления.ТипыЦен.ЦенаПокупки; Движение.Цена = Выборка.Цена; Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Период = Дата; Движение.Склад = Склад; Движение.Номенклатура = Выборка.Номенклатура; Движение.Количество = Выборка.Количество; Движение.Сумма = Выборка.Сумма; КонецЕсли; КонецЦикла; КонецПроцедуры Приступим к созданию отчёта. Отчёт представляет из себя объект конфигурации, призванный отражать некоторый набор данных в удобном для пользователя виде. В 3-ей лабораторной работы мы создали печатную форму документа, и при этом использовали макет и табличный документ. Создание отчёта по своей структуре не отличается от создания печатной формы. Мы создаём тот же макет, а затем выводим данные согласно макету в табличный документ. Отличие заключается в том, что и макет, и табличный документ нам помогает создать конструктор выходной формы.
Итак, создадим новый отчёт и назовём его «ОстаткиНоменклатуры». Перейдём на вкладку Макеты->Конструкторы->Конструктор выходной формы. Нам предложат создать новую выходную форму. Соглашаемся. Перед нами открывается окно, очень напоминающее конструктор запросов. Это действительно так - основная работа по созданию отчёта в конструкторе заключается в выборке данных (как мы делали в конструкторе запросов), и только потом настраивается отображение этих данных на выходной форме. Для отчёта нам понадобится таблица ОстаткиНоменклатуры.Остатки. Из неё мы возьмём 2 поля: «Номенклатура» и «КоличествоОстаток». Заметьте, что для более компактной записи во 2-ой колонке мы переименовали таблицу ОстаткиНоменклатурыОстатки в Остатки
В настройках виртуальной таблицы в поле «Период» пишем &Дата, а в поле «Условие» Номенклатура В ИЕРАРХИИ (&Номенклатура). Что мы сейчас сделали. Мы могли не писать условие и тогда отчёт формировался бы по всей существующей номенклатуре. Мы могли написать Номенклатура = &Номенклатура, и тогда отчёт формировался бы по заданной номенклатуре. Но мы поступили иначе и написали В ИЕРАРХИИ. Это означает, что мы сможем выбрать не только конкретный товар, но и его родителя, т.е. можем посмотреть остатки по конкретному телевизору или по всем телевизорам сразу. Такой подход может применяться только для иерархических справочников. При этом, если в отчёте мы не зададим номенклатуру, то он автоматически выдаст данные для всей номенклатуры. Тоже самое происходит и с датой - если она не будет заполнена, то отчёт строится на текущую дату.
Теперь предположим, что мы хотим увидеть не только остатки по каждой номенклатуре, но и остатки в пределах группы, т.е. сколько у нас всего телевизоров и т.д. Для этого перейдём на вкладку «Итоги» и настроим окно так, как показано ниже.
Сначала из левой колонки перенесём поле «Номенклатура» в верхнее правое окошко (это означает, что итоги будут подводиться по этому полю). Затем из левой колонки перенесём поле «КоличествоОстаток» в нижнее правое окошко (это означает, что в качестве итогов будут суммироваться остатки). Внимательно посмотрите на выпадающий список «тип итогов» - он определяет иерархию, с которой будут отображаться элементы. Если выставить тип итогов в «Элементы», то выходная форма будет такой же, как если бы мы вообще не использовали итоги. Это связано с тем, что мы в отчёт и так выводим поле «КоличествоОстаток» для каждого элемента, поэтому нет никакого смысла подбивать итоги для каждого элемента, если этот итог итак уже есть в выводимой таблице. Для лучшего понимания типа итогов, продемонстрируем в работе все 3 варианта.
Элементы: Только иерархия: Элементы и иерархия:
Третий вариант нам подходит больше всего, т.к. предоставляет более полные данные. В настройках итогов не забудьте поставить галочку «Общие итоги» - это позволит нам увидеть общее количестве всей номенклатуры. Эти данные мало информативны, но зато позволят нам лучше понять возможности конструктора. Перейдём на вкладку «Отчёт» и снимем галочку «Использовать построитель отчётов». Дело в том, что кроме классического конструктора, платформа 1С предоставляет ещё 2 возможности создания отчётов: с помощью построителя и компоновщика, но мы не будем ими пользоваться, т.к. объяснение их функционирования может занять несколько отдельных лабораторных работ. Осталось перейти на закладку «Выходная форма» и настроить параметры, которые будут передаваться в отчёт:
Если у вас в списке записи дублируются, т.е. 2 поля Дата и 2 поля Номенклатура, то заполните их аналогично (это не является грубой ошибкой, а скорее недоработкой учебной версии платформы). Нажмём «ОК» и увидим, что макет и выходную форму конструктор создал за нас. Отчёт готов. Осталось добавить его в нужные интерфейсы и посмотреть на результат работы в режиме «Предприятие». При желании можно проявить фантазию и оформить отчёт более красиво для наглядности:
Также не забудьте назначить права на использование этого объекта. Порядок выполнения работы
1. Изучить теоретические сведения. 2. Изучить постановку задачи, разработать структуру метаданных конфигурации. 3. Реализовать алгоритмы функционирования системы. 4. Реализовать необходимую отчетность. 5. Подготовить отчет о работе. 5. Содержание отчета 1. Цель работы. 2. Описание варианта задания (предметной области и набора ее элементов, отображаемых в БД). 3. Копии всех подготавливаемых аналитических отчетов. 4. Выводы по работе. 6. Контрольные вопросы
1. Как определить, какие именно объекты конфигурации использовать для описания предметной области? 2. Как осуществить выбор представления данных? 3. В какие элементы управления позволяет выводить отчет конструктор выходной формы? 4. Какие данные может содержать макет? 5. Для чего используется конструктор запросов. 6. Объясните разницу между видами группировок при подведении итогов. 7. Какие виды соединения таблиц вы знаете? Опишите их.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Поделиться: |
Познавательные статьи:
Последнее изменение этой страницы: 2016-08-10; просмотров: 725; Нарушение авторского права страницы; Мы поможем в написании вашей работы!
infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.224.60.132 (0.017 с.)