Как исправить ошибки при выгрузке курса валют из регистра сведений в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При получении курса валюты из регистра сведений РегистрСведений.КурсыВалют программисты 1С часто сталкиваются с синтаксическими ошибками в тексте запроса и с ошибкой «Переменная не определена» при установке параметров. Рассмотрим подробнее, почему возникают эти проблемы, как правильно формировать запрос к виртуальной таблице СрезПоследних и выводить полученные данные в макет печати.

Типичные ошибки при написании запроса

Проанализируем базовые ошибки, которые мешают выполнению запроса и приводят к аварийному завершению программы:

  1. Лишняя запятая перед конструкцией ИЗ. Если в секции ВЫБРАТЬ после последнего поля стоит запятая, платформенное слово ИЗ воспринимается как синтаксическая ошибка.
  2. Неопределенная переменная в коде модуля. В модуле менеджера или модуле объекта нельзя использовать переменные (например, Выборка или Ссылка), если они не были явно объявлены или не переданы в качестве входящих параметров функции.
  3. Использование секции ГДЕ вместо параметров виртуальной таблицы. Фильтрация по измерению Валюта в секции ГДЕ заставляет платформу считывать весь срез последних по всем валютам и лишь затем отсекать лишние записи. Это снижает производительность. Оптимально накладывать условия непосредственно в параметрах виртуальной таблицы.
  4. Некорректный синтаксис строковых литералов. В тексте запроса строка должна оборачиваться в двойные кавычки. Например: Валюта.Код = ""001"" или Валюта.Код = ""978"" (для Евро).

Разбор синтаксических ошибок на примере

Посмотрим на некорректный фрагмент кода:


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

Запрос.УстановитьПараметр("Дата", Выборка.ДатаВремяВыезда); // Переменная "Выборка" не определена в контексте

Для исправления необходимо убрать лишнюю запятую, перенести условие отбора по валюте в параметры среза последних и убедиться, что источник даты определен в текущем контексте.

Правильная реализация запроса для получения курса

Рассмотрим правильный вариант написания кода 1С, сформированный вручную или с использованием Конструктора запросов:


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

// В качестве даты передаем реальное значение из имеющейся структуры или параметра
Запрос.УстановитьПараметр("Дата", ВыборкаШапка.ДатаВремяВылета);

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

Если ВыборкаДетальныеЗаписи.Следующий() Тогда
	// Заполняем параметр области печатной формы
	ОбластьЗагрузка.Параметры.КурсРуб = ВыборкаДетальныеЗаписи.Курс;
КонецЕсли;

ТабДок.Вывести(ОбластьЗагрузка);

Важные нюансы работы с курсами валют

При дальнейшей работе с валютным учетом и выводом данных в макет следует учитывать несколько критически важных особенностей:

  1. Учет кратности валюты. В регистре сведений КурсыВалют, помимо ресурса Курс, присутствует ресурс Кратность. Реальный курс пересчета рассчитывается как Курс / Кратность. Если не учитывать кратность, расчеты для валют с кратностью 10, 100 или 1000 будут ошибочными.
  2. Защита от отсутствия данных (ЕСТЬNULL). Если на указанную дату курс не занесен в базу, запрос вернет пустой результат или NULL. Рекомендуется обрабатывать такие случаи функцией ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1).
  3. Использование функций БСП. В типовых конфигурациях (БП, УТ, ERP) рекомендуется избегать прямых запросов к регистру и использовать функции Библиотеки Стандартных Подсистем, например, РаботаСКурсамиВалют.ПолучитьКурсВалюты(Валюта, Дата).
← На главную