Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Выбор между объектными и необъектными данными

Поиск

Например, одним из типичных вопросов, возникающих в сложных случаях, является выбор между объектными и необъектными данными. Чаще всего это выбор между справочником и регистром сведений. Здесь рекомендуется, прежде всего, обратить внимание на природу данных предметной области. Если сами данные являются, по сути, перечнем уникальных объектов, то рекомендуется использовать объектные данные. Важным моментом проектирования структуры метаданных является то, что выбор вида объекта конфигурации не может производиться для каждой сущности предметной области отдельно. Необходимо обязательно анализировать всю совокупность сущностей, отражаемых в конфигурации на текущий момент, а также учитывать возможное включение новых сущностей в дальнейшем. Поэтому о правильности принятия решения можно говорить только с учетом состава задач, решаемых при разработке конкретной конфигурации.

Например, в одном прикладном решении состав сотрудников организации будет правильно отражаться в справочнике, так как с точки зрения этой конфигурации сотрудник является объектом. Однако в другой конфигурации, содержащей более широкую функциональность (например, многофирменность), может быть принято решение в справочнике отражать такую сущность, как физические лица, как более общее понятие. А информация о сотрудниках в этом случае может храниться в регистре сведений. Фактически регистр сведений будет отражать факт работы конкретного физического лица в конкретной организации, реализуя, таким образом, связь «многие ко многим». Но может быть принято решение в пользу хранения и в этом случае сотрудников в справочнике, фактически отражая в справочнике в качестве объектов не физическое лицо, а трудовой договор, в котором указывается физическое лицо и организация. В этом случае справочник будет не просто связывать физические лица и организации, а описывать объекты — трудовые договоры, имеющие свойство уникальности в пространстве и времени.

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

Анализ логики работы прикладных объектов с данными

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

Типичнойошибкой, например, является использование регистра сведений в качестве простой таблицы для записи некоторых данных. Регистр сведений предназначен для хранения сведений, соответствующих определенным комбинациям значений измерений. Соответственно, одним из основных его свойств является обеспечение уникальности записей по составу измерений и периоду (для периодического регистра). Поэтому при каждой записи регистр сведений выполняет в обязательном порядке удаление существующих записей с такой комбинацией значений измерений или проверку уникальности (в зависимости от способа записи). Если при этом выполняется добавление одиночных записей с помощью менеджера записи, то такая операция будет приводить к достаточно большим накладным расходам, особенно если имеется большое количество измерений. Таким образом, если отражаемая сущность предметной области не подходит по своей природе под регистр сведений, то следует рассмотреть целесообразность использования регистра сведений (особенно с учетом предполагаемого объема хранимой информации).

Язык запросов

 

Запросы реализуют табличный способ доступа к данным, которые хранятся в базе данных 1С:Предприятия. Это означает, что все данные представляются в виде совокупности связанных между собой таблиц, к которым можно обращаться как по отдельности, так и к нескольким таблицам во взаимосвязи.

 

Таблица 2 – Язык запросов

1 Указание источников в запросе
  Выбрать НазваниеОрганизации, ЮридическийАдрес Из Константы Источник запроса (под источником запроса обычно понимается таблица, реальная или виртуальная) указывается после ключевого слова «Из». В общем случае источников может быть несколько. Описание источников разделяется запятыми, после последнего источника запятая не ставится.
Выбрать * Из Константы Запрос показывает содержимое всех полей в таблице констант. Исходя из назначения констант, таблица «Константы» всегда содержит одну строку.
2 Конструкции «Различные», Первые N. После ключевого слова «Выбрать» можно указывать дополнительную конструкцию «Первые N». В результат выполнения запроса войдут только первые N записей. Если указать «Различные», то результат запроса не будет содержать повторяющихся (одинаковых по значениям всех полей выборки) записей.
3 Фильтрация результатов запроса
  Выбрать * Из Справочник. Номенклатура Где Не Справочник. Номенклатура. ЭтоГруппа   Выбрать Различные ОснЕдиницаИзмерения Из Справочник.Номенклатура   Выбрать Первые 4 ОснЕдиницаИзмерения Из Справочник.Номенклатура     Для фильтрации (указания условия отбора) используется структура, определяемая ключевым словом «Где».   В данных примерах знак равно (в условии) не обязателен, так как поле «ЭтоГруппа» содержит значения типа «Булево». В условиях (это не обязательно может быть конструкция «Где») помимо обычных операций сравнения могут использоваться «В», «Между И», «Подобно», «Есть».  
