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

```1c
    &НаСервереБезКонтекста
    Функция ПолучитьКурсВалютыНаДату(НаДату, Валюта)

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

    Запрос.УстановитьПараметр("Валюта", Валюта);
    Запрос.УстановитьПараметр("НаДату", НаДату);

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

    Если Не РезультатЗапроса.Пустой() Тогда

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    ВыборкаДетальныеЗаписи.Следующий();

    Возврат ВыборкаДетальныеЗаписи.Курс;

    Иначе

    Возврат 0;

    КонецЕсли;

    КонецФункции
```

И в Процедурах на Клиенте СуммаВалютаПриИзменении(), РасчетныйСчетПриИзменении(), ДатаПриИзменении() вызывайте эту функцию и пересчитывайте свою валютную сумму.
У регистра КурсыВалют бывает еще ресурс "Кратность", проверьте его наличие и используйте при необходимости.
---
ошибка чтения возникает из-за того, что данные из выборки еще не прочитаны.
СрезПоследних получает срез по всем измерениям. В данном случае первым значением измерения Валюта получился Рубль. Вот от и используется.
В запросе нужно добавить отбор по конкретной валюте.
---
Если добавить отбор, то выбирая другую валюту , будет ошибка!
---
Странное решение пересчитывать валютную сумму при ее изменении, а если документ вводится задним числом, курс у вас будет на текущую дату? Зачем тащить контекст на сервер, чтобы получить там курс и пересчитать сумму?
Не проще сделать функцию получения курса по валюте и дате без контекста, вызывать ее при изменении Валюты документа или Даты, сохранить ее значение в скрытом реквизите и уже потом использовать при пересчетах суммы на клиенте?
---
А это соответствует заданию?
   Добавьте на форму документа нередактируемое поле «Валюта». Оно должно автоматически заполняться валютой счёта нашей организации при выборе счёта нашей организации.
Создайте несколько счетов нашей организации в разных валютах.
Документ «ПоступлениеНаРасчетныйСчет» должен делать проводки:
Дт 52 — Кт 62.01. При этом для счёта 52 должен вестись валютный учёт. В качестве валюты в проводках должна использоваться та, которая назначена счёту нашей организации, выбранному в документе.
Подсказка: исходите из того, что сумма в документе указана в той валюте, которая подтягивается в документ из счёта организации.
Если в качестве валюты выступает иностранная валюта, то рублёвая сумма вычисляется по последнему загруженному курсу на дату документа. Если валюта — рубль, валютная сумма равна рублёвой. Если для данной валюты никогда не загружался курс, должен возникать отказ при проведении документа с указанием причины.
---
С публикации задания нужно было и начинать... Ну вот при выборе счёта нашей организации и заполняйте валюту и ее курс на дату документа, при изменении даты документа обновляйте только курс.
---
Вы имеете ввиду вынести курс на форму?
---
Если добавить отбор, то выбирая другую валюту , будет ошибка!
э... какая ошибка?
В секцию ГДЕ добавить отбор на сравнение значения поля измерения Валюта с элементом справочника Валюты, который указан в документе.
---
```1c
    Процедура СуммаВалютыПриИзмененииНаСервере()
    СуммаОплат = Объект.СуммаОплаты;
    ВалютаСч = Объект.СчетОрганизации.ВалютаСчета;
    СумИтог = Объект.СуммаИтог;
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | КурсыВалютСрезПоследних.Валюта КАК Валюта,
    | КурсыВалютСрезПоследних.Курс КАК Курс
    |ИЗ
    | РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних";

    РезультатЗапроса = Запрос.Выполнить();
    ДетальныеЗаписи = РезультатЗапроса.Выгрузить();
    Для каждого Строка из ДетальныеЗаписи Цикл
    Если Строка.Валюта = ВалютаСч Тогда
    СумИтог = СуммаОплат*Строка.Курс
    КонецЕсли;
    КонецЦикла;

    КонецПроцедуры
```
---
Курс На форму выносить не нужно. Я хотел сказать что курс получать вам нужно в случае изменения счета и соответственно валюты и в случае изменения даты документа. Затем использовать его для пересчета при изменении суммы, вот если вы не хотите получать его снова при изменении суммы, можете завести реквизит и хранить его там, но запрос получения курса у вас копеечный поэтому не заморачивайтесь.
Для получения курса я бы использовал такую функцию:

```1c
    &НаСервереБезКонтекста
    Функция ПолучитьКурсВалютыНаДату(НаДату, Валюта)

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

    Запрос.УстановитьПараметр("Валюта", Валюта);
    Запрос.УстановитьПараметр("НаДату", НаДату);

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

    Если Не РезультатЗапроса.Пустой() Тогда

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    ВыборкаДетальныеЗаписи.Следующий();

    Возврат ВыборкаДетальныеЗаписи.Курс;

    Иначе

    Возврат 0;

    КонецЕсли;

    КонецФункции
```

И в Процедурах на Клиенте СуммаВалютаПриИзменении(), РасчетныйСчетПриИзменении(), ДатаПриИзменении() вызывайте эту функцию и пересчитывайте свою валютную сумму.
У регистра КурсыВалют бывает еще ресурс "Кратность", проверьте его наличие и используйте при необходимости.