-

Особенности написания запросов в 1С

0
5224
29.03.2016 Сергей Семенов

  Рассмотрим задачу соединения двух таблиц, когда первую таблицу нужно соединить с таблицей, которая является дополнением для второй таблицы (то есть содержит элементы некоторого множества, отсутствующие во второй таблице). В качестве примера используем задачу со студентами и оценками по семестрам.
Итак, имеется Таблица значений ТЗ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С ООО «Кодерлайн»

 
Задать вопрос автору статьи
Тема вопроса*
Ваше имя*
E-mail или телефон*
Ваш вопрос*
 

Добавить комментарий
Текст сообщения*
Защита от автоматических сообщений
 
Теги
# абота Риелторского Агентства # Управление торговлей 11 #Работа Риелторского Агентства # 1C # CRM-система # Cинтаксис-помощник # Cинхронные методы работы # PDF документами # PowerShell # XML-файл # Бизнес-процесс # Глубина анализа # Графические объекты # Динамический список # Документ заполнен # Документ Отбор (размещение) товаров # Документ Отгрузка товаров ИС МП # Документ Приобретение товаров и услуг # Документ УПД # Доступ на ТСД # ДтКт # ЕАЭС # Закладка Администрирование # Зарплата и кадры # Имя таблицы # ИТС # Кабель NYM(Севкабель) 3x5.5 # Книга учета доходов и расходов # Курс валюты # Лицо с правом подписи # Лицо, имеющее право подписи документов # Маркировка цифровыми кодами # Минимальные цены продажи в 1С # Настройка НСИ и разделов # Настройка ценообразования # НДФЛ # Нематериальные активы # Обмен электронными документами # Оплата через банк # Основное ответственное лицо организации # Перемещение ТС и оборудования # Проведение инструктажа # Продажи или Закупки # Прочие доходы # Пункт Подключить обработки # Пункт Сервис # ПФР и ФФОМС # Работа ТС # Расчет налога УСН # Расчетные счета # Система «Честный знак» # Система GS1 # Списание на расходы # Справка-расчет налога УСН # Страховые взносы # Таблица формы # Таблица формы «Сотрудники» # Товары # Установка цен на товары # Формат Цифровой Маркировки # Функция Дата # Функция ДеньГода # Функция ДеньНедели # Центральный Банк России # Цены номенклатуры 2.5 # Элементы #1.6-НДФЛ #1С Бухгалтерия #1С: CRM #1С: ERP #1С: ERP Управление строительной организацией #1С: ERP. Управление буровой компанией #1С: WMS Управление складом #1С: Аренда и управление недвижимостью #1С: БУХ #1С: Договорчики #1С: Документооборот #1С: ЗУП #1С: Интеграция #1С: КА #1С: Колледж #1С: Конвертация данных #1С: Модули #1С: Платформа #1С: Предприятие #1С: Розница #1С: Сценарное тестирование #1С: ТОИР #1С: УАТ #1С: УКФ #1С: Университет #1С: УНФ #1С: УПП #1С: Управление строительной организацией #1С: УТ #1С: УХ #1С:ERP #1С:БГУ #1С:БП #1С:Риелтор #1С:Управление холдингом #1С.6-НДФЛ #ADO #APACHE #API #canonical #com-объекты #Cправочник БИК #Excel #Excel в 1С #GoogleDrive #Googleаккаунт #HTTP #ITIL #Koderline: Управление медиа-холдингом #Koderline: Управление проектами строительства скважин #LINUX #MS SQL Server #PDF #WEB #WEB-сервисы 1С #Word #WS-ссылки #XDTO-объект #XML #XML-обмен #Администрирование 1С #Адрес URL описания #акты в 1С #Банковские счета #Безопасность сервера #Бесшовная интеграция #БИТ.Финанc #Битрикс24 #Блокировки в 1С #БСП #БУ #Бурение скважин #Бухгалтерская отчётность в МСФО #Бюджетирование #Вид Характеристики #Вкладка Документы #Внедрение #Внедрение ERP #Внешний вид формы #Выбор каталога #Выбранные файлы #Документ Отпуск #Документ1 #Журналы #Загрузить Значения #Загрузка цен в 1С #Задача для 1С #Закладка Торговля #Закрытие месяца #Заменить #Запись регистра сведений #Запросы 1С #Интеграция 1С #Интервал dpi #История пользователя #Кадровые документы #КАК ОТРАЖАЮТСЯ ТОВАРЫ В ПУТИ 1С #Как сделать в 1С #Карточка Объекта недвижимости #Классификаторы и курсы валют #Клиент-серверная схема #Код ЦМТ #Конвертация данных #Контроль документов #Конфигурация 1С #Конфигурация 1С ЗУП 3.1 #Копирование настроек пользователей #Корпоративное сопровождение #Лизинг #Лицензии 1С #Лицензионный договор #Личные документы #Массив Номенклатур #Массовая регистрация отгулов #Меню Отчет #Механизм Анализа Данных в 1С #Моделирование #Модуль Диадок #МРОТ #МСФО #Налоги #Начисления Арендной платы #Новый Массив #Обмен между базами #Обновления #Общие ознакомительные рассылки #Операции в 1С #Оптимизация #Организация #Отпуск #Отчетность #Отчеты в 1С #Оформление перевода работника #Оценка задач #Параметр «Количество» #Партнер #Передача неисключительных прав #Перенос данных #Перенос цен из Excel в 1С #Периодичность ДЕНЬ #Периодичность МЕСЯЦ #Печатная форма документа #Планирование #Поле Ввода Значение Субконто #Полезные обработки #Пользовательский режим #Правила обмена #предопределенные элементы справочников #Прием на работу #Принцип работы 1С #Проводки 1С #Программа 1С #Программирование в 1С #Программные права #Продажа ТМЦ #Продажи #Продление #Производство #Просмотр #Путь к файлу #Работа с объектами в 1С #Раздел Справочники #Расторжение #Расчет зарплаты #Расчетные документы #Расширение конфигурации #Регламентированная отчетность #Режим РИБ #Результаты поиска #Реквизит «СпЗнч» #РСБУ #С # #Сдельный заработок #Сервис-деск #СЗВ-СТАЖ #СКД #Служба ИТ #Служба НСИ #Соединение COM в 1С платформе #Соединение СОМ в 1С платформе #Сравнение конфигураций #Счет-фактура #Текущая Строка #Территориальная привязка #Территориальные рамки #Тестирование 1С #Техническое задание #Типы данных ссылки #Торговое оборудование #Транспортная логистика #Управление проектами #Установка цен номенклатуры #Финансовый учет #Формат MicrosoftExcel #Функционал МРМ #Х-точка #Характеристики Товаров #Хранилище настроек #Хранить историю изменений #Ценообразование #Чтение #Экзамен 1С #электронные подписи #Яндекс-диск или Google-диск #Яндекс.Касса 1С под Linux 1С:УНФ Email или телефон Работа с объектами в 1С Функциональные опции в 1С
Услуги программиста 1С
Получите специалиста  
для решения всех задач
в области 1С
Программы 1С
Цены и подробное описание программ 1С:Предприятие 8.