4 Указание нескольких источников, соединения, псевдонимы
  Выбрать Номен. Наименование, ЕдИзм. Наименование, ЕдИзм. Коэффициент Из Справочник. Номенклатура Как Номен, Справочник. ЕдиницыИзмерения Как ЕдИзм   Во всех предыдущих примерах источник был один. Но иногда могут возникать ситуации, когда данные находятся в разных таблицах, а должны попасть в результат выполнения одного запроса. Язык запросов предоставляет возможность указывать более чем один источник. Результат подобного запроса состоит из всех возможных комбинаций записей обеих таблиц. Такой результат мало кого устроит, но так будет всегда, если не указывать способ связи таблиц.
Выбрать Номен.Наименование, ЕдИзм.Наименование, ЕдИзм.Коэффициент Из Справочник.Номенклатура Как Номен, Справочник.ЕдиницыИзмерения Как ЕдИзм Где Номен.ОснЕдиницаИзмерения. Код=ЕдИзм.Код Связывать таблицы можно с помощью конструкции языка запросов «Где». Хочется отметить, что, во-первых, данный пример является абстрактным. В реальной жизни (в общем случае) чем меньше источников вы указываете в запросе, тем лучше. Во-вторых, условие в данном примере построено не эффективно.
Номен.ОснЕдиницаИзмерения = ЕдИзм.Ссылка Если указать условие следующим образом, то время выполнения данного запроса снизится почти в два раза.
Другим способом указания взаимосвязи таблиц является использование «Соединений». Соединения бывают нескольких видов: ● Внутреннее соединение ● Левое внешнее соединение ● Правое внешнее соединение ● Полное внешнее соединение В любом случае, когда речь заходит о соединении, существует несколько связанных с этим понятий: Таблица № 1, Таблица № 2, соединение (его вид и условие соединения).Рассмотрим эти варианты на следующем примере: Есть две таблицы:  
 
Таблица 2.1
Номен Номер1
Ручка  
Карандаш  
Вилка  

 

Таблица 2.
ЕдИзм Номер2
Шт  
Гр  
Кг  
Банка  

 

 

Условием соединения будет:

Таблица1. Номер1=Таблица2. Номер2

В качестве полей запроса определим две колонки: «Номен» из первой таблицы и «ЕдИзм» из второй таблицы.

Теперь рассмотрим варианты соединения:

· Внутреннее соединение
 
Номен ЕдИзм
Ручка Шт
Ручка Банка
Вилка Гр

 

В результат выполнения запроса войдут только данные записей из обеих таблиц, для которых выполняется условие соединения    
· Левое/правое внешнее соединение
 
Номен Е Изм
Ручка Шт
Ручка Банка
Вилка Гр
Карандаш NULL

 

В результат выполнения запроса войдут данные из записей, для которых выполняется условие соединения и «не вошедшие» из Таблицы № 1. Можно сказать, что в результат запроса войдут все данные из Таблицы № 1, и для тех записей результата запроса, для которых выполнялось условие соединения в полях, куда помещаются данные из таблицы № 2, будут стоять значения, для которых условие не выполняется, будет стоять Null.
 
Номен ЕдИзм
Ручка Шт
Ручка Банка
Вилка Г  
NULL Кг

 

  Правое внешнее соединение обратно левому.      
· Полное внешнее соединение
 
Номен ЕдИзм
Ручка Шт
Ручка Банка
Вилка Гр
Карандаш NULL
NULL Кг

 

