Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 03:31

Подскажите с запросом

Автор Алексей_1985_06, 22 июл 2020, 21:35

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

Алексей_1985_06

Всем привет! Подскажите, необходимо при изменении получателя (сотрудника) в накладной, в реквизит "ДолжностьПолучателя" записать его должность из регистра сведений, возникло затруднение с запросом, подскажите как правильно сделать?

&НаКлиенте
Процедура ПолучательПриИзменении(Элемент)
Объект.ДолжностьПолучателя = ПолучитьТекущуюДолжность();
КонецПроцедуры

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

Запрос.УстановитьПараметр("Сотрудник", Объект.Получатель);
Результат = Запрос.Выполнить().Выбрать().....; // тут не понимаю какой метод нужен, все возможные перепробовал но не получается. Может что то не так делаю!
Возврат (Результат);
КонецФункции


DmitriyF

Цитата: Алексей_1985_06 от 22 июл 2020, 21:35
Всем привет! Подскажите, необходимо при изменении получателя (сотрудника) в накладной, в реквизит "ДолжностьПолучателя" записать его должность из регистра сведений, возникло затруднение с запросом, подскажите как правильно сделать?

&НаКлиенте
Процедура ПолучательПриИзменении(Элемент)
Объект.ДолжностьПолучателя = ПолучитьТекущуюДолжность();
КонецПроцедуры

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

Запрос.УстановитьПараметр("Сотрудник", Объект.Получатель);
Результат = Запрос.Выполнить().Выбрать().....; // тут не понимаю какой метод нужен, все возможные перепробовал но не получается. Может что то не так делаю!
Возврат (Результат);
КонецФункции

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

bsn-chita

Вы хотите всегда получать последнюю на текущий момент должность вне зависимости от например даты документа? Но все равно я бы использовал параметры виртуальной таблицы вместо ГДЕ. Можно так же сделать функцию вне контекстной и передавать в нее дату (если нужно) и сотрудника.
P.S. Если все же дата имеет значение, то и при ее изменении нужно проделывать расчет должности.

Алексей_1985_06

Цитата: bsn-chita от 23 июл 2020, 10:18
Вы хотите всегда получать последнюю на текущий момент должность вне зависимости от например даты документа? Но все равно я бы использовал параметры виртуальной таблицы вместо ГДЕ. Можно так же сделать функцию вне контекстной и передавать в нее дату (если нужно) и сотрудника.
P.S. Если все же дата имеет значение, то и при ее изменении нужно проделывать расчет должности.
Да, об этом я и не подумал, подскажите пожалуйста, как реализовать, чтобы должность выбиралась последняя на указанную дату? Что-то не получается у меня... :dfbsdfbsdf::dfbsdfbsdf::dfbsdfbsdf:

Сейчас код такой:
&НаКлиенте
Процедура ПолучательПриИзменении(Элемент)
Объект.ДолжностьПолучателя = ПолучитьТекущуюДолжность();
КонецПроцедуры

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

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

РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
Результат = Выборка.Должность; 
КонецЦикла;
КонецЕсли;
Возврат (Результат);
КонецФункции


bsn-chita

Как то так

&НаКлиенте
Процедура ПолучательПриИзменении(Элемент)
Объект.Должность = ПолучитьТекущуюДолжность(Объект.Дата, Объект.Сотрудник)
КонецПроцедуры

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

Так же при изменении даты нужно сделать аналогично.

Алексей_1985_06

Цитата: bsn-chita от 23 июл 2020, 18:23
Как то так

&НаКлиенте
Процедура ПолучательПриИзменении(Элемент)
Объект.Должность = ПолучитьТекущуюДолжность(Объект.Дата, Объект.Сотрудник)
КонецПроцедуры

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

Так же при изменении даты нужно сделать аналогично.
Огромное Вам спасибо! Все работает как надо!

Теги:

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

Рейтинг@Mail.ru

Поиск