1с из запроса не вошедшие

Обновлено: 05.07.2024

вопрос наверно простой - но не могу сама разобраться. Есть таблица с тремя колонками, есть вторая таблица тоже с 3-колонками - все это во временных таблицах запроса. записи первой таблицы полностью содержат записи второй. как бы вывести те записи, которых нет во второй таблице? спасибо за помощь.

выбрать все записи из врем.таб. во вложенном запросе, а потом из него "Выбрать различные".

Запрос в студию

"<pre>Процедура КнопкаВыполнитьНажатие(Кнопка)<br> <br> ТЗ1 = Новый ТаблицаЗначений;<br> <br> ТЗ1.Колонки.Добавить("кол1", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(2));<br> ТЗ1.Колонки.Добавить("кол2", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(2));<br> ТЗ1.Колонки.Добавить("кол3", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(2));<br> <br> Для н = 1 По 3 Цикл<br> <br> НовСтр = ТЗ1.Добавить();<br> <br> НовСтр.Кол1 = "А" + н;<br> НовСтр.Кол2 = "Б" + н;<br> НовСтр.Кол3 = "В" + н;<br> <br> КонецЦикла; <br> <br> ТЗ2 = ТЗ1.Скопировать();<br> <br> НовСтр = ТЗ2.Добавить();<br> <br> НовСтр.Кол1 = "А4";<br> НовСтр.Кол2 = "Б4";<br> НовСтр.Кол3 = "В4";<br> <br> Запрос = Новый Запрос;<br> <br> Запрос.Текст =<br> "ВЫБРАТЬ<br> | ВнИст1.Кол1,<br> | ВнИст1.Кол2,<br> | ВнИст1.Кол3<br> |ПОМЕСТИТЬ ВТ1<br> |ИЗ<br> | &Ист1 КАК ВнИст1<br> |;<br> |<br> |//////////////////////////////////////////////////////////// ­////////////////////<br> |ВЫБРАТЬ<br> | ВнИст2.Кол1,<br> | ВнИст2.Кол2,<br> | ВнИст2.Кол3<br> |ПОМЕСТИТЬ ВТ2<br> |ИЗ<br> | &Ист2 КАК ВнИст2<br> |;<br> |<br> |//////////////////////////////////////////////////////////// ­////////////////////<br> |ВЫБРАТЬ<br> | ВТ1.Кол1,<br> | ВТ1.Кол2,<br> | ВТ1.Кол3<br> |ИЗ<br> | ВТ1 КАК ВТ1<br> |<br> |ОБЪЕДИНИТЬ<br> |<br> |ВЫБРАТЬ<br> | ВТ2.Кол1,<br> | ВТ2.Кол2,<br> | ВТ2.Кол3<br> |ИЗ<br> | ВТ2 КАК ВТ2"<br> ;<br> <br> Запрос.УстановитьПараметр("Ист1", ТЗ1);<br> Запрос.УстановитьПараметр("Ист2", ТЗ2);<br> <br> Результат = Запрос.Выполнить();<br> <br> ТЗ = Результат.Выгрузить();<br> <br> ТЗ.ВыбратьСтроку();<br> <br>КонецПроцедуры </pre>"

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: соединения

Автор уроков и преподаватель школы: Владимир Милькин

Соединения в запросах

Соединение - одна из самых важных и нужных операций, выполняемых реляционными системами управления базами данных.

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

Для того, чтобы осознать необходимость соединений давайте решим следующую задачу.

У нас в базе есть справочник Клиенты:

01

И справочник Ассоциации:

03

Наша задача вывести любимые ассоциации клиентов, основываясь на цвете.

Таким образом для Наташи любимой ассоциацией будет трава, так как её любимый цвет зелёный. А для Петра - солнце. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Для Андрея вообще нет подходящей ассоциации, так его любимый цвет красный, а ассоциаций красного цвета в базе нет.

Будем решать задачу постепенно.

Сначала запросим всех клиентов и их любимые цвета :

04

Затем запросим все ассоциации и их цвета :

Теперь нам каким-то образом следует совместить первую и вторую таблицу. Чтобы это сделать запросим информацию сразу из двух таблиц. Для этого перечислим обе таблицы в секции ИЗ через запятую. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. А в секции ВЫБРАТЬ укажем поля из обеих таблиц:

Если мы попробуем выполнить этот запрос, то получим ошибку:

06

Причина ошибки в том, что поле Наименование присутствует сразу в обеих таблицах (Клиенты и Ассоциации) и система просто не знает поле из какой именно таблицы имеется в виду.

Чтобы устранять подобные неоднозначности при выборке из более чем одной таблицы принято указывать полные названия полей. Полное название поля включает в себя полное имя таблицы (например, Справочник.Клиенты) и имя самого поля (например, Наименование).

Таким образом полное название поля Наименование из таблицы Клиенты будет Справочник.Клиенты.Наименование.

А полное названия поля Наименование из таблицы Ассоциации будет Справочник.Ассоциации.Наименование.

Перекрёстное соединение

Перепишем предыдущий запрос с полными именами полей:

07

Только что мы произвели перекрёстное соединение двух таблиц. Обратите внимание на то, каким образом сформировался результат:

04

Внутреннее соединение

Очевидно, что результат перекрестного соединения двух таблиц не есть решение нашей задачи. Нам нужны не все записи из перекрёстного соединения, а только те у которых поля ЛюбимыйЦвет и Цвет имеют одинаковое значение:

07

Чтобы получить эти записи добавим к предыдущему запросу секцию ГДЕ:

08

19

Это то, что нужно - мы решили, поставленную задачу!

В последнем запросе мы использовали перекрёстное соединение с дополнительным условием (в секции ГДЕ). Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Такое соединение называется внутренним .

Есть ещё один вариант написания того же самого внутреннего соединения :

08

Сравните этот и предыдущий запрос. Они совершенно одинаковы с точки зрения платформы, просто имеют разный синтаксис. И этот и предыдущий запросы содержат внутреннее соединение таблицы Клиенты с таблицей Ассоциации по полям ЛюбимыйЦвет и Цвет соответственно.

Левое внешнее соединение

Обратите внимание на то, что в результат внутреннего соединения не попал Андрей. А всё потому, что его любимый цвет красный, а красных ассоциаций у нас в базе нет вовсе.

Получается, что для Андрея с его красным цветом просто не нашлось пары из таблицы ассоциаций.

Перепишем запрос так, чтобы в результат попадали в том числе те записи из первой таблицы, для которых не нашлось ни одной пары из второй таблицы (в данном случае Андрей):

09

Такое соединение называется левым внешним соединением (слово внешнее можно опускать для простоты).

Р езультат левого внешнего соединения представляет из себя: все записи из внутреннего соединения ПЛЮС все записи из первой таблицы , не попавшие во внутреннее соединение (для которых не нашлось пары).

10

20

Правое внешнее соединение

Но давайте снова вернёмся к внутреннему соединению:

08

Обратите внимание на то, что результат внутреннего соединения не содержит ассоциацию белый снег, так как не нашлось ни одного клиента, у которого любимым цветом был бы белый.

Перепишем запрос так, чтобы в результат попадали в том числе те записи из второй таблицы, для которых не нашлась ни одной пары из первой таблицы (в данном случае белый снег):

11

Такое соединение называется правым внешним соединением (слово внешнее можно опускать для простоты).

Результат правого внешнего соединения представляет из себя: все записи из внутреннего соединения ПЛЮС все записи из второй таблицы , не попавшие во внутреннее соединение (для которых не нашлось пары).

10

Image 7

Полное соединение

А что если нам нужно, чтобы в результат запроса попадали помимо внутреннего соединения Андрей и Снег одновременно?

Для этого потребуется совместить результаты левого и правого соединений. Такой вид соединения уже придуман и называется полным соединением:

12

Результат полного соединения представляет из себя: все записи из внутреннего соединения ПЛЮС все записи из первой таблицы, не попавшие во внутреннее соединение (для которых не нашлось пары) ПЛЮС все записи из второй таблицы, не попавшие во внутреннее соединение (для которых не нашлось пары).

10

21

Псевдонимы таблиц

Согласитесь, что все запросы, которые мы писали в этом уроке выглядят довольно громоздко. Это связано с тем, что мы вынуждены указывать полные имена полей, чтобы избежать возникновение неоднозначности.