В результат запроса войдут как записи, для которых выполнялось условие соединения, так и записи, полученные из «не вошедших» данных из обеих таблиц. В любом случае, даже в результате использования полного внешнего соединения не получается полная комбинация значений. (В случае полного соединения добавляются записи, не удовлетворяющие условию, а не все возможные их комбинации).
5 Объединение таблиц
ВЫБРАТЬ Таблица1.Номен, Таблица1.Номер ИЗ Таблица1 КАК Таблица1   ОБЪЕДИНИТЬ ВСЕ   ВЫБРАТЬ Таблица2.ЕдИзм, Таблица2. Номер ИЗ Таблица2 КАК Таблица2  
Номен Номер
Ручка  
Карандаш  
Вилка  
Шт  
Гр  
Кг  
Банка  

 

В языке запросов имеется возможность объединять несколько запросов; при этом записи, полученные с помощью каждого из объединяемых запросов, будут собраны в один результат запроса. При объединении каждый запрос собирает данные независимо, а такие операции, как дополнение результатов, упорядочивание ре­зультатов и расчет итогов выполняются уже над результатом объ­единения запросов. Поля результата запроса будут называться так, как описано в списке полей выборки первого из объединяемых запросов. Поля выборки остальных запросов сопоставляются с полями результата в соответствии с порядком их следования в списке полей выборки. Объединяемые запросы должны иметь одинаковое количество полей в списке полей выборки. Если поля выборки объединяемых запросов имеют разный тип, то поля результата запроса будут иметь составной тип. Объединение запросов начинается с обязательного ключевого слова ОБЪЕДИНИТЬ, после которого следует описание присоеди­няемого запроса. Далее может присоединяться еще один запрос и т.д. По умолчанию при объединении запросов полностью одинаковые строки в результате запроса, сформированные разными запроса­ми, заменяются одной. Если требуется, чтобы были оставлены разные строки, необходимо указать ключевое слово ВСЕ.
6 Упорядочивание результатов запроса
  Выбрать * Из Документ. Приходная Упорядочить По Контрагент Иерархия   Просматривая данные из вложенной таблицы видно, что они упорядочены по дате документа. Если требуется получить данные с другим вариантом сортировки, то для этих целей можно использовать конструкцию «Упорядочить По». Возможные варианты упорядочивания: «Возр», «Убыв», «Иерархия». В качестве имен полей, по которым производится упорядочивание, можно указывать их псевдонимы. В случае, если вариант упорядочивания не указан (и не используется «автоупорядочивание»), то упорядочивание будет производиться по значению внутренних идентификаторов. Важно помнить, что упорядочивание по иерархии возможно только по таблицам с иерархией.
7 Группировки результатов запроса
  Выбрать Номенклатура Как Товар, Сумма (Количество), Сумма (Сумма) Из Документ. Приходная. Товары Сгруппировать По Номенклатура   При просмотре предыдущих результатов выполнения запросов данные получались в том виде, как они вводились в документы. Но если требуется получить ответ на вопрос: сколько какого-то товара закупалось (вообще), то либо придется складывать все вручную, либо использовать группировку. Данные в запросе могут быть сгруппированы с помощью агрегатных функций, указанных в качестве полей выборки. Очень важно помнить, что в большинстве случаев все поля выборки запроса должны делиться на агрегатные функции и поля, по которым ведется группировка (исключение в определенных случаях составляют поля «Представление», встроенные функции и т. п.). При указании группировки псевдоним поля указывать нельзя. В качестве агрегатных функций можно использовать: • Сумма (Выражение) • Среднее (Выражение) • Минимум (Выражение) • Максимум (Выражение) • Количество ([Различные] Выражение)  
8 Итоги в запросе
Выбрать Номенклатура, Цена, Количество, Сумма Из Документ.Приходная.Товары Итоги Сумма (Количество), Сумма (Сумма) По Номенклатура   Для получения итогов в результате запроса в тексте запроса необходимо определить конструкцию «Итоги». Итоги добавляются в результат запроса как итоговые строки.
9 Передача параметров в запрос
  Где Номенклатура=&Номен   Очень часто встает задача передачи каких-либо значений (параметров) в запрос. К примеру, это могут быть значения условий, накладываемых на запрос.
       

 

