При ведении внешнеэкономической деятельности или расчетах с отечественными контрагентами компании часто используют договоры в условных единицах (у.е.). Обычно курс такой условной единицы жестко привязан к официальному курсу Центрального банка РФ для определенной иностранной валюты (например, 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) обязательства и активы, выраженные в иностранной валюте или у.е., подлежат обязательной переоценке:
Если в договоре с контрагентом указана базовая валюта EUR, то программа 1С при проведении документов и при выполнении регламентной процедуры «Переоценка валютных средств» в конце месяца будет использовать чистый курс EUR Центрального банка РФ. В результате:
60.31, 60.32, 62.31, 62.32) будут отражены по неверному курсу.Вывод: Для корректного ведения регламентированного учета в у.е. с нестандартным курсом в 1С:УПП необходимо создавать отдельную валюту (например, «Евро + 1%») и обеспечивать ежедневное заполнение ее курса в регистре сведений КурсыВалют.
---
Если в вашей компании учет ведется параллельно в 1С:Бухгалтерии предприятия (БП) и 1С:УПП, и между ними настроен регулярный обмен данными, то это самый простой и «чистый» способ.
В современных версиях БП 3.0 зависимая валюта «Евро + 1%» создается штатными средствами. Курсы для нее рассчитываются автоматически при обновлении классификатора валют. Наша задача — передать эти готовые курсы в УПП. Для этого выполним следующие шаги:
КурсыВалют.---
Если обмена с БП нет или курсы должны рассчитываться непосредственно внутри УПП, оптимальным решением будет создание подписки на событие. Этот метод хорош тем, что мы не изменяем код типовой обработки ЗагрузкаКурсовВалютРБК и не снимаем конфигурацию с поддержки в этой части. При обновлении УПП наши доработки не пострадают.
Рассмотрим пошагово, как реализовать этот механизм:
ПриЗаписиКурсовВалютРасчетЗависимых.РегистрСведенийНаборЗаписей.КурсыВалют.ПриЗаписи._РаботаСВалютамиВызовСервера) или используем существующий нетиповой модуль. Обязательно установим для него свойства «Сервер» и «Вызов сервера».Пропишем в модуле следующий код:
Процедура ПриЗаписиКурсовВалютРасчетЗависимыхПриЗаписи(Источник, Отказ) Экспорт
// Предотвращаем зацикливание при записи зависимой валюты
Если ПараметрыСеанса.Свойство("ИдетЗаписьЗависимогоКурса") И ПараметрыСеанса.ИдетЗаписьЗависимогоКурса Тогда
Возврат;
КонецЕсли;
// Определим базовую валюту (например, EUR, код 978)
КодБазовойВалюты = "978"; // Код евро
БазоваяВалюта = Справочники.Валюты.НайтиПоКоду(КодБазовойВалюты);
Если БазоваяВалюта.Пустая() Тогда
Возврат;
КонецЕсли;
// Найдем зависимую валюту "Евро + 1%"
// В реальной практике лучше использовать предопределенный элемент или поиск по коду/символьному коду
ЗависимаяВалюта = Справочники.Валюты.НайтиПоНаименованию("EUR+1%");
Если ЗависимаяВалюта.Пустая() Тогда
Возврат;
КонецЕсли;
ПроцентНаценки = 1; // 1% наценки
Коэффициент = 1 + (ПроцентНаценки / 100);
// Обходим набор записей, который записывается в данный момент
Для Каждого Запись Из Источник Цикл
// Если записывается курс нашей базовой валюты (Евро)
Если Запись.Валюта = БазоваяВалюта Тогда
// Запишем курс для зависимой валюты на ту же дату
ПараметрыСеанса.Вставить("ИдетЗаписьЗависимогоКурса", Истина);
Попытка
ЗаписатьЗависимыйКурс(Запись.Период, ЗависимаяВалюта, Запись.Курс * Коэффициент, Запись.Кратность);
Исключение
ОбщегоНазначения.СообщитьИнформациюПользователю("Ошибка записи зависимого курса: " + ОписаниеОшибки());
КонецПопытки;
ПараметрыСеанса.Вставить("ИдетЗаписьЗависимогоКурса", Ложь);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗаписатьЗависимыйКурс(ДатаКурса, ВалютаСсылка, НовыйКурс, Кратность)
МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ДатаКурса;
МенеджерЗаписи.Валюта = ВалютаСсылка;
// Округлим курс до 4 знаков после запятой, как принято в учете РФ
МенеджерЗаписи.Курс = Окр(НовыйКурс, 4);
МенеджерЗаписи.Кратность = Кратность;
МенеджерЗаписи.Записать(Истина); // Записываем с замещением существующей записи
КонецПроцедуры
Преимущества данного метода: Метод работает абсолютно прозрачно. Как только пользователь вручную меняет курс евро, загружает его через обработку РБК или импортирует из внешних систем — подписка мгновенно реагирует, рассчитывает значение «Евро + 1%» и делает запись в регистр сведений.
---
Если вы предпочитаете централизованно управлять загрузкой непосредственно в момент работы обработки РБК, можно внести изменения в саму обработку. В УПП за загрузку отвечает обработка ЗагрузкаКурсовВалют.
Проанализируем этот путь. Нам потребуется:
ЗаписатьКурсыВалют()).Пример модификации кода внутри обработки:
// ... Код типовой обработки записи курса основной валюты ...
ЗаписьКурса.Записать();
// Наша доработка:
Если ТекущаяВалюта = ВалютаЕвро Тогда
ЗаписьЗависимой = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
ЗаписьЗависимой.Период = ТекущаяДата;
ЗаписьЗависимой.Валюта = ВалютаЕвроПлюсПроцент;
ЗаписьЗависимой.Курс = Окр(ЗагруженныйКурсЕвро * 1.01, 4);
ЗаписьЗависимой.Кратность = КратностьЕвро;
ЗаписьЗависимой.Записать();
КонецЕсли;
Этот способ рабочий, но имеет недостаток: при каждом обновлении конфигурации УПП вам придется вручную контролировать изменения в данной обработке и заново переносить доработанный код.
---
При работе со старыми конфигурациями 1С класса УПП 1.2 / 1.3 важно сочетать методологическую корректность с красивыми техническими решениями. Создание отдельной условной валюты (например, EUR+1%) гарантирует точный расчет курсовых разниц в бухгалтерском учете в соответствии с ПБУ 3/2006.
Для автоматического наполнения регистра курсов наиболее предпочтительным и технологичным вариантом является подписка на событие записи регистра. Она сохраняет конфигурацию на поддержке и гарантирует, что курс у.е. всегда будет актуальным, независимо от того, каким способом был обновлен курс базовой валюты.