Чтобы сократить полное написание имени таблицы (например, Справочник.Клиенты) допустимо (как и для самих полей) использовать псевдонимы .

Давайте перепишем последний запрос так, чтобы при формировании полных имён полей вместо Справочник.Клиенты можно было использовать псевдоним К, а вместо Справочник.Ассоциации - псевдоним А:

А чтобы результат запроса был ещё нагляднее добавим псевдонимы полей, которые мы уже рассматривали на одном из прошлых уроков:

13

Обработка NULL

Присмотритесь к результатам последнего запроса (как впрочем и многих предыдущих на этом уроке).

Чему равны значения полей Ассоциация и ЕёЦвет для первой строчки? А что вы скажете насчет полей Клиент и ЕгоЦвет для последней строки?

Они равны NULL, которое как мы уже знаем означает отсутствие какого либо значения:

13

А так как NULL означает отсутствие значения, то любая попытка выполнить с ним какую-либо операцию (сравнение, сложение . ) вызовет неопределенное поведение базы данных, непредсказуемую ошибку.

Поэтому обязательной считается обработка значений NULL всегда, когда они могут возникнуть.

Под обработкой подразумевается то, что мы должны сказать в нашем запросе, что если одно из полей будет равно NULL, то в это поле следует подставить какое-то другое значение.

В данном случае для полей Клиент и Ассоциация в случае обнаружения NULL мы будем подставлять пустую строку "".

А вот поля ЕгоЦвет и ЕёЦвет являются ссылками на элементы справочника Цвета, поэтому в них можно подставлять только значения являющиеся ссылками указанных типов. Каждый ссылочный тип (например, Справочник или Документ) имеет предопределенный элемент ПустаяСсылка. Чтобы указать его значение в запросе воспользуемся функцией ЗНАЧЕНИЕ.

Для определения того, что в поле попало NULL будем использовать уже знакомую нам по прошлым урокам функцию ЕСТЬNULL:

14

С виду (из консоли запросов) результат не изменился. Мы по-прежнему видим пустые поля. Но это только потому, что строковые представления у NULL и у пустых полей всех типов совпадают и равны пустой строке.

На самом же деле эти пустые поля уже не есть NULL (отсутствие значения), теперь в них появились значения (пустые), с которыми уже можно работать (совершать операции).

Запомните пустое значение и отсутствие значение - это две большие разницы.

Соединение более двух таблиц

Можно последовательно соединять сколько угодно таблиц.

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

Для этого последовательно соединим по цвету таблицу Клиенты с таблицей Ассоциации, а затем (получившийся результат) с таблицей Еда:

Для решения предлагаю вам в любом серверном модуле разместить вот такую простенькую процедуру.

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

И что самое важное - вам не потребуется снимать с поддержки ни одного модуля, по которому делаете отладку!

зы: Публикация поставляется под брендом "Баян". Троллям вход воспрещен. ))))

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

(1) Magnastrag, Да, аналогичная штукень. Только я передаю не Менеджер временных таблиц (он может быть вообще не определен), а сам запрос.
Ну по ИС я не лазил. Потому выложил то, чем сам уже давно пользуюсь. . Согласен с автором.
Статья по ссылке предполагает наличие менеджера ВТ, который не всегда обязателен. У автора статьи код более компактнее и универсальние.
Удобнее всего сделано в Инструментах разработчика http://infostart.ru/public/15126/ , в отладчике говоришь "вычислить выражение" "От(Запрос)" и открывается консоль запросов, в которой можно поэтапно посмотреть все временные таблицы, не нужно знать их имена, можно поменять запрос и т.п. https://youtu.be/QqM8qXGcUVU

(5) Fragster, вполне возможно что вы и правы. Я даже скачивал эту консоль, но, к сожалению, так и не осилил ее. Очень похожа на кабину летчика.

Используемый мной метод вполне меня устраивает. Потому что я просто иду по коду вместе с отладчиком и просто просматриваю сформированные временные таблицы.
Если кому то это неудобно -то не беда. Будет пользоваться другими инструментами. Я всего лишь предложил один из вариантов.

За ссылку еще раз спасибо.

