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

```1c
    &НаСервере
    Функция ПолучитьОклад(Должность)
    Отбор = Новый Структура;
    Отбор.Вставить("Должность", Должность);
    тзДанные = РегистрыСведений.Оклады.СрезПоследних(Объект.Дата, Отбор);
    Если тзДанные.Количество() = 0 Тогда
    Возврат 0;
    Иначе
    Возврат тзДанные[0].РазмерОклада;
    КонецЕсли;
    КонецФункции
```
---
Конечно... если Вам нужен сам запрос, то того что Вы написали мало. В табличной части на поле сотрудник надо повесить ПриИзменении, или ОБработкаВыбора
---
Я и вешал ПриИзменении. По непонятной мне причине, не все функции работают. Посмотрите код выше, если не сложно.
---
Что происходит когда выборка размера оклада пустая?
---
Ничего не происходит, просто пустое значение
---
Потому и не выводит оклад. Сообщите что если выборка пустая то сообщение - оклад не установлен
---
В том-то и беда, что оклад установлен
---
Эти ответы чем не устроили
https://forum.infostart.ru/forum9/topic269890/
---
по какой-то причине, не работает вывод Оклада. Так понимаю, вряд ли остальное заработает. Или я где-то ошибся?

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

    &НаСервере
    Функция ПолучитьДолжность (Сотрудник)
    Возврат Сотрудник.Должность;
    КонецФункции

    &НаСервере
    Функция ПолучитьОклад(Должность)

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

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

    РезультатЗапроса = Запрос.Выполнить();

    Выборка = РезультатЗапроса.Выбрать();

    Если Выборка.Следующий() Тогда
    Возврат Выборка.РазмерОклада;
    КонецЕсли;

    КонецФункции
```
---
ну надо немного поработать и включить отладчик и посмотреть что передается в параметрах.
---
Сообщение было скрыто модератором.
---
А что в текущих данных?
И есть ли по этой должности записи в регистре сведений ранее даты документа?
---
В ТекущихДанных ДанныеФормыЭлементКоллекции
---
Можно период установки оклада в рег.сведений посмотреть. Дата документа должна быть позже периода установки оклада.
---
Дата документа позже записей в регистре сведений. Через запрос в Оклад передается 0, а должно 30.000
---
```1c
    &НаСервере
    Функция ПолучитьОклад(Должность)
    Отбор = Новый Структура;
    Отбор.Вставить("Должность", Должность);
    Оклад = РегистрыСведений.Оклады.Получить(Объект.Дата, Отбор);
    Возврат Оклад;
    КонецФункции
```
---
Все равно оклад пустой
---
Немного ошибся, исправил:

```1c
    &НаСервере
    Функция ПолучитьОклад(Должность)
    Отбор = Новый Структура;
    Отбор.Вставить("Должность", Должность);
    РазмерОклада = РегистрыСведений.Оклады.Получить(Объект.Дата, Отбор).РазмерОклада;
    Возврат РазмерОклада;
    КонецФункции
```
---
Тоже никак. Почему-то Оклад равен 0 и все.
---
Да

```1c
    РазмерОклада = РегистрыСведений.Оклады.Получить(Объект.Дата, Отбор).РазмерОклада;
```

выдает точно на дату.

Нужно использовать срез последних:

```1c
    &НаСервере
    Функция ПолучитьОклад(Должность)
    Отбор = Новый Структура;
    Отбор.Вставить("Должность", Должность);
    РазмерОклада = РегистрыСведений.Оклады.СрезПоследних(Объект.Дата, Отбор).РазмерОклада;
    Возврат РазмерОклада;
    КонецФункции
```
---
Теперь ругается:
Поле объекта не обнаружено (РазмерОклада)
{Документ.НачислениеСотрудникам.Форма.ФормаДокумента.Форма(19)}: РазмерОклада = РегистрыСведений.Оклады.СрезПоследних(Объект.Дата, Отбор).РазмерОклада;
{Документ.НачислениеСотрудникам.Форма.ФормаДокумента.Форма(6)}: ТекСтрока.Оклад = ПолучитьОклад(ТекСтрока.Должность);
---
```1c
    &НаСервере
    Функция ПолучитьОклад(Должность)
    Отбор = Новый Структура;
    Отбор.Вставить("Должность", Должность);
    РазмерОклада = РегистрыСведений.Оклады.СрезПоследних(Объект.Дата, Отбор);
    Возврат РазмерОклада[0].РазмерОклада;
    КонецФункции
```

Попробуйте так
---
Тоже ругает вас при проведении:
Индекс находится за границами массива
{Документ.НачислениеСотрудникам.Форма.ФормаДокумента.Форма(20)}: Возврат РазмерОклада[0].РазмерОклада;
{Документ.НачислениеСотрудникам.Форма.ФормаДокумента.Форма(6)}: ТекСтрока.Оклад = ПолучитьОклад(ТекСтрока.Должность);
---
Вы уверены, что по этой должности вообще есть оклад на дату меньше или равно Объект.Дата? Данная ошибка говорит о том, что таких совпадений с таким отбором не выявлено.
---
Да, уверен, что есть оклады (ниже скрин). Документ же я пытаюсь провести на сегоднящнее число (28.09.2021).
---
Возможно, проблема в должности. Какой тип значения должности вы передаете и какой тип стоит в регистре?
---
В документе тип Строка с неограниченной длинной. В регистре Оклады тип СправочникСсылка.Должности
---
Установите тип не строку, а СправочникСсылка.Должности.

Или передавайте параметр должность так:

```1c
    &НаКлиенте
    Процедура НачисленияСотрудникПриИзменении(Элемент)
    ТекСтрока = Элементы.Начисления.ТекущиеДанные;
    Должность = ПолучитьДолжность(ТекСтрока.Сотрудник);
    ТекСтрока.Должность = Должность;
    ТекСтрока.Оклад = ПолучитьОклад(Должность);
    КонецПроцедуры
```
---
Да... Понимаю... Не сердитесь, я еще только учусь, студент СПО.
---
Ну пасьянс похоже сошёлся: нет там записей. Должность задвоилась или с датой траблы.
---
Да, СрезПоследних возвращает Таблицу значений. Нужно еще обратиться к строке ТЗ.

```1c
    &НаСервере
    Функция ПолучитьОклад(Должность)
    Отбор = Новый Структура;
    Отбор.Вставить("Должность", Должность);
    тзДанные = РегистрыСведений.Оклады.СрезПоследних(Объект.Дата, Отбор);
    Если тзДанные.Количество() = 0 Тогда
    Возврат 0;
    Иначе
    Возврат тзДанные[0].РазмерОклада;
    КонецЕсли;
    КонецФункции
```
---
Тоже 0 возвращает. Быть может вам всем скинуть конфигурацию? Возможно, звезды сойдутся и общая картина всей конфигурации даст вам представление проблемы?
---
Быть может вам всем скинуть конфигурацию? Возможно, звезды сойдутся и общая картина всей конфигурации даст вам представление проблемы? Да, скиньте пожалуйста на k1dajsjuda@yandex.ru Можно было бы взглянуть поближе на проблему. Или выложите и скиньте ссылку.
В документе тип Строка с неограниченной длинной. В регистре Оклады тип СправочникСсылка.ДолжностиЭто так по заданию? Вообще то в документе по идее тоже должен быть СправочникСсылка.Должности.