29.03.2016 Сергей Семенов 10047
Особенности написания запросов в 1С

  Рассмотрим задачу соединения двух таблиц, когда первую таблицу нужно соединить с таблицей, которая является дополнением для второй таблицы (то есть содержит элементы некоторого множества, отсутствующие во второй таблице). В качестве примера используем задачу со студентами и оценками по семестрам.
Итак, имеется Таблица значений ТЗ1 с колонками: НомерСтроки, Студент, ДатаСреза (разная для каждого студента), СеместрКонтроляОценки, Оценка. Требуется вернуть ТЗ2, содержащую строки НомерСтроки, Студент, для которых была найдена хоть одна оценка, отсутствующая в ТЗ1 для соответствующего семестра. В ТЗ1 могут содержаться пустые оценки.
 
     
 
Запрос = Новый Запрос;

       Запрос.Текст =

       "ВЫБРАТЬ

       |      Внешний.НомерСтроки КАК НомерСтроки,

       |      Внешний.Студент КАК Студент,

       |      Внешний.ДатаСреза,

       |      Внешний.СеместрКонтроляОценки КАК СеместрКонтроляОценки,

       |      Внешний.Оценка

       |ПОМЕСТИТЬ ТЗ1

       |ИЗ

       |      &ВнешнийИсточник КАК Внешний

       |

       |ИНДЕКСИРОВАТЬ ПО

       |      НомерСтроки,

       |      СеместрКонтроляОценки

       |;

       |

       |/////////////////////////////////////  

       |ВЫБРАТЬ

       |      ТЗ1.НомерСтроки КАК НомерСтроки,

       |      ТЗ1.СеместрКонтроляОценки КАК СеместрКонтроляОценки,

       |      Оценки.Ссылка КАК Оценка,

       |      МАКСИМУМ(ТЗ1.Студент) КАК Студент,

       |      МАКСИМУМ(ТЗ1.ДатаСреза) КАК ДатаСреза

       |ПОМЕСТИТЬ СтудентыПоСеместрамСоВсемиОценками

       |ИЗ

       |      ТЗ1 КАК ТЗ1

       |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Оценки КАК Оценки

       |            ПО (ИСТИНА)

       |

       |СГРУППИРОВАТЬ ПО

       |      ТЗ1.НомерСтроки,

       |      ТЗ1.СеместрКонтроляОценки,

       |      Оценки.Ссылка

       |

       |ОБЪЕДИНИТЬ ВСЕ

       |

       |ВЫБРАТЬ

       |      ТЗ1.НомерСтроки,

       |      ТЗ1.СеместрКонтроляОценки,

       |      ЗНАЧЕНИЕ(Справочник.Оценки.ПустаяСсылка),

       |      ТЗ1.Студент,

       |      ТЗ1.ДатаСреза

       |ИЗ

       |      ТЗ1 КАК ТЗ1

       |

       |ИНДЕКСИРОВАТЬ ПО

       |      Оценка,

       |      СеместрКонтроляОценки,

       |      НомерСтроки

       |;

       |

       |//////////////////////////////////////  

       |ВЫБРАТЬ РАЗЛИЧНЫЕ

       |      СтудентыПоСеместрамСоВсемиОценками.НомерСтроки КАК НомерСтроки,

       |      СтудентыПоСеместрамСоВсемиОценками.Студент,

       |      СтудентыПоСеместрамСоВсемиОценками.ДатаСреза,

       |      СтудентыПоСеместрамСоВсемиОценками.СеместрКонтроляОценки,

       |      СтудентыПоСеместрамСоВсемиОценками.Оценка

       |ИЗ

       |      СтудентыПоСеместрамСоВсемиОценками КАК СтудентыПоСеместрамСоВсемиОценками

       |            ЛЕВОЕ СОЕДИНЕНИЕ ТЗ1 КАК ТЗ1

       |            ПО СтудентыПоСеместрамСоВсемиОценками.НомерСтроки = ТЗ1.НомерСтроки

       |                   И СтудентыПоСеместрамСоВсемиОценками.СеместрКонтроляОценки = ТЗ1.СеместрКонтроляОценки

       |                   И СтудентыПоСеместрамСоВсемиОценками.Оценка = ТЗ1.Оценка

       |ГДЕ

       |      ТЗ1.НомерСтроки ЕСТЬ NULL

       |

       |УПОРЯДОЧИТЬ ПО

       |      НомерСтроки";