Аналитическая отчетность

Конструктор выходной формы

 

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

 

 

Рисунок 2.1 – Конструктор выходной формы

 

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

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

● сводную таблицу - многомерная таблица с возможностью интерактивного формирования состава строк и столбцов;

● диаграмму - поддерживает несколько различных видов диаграмм (линейная, круговая, гистограмма и пр.);

● сводную диаграмму - диаграмма с возможностью интерактивного формирования состава строк и столбцов.

 

 

Рисунок 2.2 – Формирование табличного документа

 

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

Результатом работы конструктора является набор связанных процедур, которые могут располагаться в различных модулях, и готовый макет отчета. Разработчику остается лишь запустить отчет на выполнение и проверить правильность его работы. Никакого дополнительного программирования или конфигурирования не требуется - конструктор создает полностью работоспособный элемент системы.

 

 

3. Пример ВЫПОЛНЕНИЯ

 

Приступим к изучению языка запросов на примере документа «РасходнаяНакладная». Нам необходимо переписать все возможные алгоритмы, описанные в модуле объекта и в модуле формы, при помощи языка запросов. Однако запросы нам понадобятся не во всех алгоритмах, а только в тех, где происходит выборка данных из БД.

Если открыть модуль формы документа, то окажется, что в нём всего одна процедура, которую можно переписать с использованием языка запросов - это ТоварыНоменклатураПриИзменении, в которой нам из регистра «Цены» нужно выбрать актуальную цену на товар.

Удаляем весь текст, который написан в обработчике, ставим курсор на свободное место внутри процедуры и нажимаем правую кнопку мыши. В появившемся списке выбираем «Конструктор запросов».

 

 

На вопрос, нужно ли создавать новый запрос, можно смело отвечать «Да».При этом появится окно конструктора запросов. Конечно запрос можно писать и вручную, исходя из тех правил, которые описаны в пункте 2.2, но это достаточно сложный процесс, поэтому мы воспользуемся конструктором, который заметно упрощает работу и позволяет создавать сложные запросы.

Перед вами 3 колонки: в 1-ой располагаются все возможные таблицы, из которых можно делать выборку; во 2-ой будут размещаться таблицы, которые необходимы нам непосредственно для запроса; в 3-ей колонке мы будем определять, а какие поля из выбранных таблиц нам нужны.

 

 

Из левого списка выберем РегистрыСведений->Цены->ЦеныСрезПоследних.

Выбранная нами таблица появится в средней колонке. Откроем список её полей и выберем «Цена». Выбранные поля перемещаются в 3-ю колонку. Теперь окно должно выглядеть так.

 

 

Что мы сейчас сделали - мы показали конструктору, что хотим выбрать данные из регистра «Цены», при этом для выборки нам нужна таблица ЦеныСрезПоследних. Данная таблица не является объектом конфигурации и просмотреть её из конфигуратора невозможно. Она является встроенной таблицей регистра и обновляется автоматически при внесении в регистр каких-либо данных. Срез последних на определённую дату означает, что в регистре будет искаться самая последняя запись в интервале от 01.01.01 00:00:00 по нашу дату. Срез первых выполняет похожую функцию - ищет ближайшую запись в регистре от заданной даты до текущей. Если регистру не указывать, на какую дату искать записи, то данные будут выбираться для текущей даты.
Что же вернёт такой запрос - он вернёт набор записей регистра «Цены» по каждому товару для каждого контрагента и для каждого типа цен (при этом этот набор записей будет ограничен 1 колонкой: Цена). Такая выборка нас не устроит, ведь нам нужна информация о конкретном товаре для конкретного контрагента и только по цене продажи. Для наложения ограничений можно зайти во вкладку «Условия» и сделать следующее:

 

 

Тем самым мы задаём 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 с.)