Как записать валютную сумму по не валютному счету в 1С

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

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

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

Анализ платформенного ограничения и причин ошибки

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

Это сделано для обеспечения целостности данных. Стандартные механизмы (например, регламентная операция переоценки валютных остатков или расчет курсовых разниц) опираются именно на этот признак. Если бы платформа позволяла записывать валютные суммы бесконтрольно, это привело бы к непредсказуемому поведению типовых отчетов и процедур закрытия месяца.

Попытка использовать программный метод записи с установленным флагом ОбменДанными.Загрузка = Истина может физически поместить данные в таблицу, но это "мина замедленного действия". При первом же перепроведении документа или попытке ручного редактирования записи пользователем система снова вызовет ошибку, либо просто обнулит "незаконные" данные.

Способ 1: Создание специализированных субсчетов

Проанализируем наиболее безопасный и методически верный путь — создание отдельных субсчетов. Если заказчику требуется вести учет товаров или взаиморасчетов в валюте только по одной организации, мы можем добавить в План счетов новые субсчета (например, 41.ВЛ вместо 41.01), для которых установим признак Валютный.

Преимущества этого метода:

  1. Изоляция данных: Остальные организации продолжат использовать стандартные счета без валютного учета, и их балансы не изменятся.
  2. Стандартная отчетность: Оборотно-сальдовая ведомость и другие отчеты будут корректно отображать валютные суммы "из коробки".
  3. Автоматизация: Типовые механизмы переоценки увидят эти счета и будут рассчитывать курсовые разницы автоматически.

Рассмотрим пример кода для подбора счета в зависимости от организации при создании документа:


Если Организация = Справочники.Организации.НайтиПоНаименованию("ВалютнаяФирма") Тогда
    СтрокаТовара.СчетУчета = ПланыСчетов.Хозрасчетный.ТоварыНаСкладахВалютный;
Иначе
    СтрокаТовара.СчетУчета = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
КонецЕсли;

Способ 2: Добавление пользовательского ресурса в Регистр Бухгалтерии

Если создание новых счетов по каким-то причинам невозможно (например, из-за огромного количества существующих алгоритмов, завязанных на конкретные коды счетов), мы можем рассмотреть вариант расширения структуры самого регистра бухгалтерии. Мы можем добавить новый ресурс, назовем его СуммаВВалютеУпр.

Этот ресурс не будет связан платформенной проверкой с признаком Валютный. Для реализации этого решения нам потребуется:

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

Рассмотрим, как может выглядеть заполнение такого ресурса программно:


Движение = НаборЗаписей.Добавить();
Движение.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
Движение.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками;
Движение.Сумма = 1000; // Сумма в гривне/рублях
// Заполняем наш кастомный ресурс
Движение.СуммаВВалютеУпр = 15; 
Движение.ВалютаУпр = Справочники.Валюты.НайтиПоКоду("840");

Важное замечание: При таком подходе стандартная ОСВ не покажет эти данные. Вам придется либо кастомизировать отчеты через СКД, либо создавать свои формы для анализа этих сумм.

Способ 3: Использование дополнительных регистров накопления

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

Мы создаем регистр ВалютныйУчетПоОрганизациям с измерениями Организация, Номенклатура, Валюта и ресурсом Сумма. При проведении бухгалтерского документа система делает запись и в бухгалтерию (в гривне), и в этот регистр (в валюте). Это полностью исключает риски нарушения целостности бухгалтерского учета и значительно упрощает обновление конфигурации.

Реализация механизмов переоценки

Если мы выбрали путь с добавлением собственных ресурсов (Способ 2), стандартная переоценка валюты их проигнорирует. Нам придется разработать собственный алгоритм закрытия месяца. Проанализируем логику такой процедуры:

  1. Программа должна собрать остатки по регистру бухгалтерии в разрезе нашего кастомного ресурса СуммаВВалютеУпр на конец периода.
  2. Получить актуальный курс валюты из регистра сведений КурсыВалют.
  3. Рассчитать рублевый/гривневый эквивалент и сравнить его с текущим остатком по ресурсу Сумма.
  4. Сформировать корректирующие проводки на сумму курсовой разницы.

Пример упрощенной логики расчета:


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

Выводы и рекомендации

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

Рекомендуемый порядок действий:

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

← На главную