Запрос.УстановитьПараметр("ВнешнийИсточник", ТЗ1);

ТЗ1_1 = Запрос.Выполнить().Выгрузить();

 
     
  Полностью решать задачу нахождения ТЗ2 не будем, а с помощью приведенного запроса сведем ее к задаче «Требуется вернуть ТЗ2, содержащую строки НомерСтроки, Студент, для которых была найдена хоть одна оценка, имеющаяся в ТЗ1 для соответствующего семестра». То есть подменим таблицу ТЗ1. Основная идея получения соединения с дополнением множества заключается в том, чтобы сначала сделать соединение со всем множеством, а потом полученную таблицу соединить с исходной таблицей левым соединением и проверить любое поле из правой части результата на NULL. Отметим, что общепринятый тип условия «кроме» в данном случае не может быть использован, так как предназначен для получения данных из выборки. В нашем случае множество различных значений представлено отдельным справочником (оценки).  
     
 

Примеры

 
  Каковы могут быть примеры подобного типа из области учетных задач? Допустим, нужно построить таблицу с полями Покупатель и Номенклатура, содержащую строки с покупателями и позициями номенклатуры, которые не продавались за отчетный период (а, возможно, и не были в числе покупателей). В данном случае множества значений, для которых строятся дополнения, - это справочники Номенклатура и Контрагенты.    
     
  Во втором запросе приведенного выше пакета запросов используется функция МАКСИМУМ. Смысл ее применения состоит в том, чтобы найти наиболее позднюю дату появления оценки. В последующем может понадобиться получить некоторую информацию на последнюю дату, различную для каждого студента. То есть виртуальная таблица СрезПоследнего не может быть использована, так как у каждого студента своя последняя дата.  
     
  Рассмотрим еще один пример, как в условия связи для операции соединения можно включать произвольные условия (альтернатива условию ГДЕ), что повышает скорость выполнения запроса. В этом же примере показано условие связи «через таблицу» (выделенная строка в примере). Эта возможность, наоборот, может снизить скорость выполнения запроса, но позволяет упростить сам запрос, поэтому условиями связи «через таблицу» нужно пользоваться осторожно.  
     
 

|ВЫБРАТЬ

|               Обучение.Студент КАК Обучающийся,

|               МАКСИМУМ(Обучение.Период) КАК Период,

|               МАКСИМУМ(УчебныйПланСтудента.Период) КАК Период1

|ПОМЕСТИТЬ ДанныеПоСрезу

|ИЗ

|               РегистрСведений.Обучение КАК Обучение

|               ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТСтуденты КАК СтудентыДаты

|ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.УчебныйПланСтудента КАК УчебныйПланСтудента

|                                              ПО СтудентыДаты.Студент = УчебныйПланСтудента.Студент

|                                              И СтудентыДаты.ДатаСреза >= УчебныйПланСтудента.Период

|                               ПО (СтудентыДаты.Студент = Обучение.Студент)

|                              И (УчебныйПланСтудента.Период >= Обучение.Период)

 
     
  Приведём взятый из литературы классический пример соединения трёх таблиц с условием связи «через таблицу».  
     
  Предположим, что мы хотим найти все заказы заказчиков, не находящихся в одном городе с агентом. Для этого требуется связать три таблицы:  
     
 
SELECT Orders.onum, Customers.cname, Orders.cnum, Orders.snum

FROM Salespeople, Customers, Orders

WHERE Customers.city <> Salespeople.city AND

                Orders.cnum = Customers.cnum AND

                Orders.snum = Salespeople.snum

 
  Если есть вопросы по материалу - обращайтесь!  
 

Семенов Сергей
    разработчик 1С ООО «Кодерлайн»

 

Наши проекты

Группа компаний АО «Киномакс»
Группа компаний АО «Киномакс»

Отрасль:
Культура, шоу-бизнес

