Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 июл 2021, 17:05

Получить запросом данные из разных таблиц

Автор Алексей_1985_06, 15 июн 2021, 17:30

0 Пользователей и 1 гость просматривают эту тему.

Алексей_1985_06

Уважаемые программисты, подскажите как правильно сделать:
1. Необходимо при открытии формы, заполнить реквизиты "АдресРегистрации" и др. паспортные данные сотрудника, которые хранятся в соответствующих РС "ПаспортныеДанныеСотрудников" и "АдресРегистрацииСотрудника".
Подскажите как получить эти данные из разных таблиц? С помощью соединения, не получается реализовать....

Написал так:
ВЫБРАТЬ
АдресРегистрацииСотрудникаСрезПоследних.АдресРегистрации КАК АдресРегистрации,
ПаспортныеДанныеСотрудниковСрезПоследних.СерияПаспорта КАК СерияПаспорта,
ПаспортныеДанныеСотрудниковСрезПоследних.НомерПаспорта КАК НомерПаспорта,
ПаспортныеДанныеСотрудниковСрезПоследних.КемВыданПаспорт КАК КемВыданПаспорт,
ПаспортныеДанныеСотрудниковСрезПоследних.КодПодразделения КАК КодПодразделения,
АдресРегистрацииСотрудникаСрезПоследних.Сотрудник КАК Сотрудник
ИЗ
РегистрСведений.ПаспортныеДанныеСотрудников.СрезПоследних(, Сотрудник = &Сотрудник) КАК ПаспортныеДанныеСотрудниковСрезПоследних
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АдресРегистрацииСотрудника.СрезПоследних(, Сотрудник = &Сотрудник) КАК АдресРегистрацииСотрудникаСрезПоследних
ПО (АдресРегистрацииСотрудникаСрезПоследних.Сотрудник = ПаспортныеДанныеСотрудниковСрезПоследних.Сотрудник)

LexaK

данные получаете по Сотруднику, так от него и стройте запрос

ВЫБРАТЬ
спрСотрудник.Ссылка как Сотрудник,

АдресРегистрацииСотрудникаСрезПоследних.АдресРегистрации КАК АдресРегистрации,

    ПаспортныеДанныеСотрудниковСрезПоследних.СерияПаспорта КАК СерияПаспорта,
    ПаспортныеДанныеСотрудниковСрезПоследних.НомерПаспорта КАК НомерПаспорта,
    ПаспортныеДанныеСотрудниковСрезПоследних.КемВыданПаспорт КАК КемВыданПаспорт,
    ПаспортныеДанныеСотрудниковСрезПоследних.КодПодразделения КАК КодПодразделения
ИЗ
справочник.Сотрудники спрСотрудник

левое соединение
    РегистрСведений.ПаспортныеДанныеСотрудников.СрезПоследних(, Сотрудник = &Сотрудник) КАК ПаспортныеДанныеСотрудниковСрезПоследних
по спрСотрудник.Ссылка = ПаспортныеДанныеСотрудниковСрезПоследних.Сотрудник

левое СОЕДИНЕНИЕ РегистрСведений.АдресРегистрацииСотрудника.СрезПоследних(, Сотрудник = &Сотрудник) КАК АдресРегистрацииСотрудникаСрезПоследних
по спрСотрудник.Ссылка = АдресРегистрацииСотрудникаСрезПоследних.Сотрудник

где
спрСотрудник.Ссылка = &Сотрудник

ответ Понравился? (в смысле пригодился?)

Алексей_1985_06

Цитата: LexaK от 15 июн 2021, 17:51
данные получаете по Сотруднику, так от него и стройте запрос

ВЫБРАТЬ
спрСотрудник.Ссылка как Сотрудник,

АдресРегистрацииСотрудникаСрезПоследних.АдресРегистрации КАК АдресРегистрации,

    ПаспортныеДанныеСотрудниковСрезПоследних.СерияПаспорта КАК СерияПаспорта,
    ПаспортныеДанныеСотрудниковСрезПоследних.НомерПаспорта КАК НомерПаспорта,
    ПаспортныеДанныеСотрудниковСрезПоследних.КемВыданПаспорт КАК КемВыданПаспорт,
    ПаспортныеДанныеСотрудниковСрезПоследних.КодПодразделения КАК КодПодразделения
ИЗ
справочник.Сотрудники спрСотрудник

левое соединение
    РегистрСведений.ПаспортныеДанныеСотрудников.СрезПоследних(, Сотрудник = &Сотрудник) КАК ПаспортныеДанныеСотрудниковСрезПоследних
