Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Выбор между объектными и необъектными даннымиСодержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
Например, одним из типичных вопросов, возникающих в сложных случаях, является выбор между объектными и необъектными данными. Чаще всего это выбор между справочником и регистром сведений. Здесь рекомендуется, прежде всего, обратить внимание на природу данных предметной области. Если сами данные являются, по сути, перечнем уникальных объектов, то рекомендуется использовать объектные данные. Важным моментом проектирования структуры метаданных является то, что выбор вида объекта конфигурации не может производиться для каждой сущности предметной области отдельно. Необходимо обязательно анализировать всю совокупность сущностей, отражаемых в конфигурации на текущий момент, а также учитывать возможное включение новых сущностей в дальнейшем. Поэтому о правильности принятия решения можно говорить только с учетом состава задач, решаемых при разработке конкретной конфигурации. Например, в одном прикладном решении состав сотрудников организации будет правильно отражаться в справочнике, так как с точки зрения этой конфигурации сотрудник является объектом. Однако в другой конфигурации, содержащей более широкую функциональность (например, многофирменность), может быть принято решение в справочнике отражать такую сущность, как физические лица, как более общее понятие. А информация о сотрудниках в этом случае может храниться в регистре сведений. Фактически регистр сведений будет отражать факт работы конкретного физического лица в конкретной организации, реализуя, таким образом, связь «многие ко многим». Но может быть принято решение в пользу хранения и в этом случае сотрудников в справочнике, фактически отражая в справочнике в качестве объектов не физическое лицо, а трудовой договор, в котором указывается физическое лицо и организация. В этом случае справочник будет не просто связывать физические лица и организации, а описывать объекты — трудовые договоры, имеющие свойство уникальности в пространстве и времени. Таким образом, при проектировании состава объектов конфигурации, разработчику очень важно четко представлять какую сущность предметной области будет отражать конкретный объект. Анализ логики работы прикладных объектов с данными Важно учитывать, что объекты конфигурации того или иного вида описывают не просто таблицы базы данных с некоторым набором полей, а обеспечивают определенную логику работы с данными. Эта логика определяет и состав возможностей, автоматически предоставляемых разработчику, и набор ограничений, и параметры производительности тех или иных операций с данными. Типичнойошибкой, например, является использование регистра сведений в качестве простой таблицы для записи некоторых данных. Регистр сведений предназначен для хранения сведений, соответствующих определенным комбинациям значений измерений. Соответственно, одним из основных его свойств является обеспечение уникальности записей по составу измерений и периоду (для периодического регистра). Поэтому при каждой записи регистр сведений выполняет в обязательном порядке удаление существующих записей с такой комбинацией значений измерений или проверку уникальности (в зависимости от способа записи). Если при этом выполняется добавление одиночных записей с помощью менеджера записи, то такая операция будет приводить к достаточно большим накладным расходам, особенно если имеется большое количество измерений. Таким образом, если отражаемая сущность предметной области не подходит по своей природе под регистр сведений, то следует рассмотреть целесообразность использования регистра сведений (особенно с учетом предполагаемого объема хранимой информации). Язык запросов
Запросы реализуют табличный способ доступа к данным, которые хранятся в базе данных 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, а вместо них можно написать ЦенаПоКонтрагенту и Цена.
Теперь текст запрос нужно присвоить некоторой переменной типа Запрос, передать ей необходимые параметры и выполнить сам запрос. Законченный вариант процедуры будет выглядеть так:
Теперь перепишем с помощью языка запросов обработку проведения. При этом удалим процедуру ПроверитьКорректность, а все проверки заполнения реквизитов формы будет производить непосредственно в обработчике проведния. Текст обработчика представлен ниже:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-08-10; просмотров: 411; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.16.152 (0.012 с.) |