Внедренное типовое решение:
БИТ.Финанс

- Разработка Положения о Казначействе группы компаний
- Разработка Положения об управлении договорами группы компаний ...

ООО «ПКП КАБЭЛЕКТРОСНАБ»
ООО «ПКП КАБЭЛЕКТРОСНАБ»

Отрасль:
Производство кабельной продукции

Внедренное типовое решение:
1С:Управление небольшой фирмой 1.6

- Оформление заказов покупателей;
- Управление складскими запасами;
- Анализ запасов/остатков...

Внедрение ПП "1С:CRM ПРОФ" в ООО «Торговый Дом Факел»
ООО «Торговый Дом Факел»

Отрасль:
Производство

Внедренное типовое решение:
1С:CRM ПРОФ

- Управление отношениями с клиентами (CRM) ...

МИР ХОББИ
МИР ХОББИ

Отрасль:
Торговля. Интернет магазин

Внедренное типовое решение:
1С:ERP Управление предприятием 2.0

Оформление заказов поставщикам
Взаиморасчеты с покупателями
Оформление заказов покупателей
Логистика адресного склада
Управление...

ЗАО «Инвестгеосервис»
ЗАО «Инвестгеосервис»

Отрасль:
Нефтесервис

Внедренное типовое решение:
1С:ERP Управление предприятием 2.0

Объемно-календарное планирование производства Автоматизация бизнес-процессов Анализ деятельности в разрезе проектов Планирование проектов У...

ПАО «АрселорМиттал Кривой Рог»
ПАО «АрселорМиттал Кривой Рог»

Отрасль:
Металлургическая промышленность

Внедренное типовое решение:
1С:Управление производственным предприятием для Украины

- Кадровый учет
- Расчет зарплаты
- Регламентированная отчетность
- Учет рабочего времени ...

Внедрение системы финансового учета БИТ:Финанс
ООО «Алькор и Ко» (Л’Этуаль)

Отрасль:
Торговля

Внедренное типовое решение:
БИТ.Финанс

- Финансовый учет;
- Поддержка проекта внедрения МСФО;
- Регламентные работы по обслуживанию сервера MS SQL;
- Оптимизация производ...

Автоматизация торгового учета на базе "1С:Управление торговлей"
ООО «ТЕЛЕВЕС РУСС»

Отрасль:
Торговля

Внедренное типовое решение:
1С:Управление торговлей

- Управление складскими запасами;
- Оформление заказов покупателей;
- Планирование продаж;
- Взаиморасчеты с покупателями;
-...

ООО «ПраксисКом»
ООО «ПраксисКом»

Отрасль:
Аутсорсинг бухгалтерских услуг

Внедренное типовое решение:
1С:Бухгалтерия ПРОФ

- Бухгалтерский учет:
Банк и касса
Завершение периода
Нематериальные активы
Основные средства
Расчет зарплаты и кадровы...

Внедрение «1С:Зарплата и управление персоналом 8 КОРП» в компании «ПБК»
ООО «Партнер Бухгалтер Консультант»

Отрасль:
Бухгалтерские услуги

Внедренное типовое решение:
1С:Зарплата и управление персоналом

- Интеграция продукта с базой данных оперативного учета Axapta;
- Доработка функционала подсистемы...

ООО "НЦКТ"
ООО "НЦКТ"

Отрасль:
Профессиональные услуги

Внедренное типовое решение:
1С:Бухгалтерия 8 ПРОФ

Производственные операции
Автоматизация бизнес-процессов...

ПЭК
ПЭК

Отрасль:
Грузоперевозки

Внедренное типовое решение:
«1С: Управление торговлей»

- Создание прототипа SRM-системы на базе «1С: Управление торговлей»
- Автоматизация бизнес-процессов компании, связанных с поиском постав...

Наши соц. сети

Telegram-канал «Koderline 1С» Группа в Вконтакте «Кодерлайн КОРП» Rutube

Остались вопросы - обратитесь к нам!

Впишите свои Имя и Телефон, чтобы мы ответили на все интересующие Вас вопросы.
ФИО*
E-mail*
Телефон*
Сообщение