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