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