Как настроить загрузку курсов нестандартных валют (у.е.) в 1С:УПП 1.2 / 1.3?

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

При ведении внешнеэкономической деятельности или расчетах с отечественными контрагентами компании часто используют договоры в условных единицах (у.е.). Обычно курс такой условной единицы жестко привязан к официальному курсу Центрального банка РФ для определенной иностранной валюты (например, EUR или USD), но с некоторой фиксированной наценкой — например, «EUR + 1%» или «USD + 2%».

В современных конфигурациях 1С, разработанных на базе Библиотеки стандартных подсистем (БСП) — таких как 1С:Бухгалтерия 3.0, 1С:ERP 2 или 1С:Комплексная автоматизация 2 — настройка зависимых валют является стандартной операцией. Достаточно в карточке валюты указать, что ее курс рассчитывается по формуле или зависит от базовой валюты. Однако в классической конфигурации 1С:Управление производственным предприятием, редакция 1.2 / 1.3 (УПП), этот механизм «из коробки» отсутствует. В справочнике Валюты нет возможности задать формулу или наценку.

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

---

Методологический аспект: Почему нельзя обойтись «Типом цен»?

Иногда у начинающих специалистов или бухгалтеров возникает соблазн не плодить «лишние» валюты в справочнике, а настроить механизм через Типы цен номенклатуры. Идея кажется простой: установить базовую валюту EUR, а в типе цен настроить наценку в 1%.

Давайте проанализируем, к каким последствиям в учете это приведет. С точки зрения управленческого, бухгалтерского и налогового учета (согласно ПБУ 3/2006) обязательства и активы, выраженные в иностранной валюте или у.е., подлежат обязательной переоценке:

  1. На дату совершения операции (поступление, отгрузка, оплата).
  2. На отчетную дату (последний день каждого месяца).

Если в договоре с контрагентом указана базовая валюта EUR, то программа 1С при проведении документов и при выполнении регламентной процедуры «Переоценка валютных средств» в конце месяца будет использовать чистый курс EUR Центрального банка РФ. В результате:

Вывод: Для корректного ведения регламентированного учета в у.е. с нестандартным курсом в 1С:УПП необходимо создавать отдельную валюту (например, «Евро + 1%») и обеспечивать ежедневное заполнение ее курса в регистре сведений КурсыВалют.

---

Вариант решения №1. Доработка правил обмена (если настроен обмен с БП 3.0)

Если в вашей компании учет ведется параллельно в 1С:Бухгалтерии предприятия (БП) и 1С:УПП, и между ними настроен регулярный обмен данными, то это самый простой и «чистый» способ.

В современных версиях БП 3.0 зависимая валюта «Евро + 1%» создается штатными средствами. Курсы для нее рассчитываются автоматически при обновлении классификатора валют. Наша задача — передать эти готовые курсы в УПП. Для этого выполним следующие шаги:

  1. Откроем правила обмена в программе «1С:Конвертация данных 2».
  2. Найдем или создадим Правило конвертации объектов (ПКО) для регистра сведений КурсыВалют.
  3. Настроим перенос записей регистра по тем валютам, которые являются зависимыми. При переносе документов, выраженных в «Евро + 1%», сама валюта синхронизируется по коду или наименованию.
  4. При обмене из БП в УПП будут автоматически «прилетать» актуальные рассчитанные курсы, и нам не потребуется вносить изменения в программный код самой УПП.

---

Вариант решения №2. Использование подписки на событие (Рекомендуемый программный метод)

Если обмена с БП нет или курсы должны рассчитываться непосредственно внутри УПП, оптимальным решением будет создание подписки на событие. Этот метод хорош тем, что мы не изменяем код типовой обработки ЗагрузкаКурсовВалютРБК и не снимаем конфигурацию с поддержки в этой части. При обновлении УПП наши доработки не пострадают.

Рассмотрим пошагово, как реализовать этот механизм:

  1. Откроем конфигуратор УПП.
  2. В дереве метаданных найдем ветку «Общие -> Подписки на события» и добавим новую подписку.
  3. Назовем подписку, например, ПриЗаписиКурсовВалютРасчетЗависимых.
  4. В качестве источника выберем РегистрСведенийНаборЗаписей.КурсыВалют.
  5. Событие выберем — ПриЗаписи.
  6. Создадим новый общий модуль (например, _РаботаСВалютамиВызовСервера) или используем существующий нетиповой модуль. Обязательно установим для него свойства «Сервер» и «Вызов сервера».

Пропишем в модуле следующий код:


