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

Как перенести последние значение из регистра в реквизит формы

Автор Алексей_1985_06, 05 июл 2020, 10:40

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

Алексей_1985_06

Ребят, подскажите пжл. есть ли вообще такая возможность (если есть то как) сделать следующие:
1. Есть рег.сведений который хранит историю адресов места жительства сотрудника (ресурс: адрес, измерение:сотрудник)
2. На форме есть реквизит "Адрес" - в который нужно сделать запись последнего адреса из рег.сведений при записи элемента справочника.
В модуле объекта сделал так, но ничего не получается...:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| АдресМестаЖительстваСотрудникаСрезПоследних.Сотрудник.Ссылка КАК СотрудникСсылка,
| АдресМестаЖительстваСотрудникаСрезПоследних.АдресМестаЖительства КАК АдресМестаЖительства
|ИЗ
| РегистрСведений.АдресМестаЖительстваСотрудника.СрезПоследних КАК АдресМестаЖительстваСотрудникаСрезПоследних
|ГДЕ
| АдресМестаЖительстваСотрудникаСрезПоследних.Сотрудник.Ссылка = &Ссылка";

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

Пока Выборка.Следующий() Цикл
адрес = Выборка.АдресМестаЖительства;
КонецЦикла;

bsn-chita

Вроде должно работать.
Вместо ГДЕ (и в данном случае Сотрудник.Ссылка избыточно, достаточно просто Сотрудник)

|ИЗ
    |    РегистрСведений.АдресМестаЖительстваСотрудника.СрезПоследних КАК АдресМестаЖительстваСотрудникаСрезПоследних
    |ГДЕ
    |    АдресМестаЖительстваСотрудникаСрезПоследних.Сотрудник.Ссылка = &Ссылка";

Используйте параметры виртуальной таблицы

|ИЗ
    | РегистрСведений.АдресМестаЖительстваСотрудника.СрезПоследних(, Сотрудник = &Ссылка) КАК АдресМестаЖительстваСотрудникаСрезПоследних";


Адрес это реквизит формы или же справочника? Если это реквизит формы, то и его выводом вам следует озаботиться самому.

Алексей_1985_06

Цитата: bsn-chita от 05 июл 2020, 12:43
Вроде должно работать.
Вместо ГДЕ (и в данном случае Сотрудник.Ссылка избыточно, достаточно просто Сотрудник)

|ИЗ
    |    РегистрСведений.АдресМестаЖительстваСотрудника.СрезПоследних КАК АдресМестаЖительстваСотрудникаСрезПоследних
    |ГДЕ
    |    АдресМестаЖительстваСотрудникаСрезПоследних.Сотрудник.Ссылка = &Ссылка";

Используйте параметры виртуальной таблицы

|ИЗ
    | РегистрСведений.АдресМестаЖительстваСотрудника.СрезПоследних(, Сотрудник = &Ссылка) КАК АдресМестаЖительстваСотрудникаСрезПоследних";


Адрес это реквизит формы или же справочника? Если это реквизит формы, то и его выводом вам следует озаботиться самому.

Спасибо, все получилось!!!
Добавлено: 05 июл 2020, 18:41


Цитата: Алексей_1985_06 от 05 июл 2020, 13:29
Цитата: bsn-chita от 05 июл 2020, 12:43
Вроде должно работать.
Вместо ГДЕ (и в данном случае Сотрудник.Ссылка избыточно, достаточно просто Сотрудник)

|ИЗ
    |    РегистрСведений.АдресМестаЖительстваСотрудника.СрезПоследних КАК АдресМестаЖительстваСотрудникаСрезПоследних
    |ГДЕ
    |    АдресМестаЖительстваСотрудникаСрезПоследних.Сотрудник.Ссылка = &Ссылка";

Используйте параметры виртуальной таблицы

|ИЗ
    | РегистрСведений.АдресМестаЖительстваСотрудника.СрезПоследних(, Сотрудник = &Ссылка) КАК АдресМестаЖительстваСотрудникаСрезПоследних";


Адрес это реквизит формы или же справочника? Если это реквизит формы, то и его выводом вам следует озаботиться самому.

Спасибо, все получилось!!!

Блин, рано обрадовался... не много не то, что нужно. Подскажите кто знает, как все-таки получить последнюю запись регистра сведений ? Сейчас выбираются все записи одного сотрудника, а не последняя... Не могу понять что в условии надо дописать.
ВЫБРАТЬ
АдресМестаЖительстваСрезПоследних.Сотрудник КАК Сотрудник,
АдресМестаЖительстваСрезПоследних.ДатаНачалаПроживания КАК ДатаНачалаПроживания,
АдресМестаЖительстваСрезПоследних.АдресМестаЖительства КАК АдресМестаЖительства
ИЗ
РегистрСведений.АдресМестаЖительства.СрезПоследних КАК АдресМестаЖительстваСрезПоследних
ГДЕ
АдресМестаЖительстваСрезПоследних.Сотрудник = &Сотрудник

УПОРЯДОЧИТЬ ПО
ДатаНачалаПроживания

antoneus

Ну правильно, берется последняя дата начала проживания на каждый адрес.

Алексей_1985_06

Цитата: antoneus от 05 июл 2020, 19:19
Ну правильно, берется последняя дата начала проживания на каждый адрес.
А как эту запись (с последней датой проживания) получить?

bsn-chita

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

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

LexaK

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


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

Алексей_1985_06

Цитата: LexaK от 06 июл 2020, 12:16
попробуйте так, гораздо короче,
недостатки: можно получить последний адрес только одного сотрудника, заданного ссылкой,
если надо получить последние адреса сразу для нескольких сотрудников, тогда надо переписать запрос


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


LexaK и другие гуру 1С, опять вынужден обратиться к Вам. Можете подсказать как получить последнюю запись из регистра сведений (Независимый, Периодичность: В пределах года). У меня видимо трудность с установкой параметра....  В регистре хранятся данные о присвоенных званиях, в реквизит  (документа) при выборе сотрудника необходимо записать его текущие звание, т.е.поместить исходя из последней даты присвоение

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

LexaK

если у ва правильно построен периодический регистр сведений (что вызывает сомнение) по попробуйте так

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

Алексей_1985_06

Цитата: LexaK от 08 июл 2020, 18:31
если у ва правильно построен периодический регистр сведений (что вызывает сомнение) по попробуйте так

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


Да Вы правы, что-то видимо не так у меня. Не получилось!!! Можете подсказать в чем моя ошибка? Структура регистра во вложении :

Теги:

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

Рейтинг@Mail.ru

Поиск