Что такое ключ связи в 1с
1С 8.1. УТ. В табличной части документа Заказ покупателя, есть реквизит Ключ строки. Для чего он, и как его пользовать? Спасибо.
(0) возможно, для связи с другими табличными частями
(0) Для связи с ТЧ СоставНабора. Если используешь комплекты — пригодится 🙂
(0) +(1) и вроде бы для группировки товаров-наборов
Вне зависимости от перемещения строки по таблице ее Ключ не меняется, что позволяет четко определить связь с другими таблицами (подчиненными, например)
Значит при программном вводе Реализации ТиУ на основании Заказ покупателя, ключ строки роли не играет. Так получается?
Ключ связи в ут, как получить по нему форму обработки
Добрый день, Конфигурация ут11, на форме есть поле которое называется «КлючСвязи», я так понимаю это уид, при нажатии на эту кнопку открывается форма обработки. Так вот вопрос, как по этому ключу получить форму программно, что бы работать с ней, и обрабатывать информацию
уник = Новый УникальныйИдентификатор(Стр.КлючСвязи); НашДок = ПолучитьФорму("Обработка.РабочееМестоМенеджераПоДоставке.форма.ФормаРаспоряженияПоПункту", ЭтотОбъект ,уник);
Но ничего не получается
По теме из базы знаний
- Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2
- Модули интеграции с маркетплейсами (WILDBERRIES + ОЗОН + ЯНДЕКС МАРКЕТ+СБЕРМЕГАМАРКЕТ) по схеме FBS для УТ 11, КА 2, ERP 2, УНФ
- Интеграция «1С:Управление торговлей 10.3» с Yandex SpeechKit для распознавания телефонных звонков
- Государственные контракты в УТ 11.5, КА 2.5.11 с выгрузкой в ЕИС (Госзакупки)
- Расширение для интеграции с маркетплейсами из одного окна: Озон, ВБ, Яндекс, Сбер, Али, ЛаМода для 1С:УНФ, УТ, КА, ERP
- Дата
- Дата
- Рейтинг всех уровней
- Рейтинг 1-го уровня
- Древо развёрнутое
- Древо свернутое
Свернуть все
2. МимохожийОднако 140 27.12.21 09:48 Сейчас в теме
Попробуй через отладчик сделать точку останова на событии при выборе поля или строки и посмотреть, что вызывается.
Из СП:Доступность:
Толстый клиент.
Не ясно в каком режиме получаешь форму и не вижу команды по открытию формы
3. GoodDeiDie 27.12.21 11:13 Сейчас в теме
(2) Получаю в тонком клиенте, открыть я ее не могу, потому что по факту переменная «нашДок» пустая
4. МимохожийОднако 140 27.12.21 11:20 Сейчас в теме
(3) Метод ПолучитьФорму не доступен в тонком клиенте. Поэтому результат пустой. Надо использовать другие методы.
5. GoodDeiDie 27.12.21 11:20 Сейчас в теме
(4) а какие еще методы для этого есть, что бы в тонком клиенте можно было получать?
6. МимохожийОднако 140 27.12.21 11:26 Сейчас в теме
(5) Какие действия пользователя планируешь выполнить и на какой форме? Что хочешь получить в результате? Надо использовать события формы и потом уже придумывать методы. На данный момент ты показал, как у тебя не получается. Но понять, что ты хотел я пока не могу
7. GoodDeiDie 27.12.21 11:31 Сейчас в теме
(6) Никаких, мне просто надо открыть эту форму на которую указывает этот идентефикатор, и собрать оттуда информацию для заполнения другой формы
8. МимохожийОднако 140 27.12.21 11:37 Сейчас в теме
(7) Кто тебя убедил, что ключ связи в строке является идентификатором нужной формы? откуда вызываешь?
10. GoodDeiDie 27.12.21 11:42 Сейчас в теме
(8) смотрю в тч, формы, откуда открывается нужная мне форма, что то внутри посказало что это нужный мне идентефикатор, по которому можно открыть нужную форму
Прикрепленные файлы:
11. GoodDeiDie 27.12.21 11:47 Сейчас в теме
(8) я так понимаю в получатели он пишет строку с текстом, а в поле КлюСвязи он пишет УИД по которому потом и открывается форма нужная, или я что-то не так понимаю?
12. МимохожийОднако 140 27.12.21 11:54 Сейчас в теме
(11) Понимаешь правильно. В данном случае вместо метода ПолучитьФорму применяешь метод ОткрытьФорму, где вторым параметром передаётся структура как в примере из конфигурации.
Подробности можешь увидеть отладчиком из формы «ФормаРаспоряженияПоПункту». Можно открыть стёк вызовов. Расставить точки остановки и разобраться до конца.
Честно говоря, я глубоко не вникал.
13. GoodDeiDie 27.12.21 11:56 Сейчас в теме
(12) Вроде понял, спасибо за объяснения!
9. МимохожийОднако 140 27.12.21 11:39 Сейчас в теме
из документа Задание на перевозку
СтандартнаяОбработка = Ложь; ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ЗаданиеНаПеревозку", Объект.Ссылка); ПараметрыФормы.Вставить("ТранспортноеСредство", Объект.ТранспортноеСредство); ПараметрыФормы.Вставить("ВесЗадания", Объект.Маршрут.Итог("Вес")); ПараметрыФормы.Вставить("ОбъемЗадания", Объект.Маршрут.Итог("Объем")); ПараметрыФормы.Вставить("ДатаВремяРейсаПланС", Объект.ДатаВремяРейсаПланС); ПараметрыФормы.Вставить("ВидДоставки", Объект.Операция); ПараметрыФормы.Вставить("Адрес", ТекущиеДанные.Адрес); ПараметрыФормы.Вставить("ВремяС", ТекущиеДанные.ВремяС); ПараметрыФормы.Вставить("ВремяПо", ТекущиеДанные.ВремяПо); ПараметрыФормы.Вставить("АдресРаспоряжений", ПоместитьРаспоряженияВХранилище(ТекущиеДанные.КлючСвязи)); ПараметрыФормы.Вставить("Статус", Объект.Статус); ПараметрыФормы.Вставить("АдресТоваровКДоставке", ПоместитьВХранилищеТоварыКДоставке()); ОписаниеОповещения = Новый ОписаниеОповещения("ПослеРедактированияРаспоряжений",ЭтотОбъект); ОткрытьФорму("Обработка.РабочееМестоМенеджераПоДоставке.Форма.ФормаРаспоряженияПоПункту", ПараметрыФормы, ЭтаФорма. ОписаниеОповещения,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
Ключи защиты 1С:Предприятия
Ключи защиты нужны для запуска платформы 1С на компьютере. Также ключи защиты называют клиентскими лицензиями или дополнительными лицензиями. Различают программные и аппаратные (USB), ключи защиты. Аппаратные ключи бывают локальными и сетевыми. Программные ключи бывают однопользовательскими и многопользовательскими. В 1С:Предприятии 8 лицензии дают возможность запустить платформу 1С (какая либо привязка к запускаемой конфигурации отсутствует, исключение составляют отраслевые конфигурации, которые защищены дополнительными ключами от фирмы разработчика). Например если на компьютере активирована однопользовательская лицензия (от любой программы 1С 8 или даже доп. лицензия на 1 рабочее место), то физически возможно будет на этом компьютере запустить любую конфигурацию (Бухгалтерия предприятия, Управление торговлей и т.д.). Поэтому в 1С:Предприятии 8 ключи защиты называют дополнительными платформенными лицензиями. В платформе 1С Предприятие 7.7 у ключей была привязка также и к запускаемой конфигурации. Например, если в компьютер вставлен ключ от конфигурации Бухгалтерия 7.7 то конфигурация Торговля и склад 7.7 уже не запустится.
Программные ключи защиты 1С:Предприятие 8
Система программного лицензирования гарантирует совместную работу ряда пользователей. Причем они не должны использовать специальные дополнительные физические устройства. Для работы требуется только специальный файл программной лицензии. Данный файл имеет расширение *.lic и хранится либо на локальном компьютере либо на сервере.
Чтобы активировать программную лицензию на компьютере нужен пинкод. Также понадобится регистрационный номер имеющегося у вас программного продукта 1С. Активация пинкода выполняется при помощи установленной платформы 1С. Программная лицензия привязывается к конфигурации компьютера на котором происходит активация. В случае если конфигурация компьютера поменялась, лицензия перестает работать и необходимо выполнить переактивацию программной лицензиии на этом компьютере. Все вопросы по активации лицензий пользователи могут направлять на почту lic@1c.ru.
Виды программных лицензий 1С:Предприятие 8
- Однопользовательские лицензии позволяют запускать любое количества сеансов приложений с компьютера на котором активирована лицензия.
- Многопользовательские лицензии дают возможность для запуска не более определенного числа сеансов приложений. Может применяться произвольное количество компьютеров. Номиналом лицензии определяется количество сеансов клиентских приложений, которые запускаются одновременно.
- Комбинированные (комбинация группы одно-, и многопользовательской) — если однопользовательская лицензия активируется первой, то можно использовать только ее. Если многопользовательская была активирован первой, то версии для одного пользователя уже не используется.
- Лицензия на 32-разрядный сервер дает возможность использования произвольного количества рабочих процессов rphost.exe (32-разрядных) на одном компьютере.
- Лицензия на 64-разрядный сервер дает возможность использования произвольного числа 32 и 64-разрядных процессов rphost.exe на одном компьютере.
Лицензии многопользовательского типа могут размещаться на ПК сервера 1С, терминальном сервере или модуле расширения. На клиентском ПК размещаются только однопользовательские лицензии.
Основная особенность программного ключа защиты состоит в том, что перед первой активацией важно выбрать подходящий вариант.
- Однопользовательский режим дает возможность для запуска неограниченного числа экземпляров (сеансов) 1С:Предприятия. Такое решение удобно для бухгалтерии. Специалист в этом случае при активированной 1 однопользовательской лицензии на компьютере может запустить например: 3 базы бухгалтерии, 2 базы торговли, 3 базы зарплаты и при этом будет использоваться только 1 клиентская лицензия активированная на этом компьютере.
- Многопользовательский режим дает возможность запускать клиентских приложений (сеансов 1С или открытых окон с 1С) в числе приобретенных лицензий.
При работе с 1С на виртуальных компьютерах необходимо активировать программные лицензии на этом виртуальном компьютере. В этом случае программная лицензия привязывается к параметрам виртуального ПК.
Аппаратные ключи защиты 1С:Предприятие 8
Параметр XX указывает на количество лицензий
1С:Предприятие 8. Клиентская лицензия на 300 рабочих мест
Ключ на 300 пользователей. Особенности совпадают с ключами на 5, 10, 20, 50 и 100 пользователей, приведенные выше в таблице.
1С:Предприятие 8. Клиентская лицензия на 500 рабочих мест
Ключ на 500 пользователей. Особенности совпадают с ключами на 5, 10, 20, 50 и 100 пользователей, приведенные выше в таблице.
Маркировку на USB-ключе можно увидеть в отмеченных на рисунке участках, остальные символы для пользователей особого значения не имеют.
Как устанавливать USB ключи 1С:Предприятие 8 грамотно
Запрещается размещение на 1 компьютер более 1-го ключа USB единой серии. В случае такой установки 2-й установленный ключ будет просто не определяться системой лицензирования.
Сочетать на 1 компьютере локальный и сетевой USB ключи не рекомендовано. Это обусловлено особой защитой: отыскав локальный ключ, система не будет заниматься поисками сетевого. При этом локальные ключи сервера не ограничивают работу других ключей совместно с ними можно устанавливать сетевой или локальный ключ USB.
2 и более сетевых ключа недостаточно только лишь разнести по отдельным компьютерам. Важно произвести точную настройку менеджеров лицензий. Любой из используемых ключей должен обладать уникальным именем.
- На компьютере, где установлен ключ, нужно найти файл nhsrv.ini в папке с менеджером лицензий (C:\Program Files\Aladdin\HASP LM\).
- За имя сервера лицензий отвечает параметр NHS_SERVERNAMES, оно состоит из букв и цифр латинского алфавита, и содержит не более 7 символов. [NHS_SERVER] NHS_SERVERNAMES = NAME1 Не забудьте раскомментировать этот параметр, т.е убрать «;» перед началом строки!
- После нужно отредактировать файл nethasp.ini (C:\Program Files (x86)\1cv82\conf): указав адреса и имена менеджеров лицензий: [NH_COMMON] NH_TCPIP = Enabled [NH_TCPIP] NH_SERVER_ADDR = 192.168.0.10, 192.168.0.11 NH_SERVER_NAME = NAME1, NAME2
Часто достаточно в этом файле только раскомментировать параметр NH_SERVER_ADDR = и задать NETBIOS или IP-адрес компьютера, на котором имеется ключ.
С помощью программы Aladdin Monitor можно посмотреть какие ключи используются и сколько лицензий использовано.
Если подсчетом клиентских лицензий занимается сервер «1С:Предприятия», то клиентские лицензии, у которых в программе Aladdin Monitor значение колонки Timeout равно 0, будут считаться занятыми. В связи с этим не рекомендуется одни и те же многопользовательские ключи HASP использовать для одновременного получения клиентских лицензий с помощью HASP License Manager и сервера «1С:Предприятия».
Какие ошибки могут возникнуть?
Если Aladdin Monitor демонстрирует занятость большего количества лицензий, чем пользователей сети, то это ошибка провоцируется тем, что клиент аварийно завершил работу. Занятая лицензия зависает. В таких случаях служба HLServer перезапускается.
Вывод «Не обнаружен ключ защиты программы» вместо типовой информации об ошибках. Под данным сообщением может скрываться сразу несколько типов сбоев.
- «Не найден ключ». Эта ошибка возникает при отсутствии ключа, а также попытке применения ключа от иного продукта, является распространенной. В случае использования сетевого ключа ошибка возникает по ряду причин. Ее провоцирует отсутствии сети, ошибки в установке несетевого ключа. В некоторых случаях важно проверить, запущен ли менеджер.
- «Ключ не содержит лицензии». Эта ошибка возникает тогда, когда на один ПК установлено 2 ключа одной серии. Причем программа видит тот, лицензия на котором не установлена.
- «Превышено число лицензий». Данная ошибка возникает в тех случаях, когда количество активных сессий превышает число лицензий, указанных в ключе. В сети в этот момент могут работать 2 менеджера. Причем они обладают одинаковыми обслуживающими ключами, а также аналогичными именами.
Ограничения на установку USB ключей 1С:Предприятие 8
Несколько ключей единой серии на одном ПК работать не будут! Сетевые или однопользовательские ключи ORGL8 вместе не используются.
На одном ПК могут работать ключи, например, ORGL8 и ORGL8A или ORGL8 и ORGL8B.
При условии запуска менеджера ключи доступны по сети. Одним компьютером благодаря этому может обслуживаться до 900 лицензий (ORGL8: до 100, ORGL8A: 300 и ORGL8B: 500).
На один ПК можно установить ключи сервера 1С и пользовательских лицензий.
Поиск лицензий проводится в определенном порядке.
Ключи серверного типа размещаются на тот компьютер, где имеется сервер 1С:Предприятие. Они не будут работать по сети.
Маркировка ключей от 1С:Предприятие 7.7
Изначально ключи защиты от 1С:Предприятие 7.7 выпускались в виде ключей вставлявшихся в LPT порт компьютера. Ниже приведены примеры фото локального и сетевого ключа LPT от 7.7.
В последствии 1С начало комплектовать коробки 1С:Предприятие 7.7 ключам защиты в USB варианте. Локальные ключи были фиолетовыми (USB HASP HL Pro), сетевые красными (USB HASP HL Net). Ниже пример фото.
USB ключи защиты от 1С:Предприятие 7.7
Маркировки однопользовательских программ 7.7
- «1С:Бухгалтерия 7.7» — «H4 M1 ACCNT»
- «1С:Зарплата и кадры 7.7» — «H4 M1 QXDXD»
- «1С:Торговля и склад 7.7» — «H4 M1 WRBQB»
- «1С:Предприятие 7.7 Комплексная» — «H4 M1 WRBQB»
Маркировки многопользовательских программ 7.7:
- «1С:Предприятие 7.7 Бухгалтерский учет» — «H4 Net5 ACCNT»
- 1С:Предприятие 7.7 Зарплата + Кадры» — «H4 Net5 QXDXD»
- «1С:Предприятие 7.7 Торговля + Склад» — «H4 Net5 WRBQB»
- «1С:Предприятие 7.7 Комплексная поставка» — «H4 Net5 WRBQB»
- «1С:Предприятие 7.7 Налогоплательщик» — «H4 Net5 TAXPR»
- «1С:Предприятие 7.7 Небольшая фирма» — «ACCNT» / «WRBQB» / «QXDXD»
- «1С:Предприятие 7.7 Управление распределенными информационными базами» — «H4 Net5 DISTR»
- «1С:Предприятие 7.7 Web-расширение» — «H4 Net5 W31CK»
Основы SQL. Урок №1
Теперь нужно связать вторую таблицу с первой так, чтобы номерам телефонов соответствовала информация о клиентах. Наличие в одной из таблиц внешнего ключа, значения которого совпадают со значениями первичного ключа другой таблицы, является достаточным условием для определения того, какие строки таблиц связаны (относятся к одному сотруднику). При этом обязательно тип данных внешнего ключа исходной таблицы должен совпадать с типом данных первичного ключа таблицы, с которой происходит соединение при соединении двух таблиц.
Операция извлечения информации из базы данных называется запросом (query). В 70-х годах XX века, был создан специальный язык SEQUEL, позволявший относительно просто управлять данными в этой СУБД. Аббревиатура SEQUEL расшифровывалась как Structured English QUEry Language — «структурированный английский язык запросов». Целью разработки было создание простого непроцедурного языка, позволяющего любому пользователю, даже не имеющему навыков программирования, извлекать данные из базы. Позже он был переименован в SQL – Structured Query Language – структурированный язык запросов. Позднее, с принятием стандартов, SQL превратился в самостоятельный язык, применяемый в разработке баз данных. В основном SQL-запросы реализуются с помощью оператора SEL ECT. Запрос, извлекающий данные из более чем одной таблицы путем сопоставления столбцов одной таблицы столбцам других таблиц, называется соединением (join). В общем виде синтаксис минимальной команды такой: SELECT имена полей таблиц FROM имена таблиц В 1С обычно пишут запросы 1С 8.3 в русскоязычном синтаксисе : ВЫБРАТЬ имена полей таблиц ИЗ имена таблиц Таким образом в результате мы получаем таблицу, но уже состоящую из тех строк и столбцов исходных таблиц, которые нам необходимы. Группа взаимосвязанных таблиц называется схемой (schema). ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3. Несколько простых примеров в системе 1С:Предприятие
Система 1С:Предприятие. Создадим справочники Сотрудники и Города. Заполним их данными. Сотрудники
ID_E | Наименование | ID_C |
1 | Бельдыев | 3 |
2 | Васина | 1 |
3 | Петренко | 2 |
4 | Петров | 2 |
5 | Рахимов | 3 |
Города
ID_C | Наименование |
1 | Москва |
2 | Тула |
3 | Белгород |
Здесь связь между таблицами Сотрудники – Города, характеризуется как Многие к Одному (m:1), то есть каждый сотрудник может жить только в одном городе. Если бы сотрудник мог жить в нескольких городах, то связь была бы Многие ко Многим (m:m). Если в одном городе может проживать не более одного сотрудника, то связь получается Один к Одному (1:1) Откроем консоль запросов. Создадим с помощью Конструктора запроса следующий запрос: выберем Наименования сотрудников из справочника Сотрудники.
ВЫБРАТЬ Сотрудники.Наименование КАК Наименование ИЗ Справочник.Сотрудники КАК Сотрудники
Наименование |
Бельдыев |
Васина |
Петров |
Рахимов |
Петренко |
Заменим служебные слова в запросе на оригинал языка SQL: SELECT Сотрудники.Наименование AS Наименование FR OM Справочник.Сотрудники AS Сотрудники Результат получаем тот же. А что произойдет, если мы выберем все поля из первых двух таблиц, но не соединим их по ключевым полям. То есть напишем следующий запрос: ВЫБРАТЬ Сотрудники.Наименование КАК Сотрудник, Города.Наименование КАК Город ИЗ Справочник.Сотрудники КАК Сотрудники, Справочник.Города КАК Города Если выбрать все поля последовательно из обеих таблиц, то получим 5*3 = 15 строк. Давайте посмотрим, как будет строиться результирующая таблица пошагово: Сначала будет выбрано поле Наименование первой записи таблицы Сотрудники
Бельдыев |
Затем рядом, в этой же строке, будет выведено поле Наименование таблицы Город
Бельдыев | Москва |
Казалось бы, следующая строка (запись) должна начаться со следующего сотрудника таблицы Сотрудники, но строки (записи) второй таблицы еще не закончились. А поскольку движения по таблице Сотрудники еще нет, новая строка начнется с выбранного ранее значения поля Наименование таблицы Сотрудники
Бельдыев | Москва |
Бельдыев |
Движение же по таблице Города продолжается, поэтому будет выбрано поле Наименование следующей строки (записи) этой таблицы
Бельдыев | Москва |
Бельдыев | Тула |
Алгоритм определен. Теперь становится понятной следующая строка результирующей таблицы:
Бельдыев | Москва |
Бельдыев | Тула |
Бельдыев | Белгород |
Записи таблицы Города закончились. Происходит возврат к таблице Сотрудники, где записи еще не закончились, поэтому выбирается следующая строка, поле Наименование
Бельдыев | Москва |
Бельдыев | Тула |
Бельдыев | Белгород |
Васина |
Поскольку вторым полем идут города, а все значения уже пройдены, то указатель возвращается к первой записи таблицы Города
Бельдыев | Москва |
Бельдыев | Тула |
Бельдыев | Белгород |
Васина | Москва |
Для значения Васина, выбираются все оставшиеся города
Бельдыев | Москва |
Бельдыев | Тула |
Бельдыев | Белгород |
Васина | Москва |
Васина | Тула |
Васина | Белгород |
Теперь выведем всю результирующую таблицу:
Сотрудники | Города |
Бельдыев | Москва |
Бельдыев | Тула |
Бельдыев | Белгород |
Васина | Москва |
Васина | Тула |
Васина | Белгород |
Петров | Москва |
Петров | Тула |
Петров | Белгород |
Рахимов | Москва |
Рахимов | Тула |
Рахимов | Белгород |
Петренко | Москва |
Петренко | Тула |
Петренко | Белгород |
Для каждого сотрудника (5 сотрудников) выводятся все города (3 города), в итоге получается 5*3 = 15 записей в результирующей таблице. Из этой таблицы совсем непонятно, кто в каком городе живет. Если выбрать сначала города, то на каждый город выводятся все сотрудники из второй таблицы (Сотрудники). ВЫБРАТЬ Города.Наименование КАК Город, Сотрудники.Наименование КАК Сотрудник ИЗ Справочник.Города КАК Города, Справочник.Сотрудники КАК Сотрудники
Город | Сотрудник |
Москва | Бельдыев |
Москва | Васина |
Москва | Петров |
Москва | Рахимов |
Москва | Петренко |
Тула | Бельдыев |
Тула | Васина |
Тула | Петров |
Тула | Рахимов |
Тула | Петренко |
Белгород | Бельдыев |
Белгород | Васина |
Белгород | Петров |
Белгород | Рахимов |
Белгород | Петренко |
Количество записей в результате 3*5 = 15. От перемены расположения таблиц результат не меняется! Теперь соединим таблицы по ключевому полю, предусмотрительно для этого созданному: Код города = ID_C ВЫБРАТЬ Сотрудники.Наименование КАК Сотрудник, Города.Наименование КАК Город ИЗ Справочник.Города КАК Города ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники ПО (Сотрудники.ID_C = Города.ID_C)
Сотрудник | Город |
Васина | Москва |
Петров | Тула |
Петренко | Тула |
Бельдыев | Белгород |
Рахимов | Белгород |
Отсюда сразу становится видно, кто где проживает. Добавим еще двух сотрудников в таблицу Сотрудники и зададим им коды городов, которых нет в таблице Города.
ID_E | Сотрудник | ID_C |
1 | Бельдыев | 3 |
2 | Васина | 1 |
3 | Петренко | 2 |
4 | Петров | 2 |
5 | Рахимов | 3 |
6 | Мансуров | 5 |
7 | Хабибулин | 7 |
Обратим внимание на связь. Строка “Города Левое” означает, что с таблицей Города происходит левое соединение другой таблицы. В данном случае она находится на строку выше и является более приоритетной. Это таблица Сотрудники. Приоритетность этой таблицы выражается в более близком расположении к корневому элементу Таблицы. А менее приоритетная таблица Города раскрывается из элемента Сотрудники. Таким образом выделенная строка означает, что таблица Города расположена … справа. Обязательно! в условии соединения Сотрудники.ID_C = Города.ID_С типы сравниваемых полей должны быть полностью идентичны! Если слева у нас тип Строка(10), то справа тоже должен быть тип Строка (10). Например, если слева тип Строка(10), а справа стоит тип Строка(9), то это соединение некорректно, даже если в сравниваемых полях по 9 символов! Какое бы соединение мы не использовали, соединяются всегда две таблицы. Будь даже справа вложенная таблица с еще несколькими таблицами. Это выполняется для запроса любой сложности. ЛЕВОЕ СОЕДИНЕНИЕ наиболее распространенное среди всех видов соединений. Объясняется это тем, что текст мы читаем слева направо, и первую таблицу мы располагаем сначала, а затем располагаем следующую таблицу. Нам же не придет в голову расположить первую таблицу справа, это неудобно. Нам не важно, есть ли соответствие города какому-либо сотруднику. Нам принципиально важно, чтобы из таблицы Сотрудники были выбраны все сотрудники, независимо от того, есть ли у них соответствие поля с кодом города в таблице Города. ВЫБРАТЬ Сотрудники.Наименование КАК Наименование, Города.Наименование КАК Наименование1 ИЗ Справочник.Сотрудники КАК Сотрудники ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Города КАК Города ПО (Сотрудники.ID_C = Города.ID_С)
Наименование | Наименование1 |
Бельдыев | Белгород |
Васина | Москва |
Петров | Тула |
Рахимов | Белгород |
Петренко | Тула |
Мансуров | |
Хабибулин |
В результате видно, что для новых двух сотрудников нет городов, то есть в таблице Города нет городов с кодом ID_C равным 5 и 7. Какой же тип полей, в которых нет городов? Типа у этих полей нет. Тип у них – неопределенный. В SQL этот тип обозначается как NULL.
Наименование | Наименование1 |
Бельдыев | Белгород |
Васина | Москва |
Петров | Тула |
Рахимов | Белгород |
Петренко | Тула |
Мансуров | NULL |
Хабибулин | NULL |
Выполним такое действие: в запросе в условии соединения поменяем местами сравниваемые поля Города.ID_С = Сотрудники.ID_C ВЫБРАТЬ Сотрудники.Наименование КАК Наименование, Города.Наименование КАК Наименование1 ИЗ Справочник.Сотрудники КАК Сотрудники ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Города КАК Города ПО (Города.ID_С = Сотрудники.ID_C) Как видим, результат запроса не изменился. Теперь создадим запрос, где нам важно вывести все города.
ВЫБРАТЬ Города.Наименование КАК Наименование1, Сотрудники.Наименование КАК Наименование ИЗ Справочник.Города КАК Города ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники ПО (Города.ID_С = Сотрудники.ID_C)
Наименование1 | Наименование |
Москва | Васина |
Тула | Петров |
Тула | Петренко |
Белгород | Бельдыев |
Белгород | Рахимов |
В результате выводятся все города, а сотрудники, у которых код города отсутствует в таблице Города, не выводятся. Поскольку городам Тула и Белгород соответствует более одного сотрудника – они дублируются. При этом условие выполняется – каждый город выводится минимум 1 раз. Проверим это следующим образом: переназначим для сотрудников Петров и Петренко код города = 1 (Москва). То есть городу Тула не соответствует ни один сотрудник. И выполним запрос еще раз.
Наименование1 | Наименование |
Москва | Васина |
Москва | Петров |
Москва | Петренко |
Тула | |
Белгород | Бельдыев |
Белгород | Рахимов |
Условие выполняется! Каждый город выводится минимум один раз, а поскольку городу Тула никто не соответствует, то ему соответствует поле с типом NULL. Поменяем ЛЕВОЕ СОЕДИНЕНИЕ на ПРАВОЕ СОЕДИНЕНИЕ ВЫБРАТЬ Сотрудники.Наименование КАК Наименование, Города.Наименование КАК Наименование1 ИЗ Справочник.Города КАК Города ПРАВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники ПО (Города.ID_С = Сотрудники.ID_C)
Наименование | Наименование1 |
Бельдыев | Белгород |
Васина | Москва |
Петров | Москва |
Рахимов | Белгород |
Петренко | Москва |
Мансуров | |
Хабибулин |
Сотрудники выводятся все, город Тула не выводится – ему не соответствует ни один сотрудник, а приоритет у таблицы Сотрудники. Рассмотрим связь таблиц запроса при правом соединении.
Выделенная строка означает, что мы соединяемся с таблицей Сотрудники правым соединением. То есть другая таблица (в нашем случае таблица Города) располагается теперь справа! А слева располагается таблица Сотрудники. Таким экспериментальным путем узнаем, что приоритет отдается таблице, располагающейся все равно слева. Это видно по результату запроса. ПРАВОЕ СОЕДИНЕНИЕ удобно использовать при отладке запроса, когда надо поменять приоритет таблиц. Это гораздо быстрее, чем переписывать все соединение. Также оно используется в других отдельных случаях (это здесь мы рассматривать не будем). ////////////////////////////////////////////////////////////////////////////////////////////////////////////// Еще один пример Есть три таблицы A(3 записи), B(4 записи)и C (5 записей). Если соединяем таблицы A и B, то нет необходимости соединять A c B и одновременно A с C, поскольку после соединения таблиц A и B результат можно рассматривать как таблицу. И достаточно одного соединения таблицы C с таблицей (A-B). Для этого соединяем C c A ИЛИ C с B. Если выводить все таблицы A, B и C без связей, то получаем 3*4*5 = 60 записей. Пусть связь между таблицами будет Один к Одному (1:1), тогда: Если соединяем (A-B) по приоритету A, получим таблицу (AB) = 3 записи. Добавив таблицу C (без соединения) получаем 3*5 = 15 записей. Если соединим (AB) и С по приоритету таблицы (AB)получим 3 записи. Если соединяем (A-B) по приоритету B, получим таблицу (BA) = 4 записи. Добавив таблицу C (без соединения) получаем 4*5 = 20 записей. Если соединим (BA) и С по приоритету таблицы (BA) получим 4 записи. На практике еще накладываются различные фильтры в виде условий, что меняет количество записей как самих таблиц, так и их соединений. Задания для самостоятельного решения Задание 1. Что представляет собой запрос? Расскажите про первичный ключ и внешний ключ. Задание 2. Выберите поля Наименование и ID_C из таблицы Сотрудники Задание 3. Соедините таблицу Города с таблицей Сотрудники правым соединением по полю ID_C. При этом выведите поля ID_C и Наименование из таблицы Города и только Наименование из таблицы Сотрудники Задание 4. Соедините таблицу Сотрудники с таблицей Города левым соединением по полю ID_C, при этом выведите поля ID_E, Наименование из таблицы Сотрудники и только Наименование из таблицы Города Задание 5. Добавьте город Астрахань с кодом 7. Удалите из таблицы Сотрудники фамилии Петренко и Петров. Добавьте в таблицу Сотрудники фамилии Мишина, код города = 7, Федоров, код города = 3. Соедините таблицы Сотрудники и Города левым соединением, выведите все поля. /////////////////////////////////////////////////////////// Есть 3 таблицы: A (3 записи), B (5 записей), С (7 записей). Задание 1. Сколько будет записей в результирующей таблице, полученной путем выбора всех полей, всех таблиц, не связанных между собой? Задание 2. Те же 3 таблицы. Связь между таблицами Один к Одному (1:1) Соединяем таблицу A с таблицей B левым соединением, сколько записей в результирующей таблице? Соединяем таблицу A с таблицей B правым соединением, сколько записей в результирующей таблице? Задание 3. Те же 3 таблицы. Связь между таблицами Один к Одному (1:1) Выбираем данные из таблиц A и C без связи. Соединяем полученную таблицу с таблицей B левым соединением. Сколько записей будет в результирующей таблице? А если правым? Задание 4. Те же 3 таблицы. Связь между таблицами Один к Одному (1:1) Соединяем таблицу С и B левым соединением. Таблицу А соединяем с полученной таблицей правым соединением. Сколько в итоге записей? А левым соединением? Задание 5. SuperTask Те же 3 таблицы. Связь между таблицами B и A Многие к Одному (m:1). Таблица C связана с A и B (1:1) В таблице B есть только две записи, относящиеся к одному и тому же элементу таблицы A. И в таблице B есть одна запись, не связанная ни с чем. Соединяем таблицу B c A левым соединением. К полученной таблице (BA)соединяем таблицу C правым соединением. Сколько записей в результате? Ответ дать без создания таблиц в базе. Ответы будут даны в уроке №2. Специалист компании ООО «Кодерлайн» Ильдар Мингалеев