Процедура ПриЗаписиКурсовВалютРасчетЗависимыхПриЗаписи(Источник, Отказ) Экспорт
    
    // Предотвращаем зацикливание при записи зависимой валюты
    Если ПараметрыСеанса.Свойство("ИдетЗаписьЗависимогоКурса") И ПараметрыСеанса.ИдетЗаписьЗависимогоКурса Тогда
        Возврат;
    КонецЕсли;
    
    // Определим базовую валюту (например, EUR, код 978)
    КодБазовойВалюты = "978"; // Код евро
    БазоваяВалюта = Справочники.Валюты.НайтиПоКоду(КодБазовойВалюты);
    
    Если БазоваяВалюта.Пустая() Тогда
        Возврат;
    КонецЕсли;
    
    // Найдем зависимую валюту "Евро + 1%"
    // В реальной практике лучше использовать предопределенный элемент или поиск по коду/символьному коду
    ЗависимаяВалюта = Справочники.Валюты.НайтиПоНаименованию("EUR+1%"); 
    
    Если ЗависимаяВалюта.Пустая() Тогда
        Возврат;
    КонецЕсли;
    
    ПроцентНаценки = 1; // 1% наценки
    Коэффициент = 1 + (ПроцентНаценки / 100);
    
    // Обходим набор записей, который записывается в данный момент
    Для Каждого Запись Из Источник Цикл
        
        // Если записывается курс нашей базовой валюты (Евро)
        Если Запись.Валюта = БазоваяВалюта Тогда
            
            // Запишем курс для зависимой валюты на ту же дату
            ПараметрыСеанса.Вставить("ИдетЗаписьЗависимогоКурса", Истина);
            
            Попытка
                ЗаписатьЗависимыйКурс(Запись.Период, ЗависимаяВалюта, Запись.Курс * Коэффициент, Запись.Кратность);
            Исключение
                ОбщегоНазначения.СообщитьИнформациюПользователю("Ошибка записи зависимого курса: " + ОписаниеОшибки());
            КонецПопытки;
            
            ПараметрыСеанса.Вставить("ИдетЗаписьЗависимогоКурса", Ложь);
            
        КонецЕсли;
        
    КонецЦикла;

КонецПроцедуры

Процедура ЗаписатьЗависимыйКурс(ДатаКурса, ВалютаСсылка, НовыйКурс, Кратность)
    
    МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Период = ДатаКурса;
    МенеджерЗаписи.Валюта = ВалютаСсылка;
    
    // Округлим курс до 4 знаков после запятой, как принято в учете РФ
    МенеджерЗаписи.Курс   = Окр(НовыйКурс, 4);
    МенеджерЗаписи.Кратность = Кратность;
    
    МенеджерЗаписи.Записать(Истина); // Записываем с замещением существующей записи
    
КонецПроцедуры

Преимущества данного метода: Метод работает абсолютно прозрачно. Как только пользователь вручную меняет курс евро, загружает его через обработку РБК или импортирует из внешних систем — подписка мгновенно реагирует, рассчитывает значение «Евро + 1%» и делает запись в регистр сведений.

---

Вариант решения №3. Модификация обработки «Загрузка курсов валют»

Если вы предпочитаете централизованно управлять загрузкой непосредственно в момент работы обработки РБК, можно внести изменения в саму обработку. В УПП за загрузку отвечает обработка ЗагрузкаКурсовВалют.

Проанализируем этот путь. Нам потребуется:

  1. Найти в форме или модуле обработки процедуру, отвечающую за запись загруженных курсов в регистр (обычно это процедура ЗаписатьКурсыВалют()).
  2. В цикле записи после строки создания записи по основной валюте добавить блок кода, рассчитывающий курс для зависимой валюты и записывающий его аналогичным образом.

Пример модификации кода внутри обработки:


// ... Код типовой обработки записи курса основной валюты ...
ЗаписьКурса.Записать();

// Наша доработка:
Если ТекущаяВалюта = ВалютаЕвро Тогда
    ЗаписьЗависимой = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
    ЗаписьЗависимой.Период = ТекущаяДата;
    ЗаписьЗависимой.Валюта = ВалютаЕвроПлюсПроцент;
    ЗаписьЗависимой.Курс   = Окр(ЗагруженныйКурсЕвро * 1.01, 4);
    ЗаписьЗависимой.Кратность = КратностьЕвро;
    ЗаписьЗависимой.Записать();
КонецЕсли;

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

---

Резюме

При работе со старыми конфигурациями 1С класса УПП 1.2 / 1.3 важно сочетать методологическую корректность с красивыми техническими решениями. Создание отдельной условной валюты (например, EUR+1%) гарантирует точный расчет курсовых разниц в бухгалтерском учете в соответствии с ПБУ 3/2006.

Для автоматического наполнения регистра курсов наиболее предпочтительным и технологичным вариантом является подписка на событие записи регистра. Она сохраняет конфигурацию на поддержке и гарантирует, что курс у.е. всегда будет актуальным, независимо от того, каким способом был обновлен курс базовой валюты.

← На главную