Как вести учет валют, если курс меняется несколько раз в день в 1С:УТП

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

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

Вариант 1. Изменение периодичности регистра (Технический подход)

Самый очевидный путь, который первым приходит в голову разработчику, — это изменение метаданных регистра сведений КурсыВалют. По умолчанию в УТП 1.2 установлена периодичность «В пределах дня». Проанализируем, что произойдет, если изменить её на «В пределах секунды».

С технической точки зрения в УТП большинство запросов используют метод СрезПоследних на дату документа. Если дата документа содержит время (что является стандартом), система корректно подтянет курс, ближайший к моменту проведения операции. Однако рассмотрим скрытые риски:

  1. Типовые отчеты: Некоторые алгоритмы в старых конфигурациях принудительно обрезают время до начала дня при получении курса. В таком случае, даже если в регистре 5 записей за день, отчет всегда будет видеть только самую первую.
  2. Обновление конфигурации: Изменение периодичности основного регистра — это серьезная правка метаданных. При следующем обновлении системы через сравнение и объединение конфигураций вам придется вручную контролировать этот объект, чтобы не потерять данные и не вернуть настройки к типовым.
  3. Производительность: При огромном количестве записей в регистре (если валют много и курсы меняются часто) размер таблицы итогов регистра сведений может вырасти, что незначительно, но повлияет на скорость получения данных.

Если вы все же решили идти этим путем, пример программного получения курса на конкретный момент времени будет выглядеть так:


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

Вариант 2. Фиксация курса непосредственно в документах

Проанализируем более безопасный метод, который не требует изменения структуры базы данных. В большинстве документов УТП (Заказ покупателя, Реализация товаров и услуг, Поступление товаров и услуг) уже есть реквизиты КурсВзаиморасчетов или возможность указать курс в диалоговом окне «Цены и валюта».

Как это работает на практике:

  1. Регистр КурсыВалют используется только как справочник для автоматического заполнения по умолчанию.
  2. При создании документа ответственный менеджер вручную (или программно по кнопке) вносит тот курс, по которому фактически совершается сделка.
  3. Этот курс сохраняется в самом документе и используется при формировании проводок и движений по регистрам накопления.

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

Вариант 3. Методология «Единого курса» и курсовых разниц

Рассмотрим ситуацию с точки зрения финансового учета. Согласно стандартам учета, на конец дня все остатки валютных денежных средств должны быть пересчитаны по единому курсу (например, официальному курсу НБУ или внутреннему курсу компании на конец дня).

Если в течение дня вы покупали валюту по курсам 40.0, 40.5 и 41.0, то на вашем валютном счете теперь лежит сумма, купленная по разным ценам. Однако для системы 1С важно, какой курс будет зафиксирован как «итоговый» на конец суток.

Рекомендуемый алгоритм:

  1. В регистре сведений оставляем периодичность «День».
  2. В регистр записываем средний или итоговый курс за день.
  3. Разницу между курсом конкретной сделки (бабы Зины) и официальным курсом из регистра отражаем через документ ПокупкаПродажаВалюты.
  4. Эта разница автоматически списывается на прочие доходы или расходы (счета 711 или 942).

Такой подход позволяет не «засорять» регистр цен и корректно выполнять регламентную процедуру ПереоценкаВалютныхСредств в конце месяца, которая всегда ориентируется на одну точку во времени — конец дня.

Вариант 4. Добавление нового измерения (Для продвинутых задач)

Если специфика бизнеса требует хранения нескольких типов курсов одновременно (например, курс НБУ, курс межбанка и курс конкретного обменного пункта), то лучшим решением будет добавление нового измерения в регистр КурсыВалют.

Посмотрим на шаги реализации:

  1. Создаем справочник ТипыКурсов (значения: Официальный, Коммерческий, Внутренний).
  2. Добавляем в регистр сведений КурсыВалют измерение ТипКурса с типом Ссылка на наш новый справочник.
  3. В документах добавляем аналогичный реквизит ТипКурса.

Этот метод позволяет иметь неограниченное количество курсов на одну дату без изменения периодичности. Система будет четко знать: для налоговой берем курс «Официальный», а для управленческого учета — «Коммерческий».

Резюме

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

← На главную