по спрСотрудник.Ссылка = ПаспортныеДанныеСотрудниковСрезПоследних.Сотрудник

левое СОЕДИНЕНИЕ РегистрСведений.АдресРегистрацииСотрудника.СрезПоследних(, Сотрудник = &Сотрудник) КАК АдресРегистрацииСотрудникаСрезПоследних
по спрСотрудник.Ссылка = АдресРегистрацииСотрудникаСрезПоследних.Сотрудник

где
спрСотрудник.Ссылка = &Сотрудник



LexaK, эти данные нужны при открытии формы элемента Справочника "Сотрудники" выходит что нужно получать сотрудника из того же справочника (из которого открывается элемент) и соединять с РС? Или что то я не правильно понял?

antoneus

Ссылка находится в реквизите формы Объект.Ссылка.

Алексей_1985_06

Цитата: antoneus от 15 июн 2021, 19:04
Ссылка находится в реквизите формы Объект.Ссылка.

LexaK и Аntoneus спасибо Вам за помощь!

Алексей_1985_06

Цитата: LexaK от 15 июн 2021, 17:51
данные получаете по Сотруднику, так от него и стройте запрос

ВЫБРАТЬ
спрСотрудник.Ссылка как Сотрудник,

АдресРегистрацииСотрудникаСрезПоследних.АдресРегистрации КАК АдресРегистрации,

    ПаспортныеДанныеСотрудниковСрезПоследних.СерияПаспорта КАК СерияПаспорта,
    ПаспортныеДанныеСотрудниковСрезПоследних.НомерПаспорта КАК НомерПаспорта,
    ПаспортныеДанныеСотрудниковСрезПоследних.КемВыданПаспорт КАК КемВыданПаспорт,
    ПаспортныеДанныеСотрудниковСрезПоследних.КодПодразделения КАК КодПодразделения
ИЗ
справочник.Сотрудники спрСотрудник

левое соединение
    РегистрСведений.ПаспортныеДанныеСотрудников.СрезПоследних(, Сотрудник = &Сотрудник) КАК ПаспортныеДанныеСотрудниковСрезПоследних
по спрСотрудник.Ссылка = ПаспортныеДанныеСотрудниковСрезПоследних.Сотрудник

левое СОЕДИНЕНИЕ РегистрСведений.АдресРегистрацииСотрудника.СрезПоследних(, Сотрудник = &Сотрудник) КАК АдресРегистрацииСотрудникаСрезПоследних
по спрСотрудник.Ссылка = АдресРегистрацииСотрудникаСрезПоследних.Сотрудник

где
спрСотрудник.Ссылка = &Сотрудник



Уважаемые программисты, (повторюсь) необходимо при открытии элемента справочника "Сотрудники" получить данные из РС "ПаспортныеДанныеСотрудников" - переодический и РС "Телефоны" -  непереодический.
Подскажите пожалуйста, с точки зрения оптимальности (правильности построения) какой вариант запроса лучше?:
1. Вариант

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// 1. Заполнение ТЧ с телефонами сотрудников:
Объект.Телефоны.Очистить();

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Сотрудники.Ссылка КАК Сотрудник,
| ПаспортныеДанныеСотрудниковСрезПоследних.СерияПаспорта КАК СерияПаспорта,
| ПаспортныеДанныеСотрудниковСрезПоследних.НомерПаспорта КАК НомерПаспорта,
| ПаспортныеДанныеСотрудниковСрезПоследних.КемВыданПаспорт КАК КемВыданПаспорт,
| ПаспортныеДанныеСотрудниковСрезПоследних.КодПодразделения КАК КодПодразделения,
|       ПаспортныеДанныеСотрудниковСрезПоследних.Период КАК ДатаВыдачи,

| спрТелефоны.Телефон КАК Телефон,
| спрТелефоны.ТипНомера КАК ТипНомера,
| спрТелефоны.СтатусНомера КАК СтатусНомера
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПаспортныеДанныеСотрудников.СрезПоследних(, Сотрудник = &Сотрудник) КАК ПаспортныеДанныеСотрудниковСрезПоследних
| ПО Сотрудники.Ссылка = ПаспортныеДанныеСотрудниковСрезПоследних.Сотрудник

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресРегистрацииСотрудника.СрезПоследних(, Сотрудник = &Сотрудник) КАК АдресРегистрацииСотрудникаСрезПоследних
| ПО Сотрудники.Ссылка = АдресРегистрацииСотрудникаСрезПоследних.Сотрудник
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Телефоны КАК спрТелефоны
| ПО (спрТелефоны.Сотрудник = Сотрудники.Ссылка)
|ГДЕ
| Сотрудники.Ссылка = &Сотрудник";

