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