(6)
1. Знач Запрос - это для чего? все равно ж Знач не будет работать
2. Запрос.Текст = ТекстЗапроса; - а это тогда зачем? если уже пытались указать Знач
вроде и код не многословный, но и не краткий 1. Знач Запрос - это для чего? все равно ж Знач не будет работать
2. Запрос.Текст = ТекстЗапроса; - а это тогда зачем? если уже пытались указать Знач
вроде и код не многословный, но и не краткий

"Знач" и не работает )))) - скорее дань привычке. Можете удалить его.
Потому и нужна строка 2. Запрос.Текст = ТекстЗапроса;
Именно эта строка возвращает "на место" текст исходного запроса, временно измененный нами (в данной функции)

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

Вставлю и свои 5 копеек ко всему прочему.
Нужно обязательно обработать возможные ошибки!
Например можно во время отладки косякнуть и неправильно написать имя временной таблицы, в итоге вывалится ошибка, текст запроса изначального будет утрачен, дальше программа нормально не выполнится

(10) Brawler, с вашего позволения выложу именно ваш вариант. Действительно ценное дополнение.

Избавляет от кучи головняка при работе с теми же зарплатными запросами с тысячью и одной временной таблицей :)

(14) Kashemir, присоединяюсь: лучше распарсить текст запроса

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

ВЫВОД РЕЗУЛЬТАТА МЕНЕДЖЕРА ВРЕМЕННЫХ ТАБЛИЦ В ТАБЛИЦУ ЗНАЧЕНИЙ (ОТЛАДКА ДАННЫХ МВТ)
Иногда предстоит отлаживать запросы которые содержат менеджеры временных таблиц. И чтобы увидеть результат менеджера необходим еще один запрос к этому менеджеру. Пример функции которая выводит результат менеджера в таблицу значений:

ВЫВОД ДОПОЛНИТЕЛЬНЫХ ПОЛЕЙ МВТ.
Подобная функция, только в третий параметр передаются дополнительные поля. При необходимости увидеть для целей отладки какой-то реквизит после точки.
В параметр ДополнительныеПоля передаем например "Номенклатура.Поставщик, Номенклатура.Менеджер" и т.д.


Выбрать значения, которых нет в другой таблице
Добрый день. Есть данные в двух таблицах. Требуется выбрать данные из первой таблицы, которые не.

Выбрать все ид(внешний ключ) которых нет во второй таблице
Есть две таблицы. Таб_1: т1_1. 1 2 // . 3 Таб_2: т2_1, т1_1. 1 1

Сравнить 2 столбца и вывести только те 2 которых нет в первой таблице
Здравствуйте фуромчани, впервые в жизни сталкиваюсь с Аксесом т.к. на программирование только.


Запрос отображающий данные из таблицы, только те, которых нет в другой таблице
Здравствуйте! Помогите, пожалуйста, составить запрос. Есть таблица-справочник материалов (SprMat) и.

Решение

Dethmontt, Спасибо, отработало корректно. Можете объяснить, пожалуйста, как вы к этому пришли?

Добавлено через 5 минут
Dethmontt, Просто на первый взгляд отработать не должно -- у нас ведь сначала выполняется соединение, из которого получаются дни те же, в которые записи в регистре, а потом уже отрабатывает условие, которое не находит ничего, т.к. у нас все записи не null. Или я неправ и это работает иначе?

Vortex___, соединение фильтрует "не основную" таблицу в результате чего появляется нулл (за счет этого так же можно строить условия), а секция ГДЕ, отрабатывает после соединения, значит можно поймать где появился нулл, то нам и нужно по сути выбрать.

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

Найти строки в таблице, которых нет в другой таблице
Здравствуйте! Помогите, пожалуйста, составить запрос. Думаю думаю, никак не могу сообразить.

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

Как в таблице выбрать записи, строки которых пустые?
Как в таблице выбрать записи, строки которой пустые mysql_query(&quot;select * from `table` where.

Выбрать запись из таблицы, если нет записи в другой таблице
Мутновато назвал тему но по другому никак. Есть две таблици users и members. Поля такие users.

Как в mysql выбрать случайный и уникальный ID, которого еще нет в таблице?
В таблице есть поле orders_id в нём хранятся числовые id заказов в таком виде: 29 457 3467844.

Читайте также: