Как правильно объединить данные из регистра оборотов и регистра сведений о курсах валют?

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

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

Вариант 1: Использование СКД (Система компоновки данных)

Если вы создаете отчет с помощью СКД, не спешите писать сложный SQL-код. Система позволяет реализовать получение курсов валют декларативно. Это самый чистый и поддерживаемый метод.

  1. Создайте два набора данных: первый — Запрос к виртуальной таблице Обороты регистра накопления, второй — Запрос к виртуальной таблице СрезПоследних регистра сведений КурсыВалют.
  2. Перейдите на вкладку Связи наборов данных.
  3. Установите связь: НаборДанныхПродаж.Период должен быть связан с НаборДанныхКурсы.Период.
  4. Укажите параметр Период для таблицы СрезПоследних. При такой настройке 1С автоматически подтянет курс на дату записи оборотов.

Вариант 2: Использование временных таблиц в запросе (Продвинутый уровень)

Когда требуется высокая производительность или сложные вычисления (например, расчет кросс-курсов), лучше использовать механизм временных таблиц. Рассмотрим, как грамотно организовать такой запрос.

Сначала мы собираем все необходимые даты из регистра продаж и помещаем их во временную таблицу. Затем мы соединяем этот «скелет» с регистром курсов.


ВЫБРАТЬ 
    ВсеВалюты.Валюта, 
    ВсеДатыКурсов.ДатаКурса 
ПОМЕСТИТЬ ВалютыДатыКурсов 
ИЗ 
    ВсеВалюты КАК ВсеВалюты 
ПОЛНОЕ СОЕДИНЕНИЕ ВсеДатыКурсов КАК ВсеДатыКурсов 
ПО (ИСТИНА);

ВЫБРАТЬ РАЗРЕШЕННЫЕ 
    МАКСИМУМ(КурсыВалют.Период) КАК ДатаВРегистреВалют, 
    КурсыВалют.Валюта, 
    ВалютыДатыКурсов.ДатаКурса 
ПОМЕСТИТЬ ДатыКурсовИРегистра 
ИЗ 
    РегистрСведений.КурсыВалют КАК КурсыВалют 
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВалютыДатыКурсов КАК ВалютыДатыКурсов 
ПО КурсыВалют.Валюта = ВалютыДатыКурсов.Валюта 
И КурсыВалют.Период <= ВалютыДатыКурсов.ДатаКурса 
СГРУППИРОВАТЬ ПО 
    ВалютыДатыКурсов.ДатаКурса, 
    КурсыВалют.Валюта;

Почему это эффективно? Мы ограничиваем выборку только нужными датами и валютами, избегая перебора всего регистра сведений. Использование СГРУППИРОВАТЬ ПО позволяет корректно определить последний актуальный курс на каждую дату из списка наших движений.

Важные советы по оптимизации

При работе с запросами в 1С важно соблюдать несколько правил, чтобы отчет не работал часами:

Теперь вы знаете, как подойти к задаче объединения данных регистра оборотов и сведений. Начинайте с СКД для простых отчетов и переходите к временным таблицам для сложных аналитических задач. Удачи в разработке!

← На главную