Запрос.УстановитьПараметр("Сотрудник",Объект.Ссылка);
Результат = Запрос.Выполнить();

Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать(); 
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.Телефоны.Добавить();
НоваяСтрока.Телефон = Выборка.Телефон;
НоваяСтрока.ТипНомера = Выборка.ТипНомера;
НоваяСтрока.СтатусНомера = Выборка.СтатусНомера;
КонецЦикла;

// 2. Заполнение паспортных данных сотрудника:
СерияПаспорта = Выборка.СерияПаспорта;
НомерПаспорта = Выборка.НомерПаспорта;
КемВыдаПаспорт = Выборка.КемВыданПаспорт;
КодПодразделения = Выборка.КодПодразделения;
ДатаВыдачиПаспорта = Выборка.ДатаВыдачи;
КонецЕсли;
КонецПроцедуры


2. Вариант
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// 1. Заполнение ТЧ с телефонами сотрудников:
Объект.Телефоны.Очистить();

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Телефоны.Телефон КАК Телефон,
| Телефоны.Сотрудник КАК Сотрудник,
| Телефоны.ТипНомера КАК ТипНомера,
| Телефоны.СтатусНомера КАК СтатусНомера
|ИЗ
| РегистрСведений.Телефоны КАК Телефоны
|ГДЕ
| Телефоны.Сотрудник = &Сотрудник";

Запрос.УстановитьПараметр("Сотрудник",Объект.Ссылка);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать(); 
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.Телефоны.Добавить();
НоваяСтрока.Телефон = Выборка.Телефон;
НоваяСтрока.ТипНомера = Выборка.ТипНомера;
НоваяСтрока.СтатусНомера = Выборка.СтатусНомера;
КонецЦикла;
КонецЕсли;

// 2. Заполнение паспортных данных сотрудника:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПаспортныеДанныеСотрудниковСрезПоследних.СерияПаспорта КАК СерияПаспорта,
| ПаспортныеДанныеСотрудниковСрезПоследних.НомерПаспорта КАК НомерПаспорта,
| ПаспортныеДанныеСотрудниковСрезПоследних.КемВыданПаспорт КАК КемВыданПаспорт,
| ПаспортныеДанныеСотрудниковСрезПоследних.КодПодразделения КАК КодПодразделения,
| ПаспортныеДанныеСотрудниковСрезПоследних.Период КАК ДатаВыдачи
|ИЗ
| РегистрСведений.ПаспортныеДанныеСотрудников.СрезПоследних(, Сотрудник = &Сотрудник) КАК ПаспортныеДанныеСотрудниковСрезПоследних";

Запрос.УстановитьПараметр("Сотрудник",Объект.Ссылка);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();

Выборка.Следующий();
СерияПаспорта = Выборка.СерияПаспорта;
НомерПаспорта = Выборка.НомерПаспорта;
КемВыдаПаспорт = Выборка.КемВыданПаспорт;
КодПодразделения = Выборка.КодПодразделения;
ДатаВыдачиПаспорта = Выборка.ДатаВыдачи;

КонецЕсли;


КонецПроцедуры

LexaK

при получении/обработки каких-то капельных данных (капельные это когда очень мало, не миллионы записей и сотни соединений)
оптимальность запросов не столь актуальна
большее внимание надо уделить удобочитаемости кода, последующей поддержки и переделки
так же надо/можно отделять разовые данные (например данные паспорта ГРФ) от множественных/списочных данных (например список телефонов)
все разовые данные лучше собрать в один запрос,
списочные данные обрабатывать отдельными запросами
вариантов множество,
главное при этом, что бы это все правильно работало!
ответ Понравился? (в смысле пригодился?)

Алексей_1985_06

Цитата: LexaK от 17 июн 2021, 10:15
при получении/обработки каких-то капельных данных (капельные это когда очень мало, не миллионы записей и сотни соединений)
оптимальность запросов не столь актуальна
большее внимание надо уделить удобочитаемости кода, последующей поддержки и переделки
так же надо/можно отделять разовые данные (например данные паспорта ГРФ) от множественных/списочных данных (например список телефонов)
все разовые данные лучше собрать в один запрос,
списочные данные обрабатывать отдельными запросами
вариантов множество,
главное при этом, что бы это все правильно работало!

LexaK огромное Вам спасибо за разъяснения моего вопроса! :ooifh:

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск