Почему не работает функция получения курса валюты в 1С?

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

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

Анализ исходной проблемы

В исходном коде автора наблюдалось несколько критических недочетов:

Решение 1: Правильное использование запроса и проверки выборки

Для получения курса валюты лучше всего использовать метод Следующий() объекта Выборка сразу после выполнения запроса. Если запись найдена, мы получаем значение, если нет — корректно обрабатываем этот случай (например, возвращаем 0 или другое значение по умолчанию).

Рассмотрим исправленный вариант кода:


Функция ПолучитьКурсВалюты(Валюта, ДатаКурса) Экспорт
    Если Валюта = Справочники.Валюты.Рубль Тогда
        Возврат 1;
    КонецЕсли;

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

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

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

    Если Выборка.Следующий() Тогда
        Возврат Выборка.Курс;
    Иначе
        // Возвращаем 0, если курс не найден
        Возврат 0;
    КонецЕсли;
КонецФункции

Почему важно оптимизировать код

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

Решение 2: Использование Библиотеки Стандартных Подсистем (БСП)

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

Рекомендуемый вызов:


// Использование функции из БСП
Курс = РаботаСКурсамиВалют.ПолучитьКурсВалюты(Валюта, ДатаКурса);

Полезные советы по отладке и написанию кода

  1. Инициализация переменных: Всегда старайтесь инициализировать переменную результата в начале функции. Это помогает избежать ошибок типа «переменная не определена», если логика программы пойдет по пути, где присвоение значения не предусмотрено.
  2. Проверка на пустоту: Всегда предусматривайте вариант, когда запрос ничего не вернул. Возврат 0 — это стандарт, но в некоторых бизнес-процессах может потребоваться генерация ошибки или логирование отсутствия курса.
  3. Избегайте лишних циклов: Если вы ожидаете одну запись, используйте конструкцию Если Выборка.Следующий() Тогда. Это общепринятый стандарт 1С, который делает ваш код профессиональным и понятным для других коллег.

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

← На главную