При получении курса валюты из регистра сведений РегистрСведений.КурсыВалют программисты 1С часто сталкиваются с синтаксическими ошибками в тексте запроса и с ошибкой «Переменная не определена» при установке параметров. Рассмотрим подробнее, почему возникают эти проблемы, как правильно формировать запрос к виртуальной таблице СрезПоследних и выводить полученные данные в макет печати.
Проанализируем базовые ошибки, которые мешают выполнению запроса и приводят к аварийному завершению программы:
ИЗ. Если в секции ВЫБРАТЬ после последнего поля стоит запятая, платформенное слово ИЗ воспринимается как синтаксическая ошибка.Выборка или Ссылка), если они не были явно объявлены или не переданы в качестве входящих параметров функции.ГДЕ вместо параметров виртуальной таблицы. Фильтрация по измерению Валюта в секции ГДЕ заставляет платформу считывать весь срез последних по всем валютам и лишь затем отсекать лишние записи. Это снижает производительность. Оптимально накладывать условия непосредственно в параметрах виртуальной таблицы.Валюта.Код = ""001"" или Валюта.Код = ""978"" (для Евро).Посмотрим на некорректный фрагмент кода:
// НЕКОРРЕКТНО
Запрос.Текст = "ВЫБРАТЬ
| КурсыВалютСрезПоследних.Курс КАК КУРС, // Лишняя запятая!
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&Дата, ) КАК КурсыВалютСрезПоследних
|ГДЕ
| КурсыВалютСрезПоследних.Валюта.Код = (001)"; // Скобки и отсутствие кавычек!
Запрос.УстановитьПараметр("Дата", Выборка.ДатаВремяВыезда); // Переменная "Выборка" не определена в контексте
Для исправления необходимо убрать лишнюю запятую, перенести условие отбора по валюте в параметры среза последних и убедиться, что источник даты определен в текущем контексте.
Рассмотрим правильный вариант написания кода 1С, сформированный вручную или с использованием Конструктора запросов:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| КурсыВалютСрезПоследних.Курс КАК Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта.Код = ""001"") КАК КурсыВалютСрезПоследних";
// В качестве даты передаем реальное значение из имеющейся структуры или параметра
Запрос.УстановитьПараметр("Дата", ВыборкаШапка.ДатаВремяВылета);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
// Заполняем параметр области печатной формы
ОбластьЗагрузка.Параметры.КурсРуб = ВыборкаДетальныеЗаписи.Курс;
КонецЕсли;
ТабДок.Вывести(ОбластьЗагрузка);
При дальнейшей работе с валютным учетом и выводом данных в макет следует учитывать несколько критически важных особенностей:
КурсыВалют, помимо ресурса Курс, присутствует ресурс Кратность. Реальный курс пересчета рассчитывается как Курс / Кратность. Если не учитывать кратность, расчеты для валют с кратностью 10, 100 или 1000 будут ошибочными.NULL. Рекомендуется обрабатывать такие случаи функцией ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1).РаботаСКурсамиВалют.ПолучитьКурсВалюты(Валюта, Дата).