В процессе разработки и сопровождения конфигураций на платформе 1С:Предприятие 8 часто возникают ситуации, когда стандартная логика системы вступает в противоречие со специфическими требованиями бизнеса. Одной из таких задач является необходимость ведения валютного учета на счетах, которые изначально для этого не предназначены. Например, когда в одной базе ведется учет по нескольким организациям, и только для одной из них требуется детализация в иностранной валюте, в то время как включение признака Валютный в Плане счетов повлияет на все организации сразу.
В данной статье мы подробно разберем, почему платформа блокирует такие операции, и рассмотрим наиболее эффективные архитектурные решения для обхода этого ограничения.
При попытке записать валютную сумму в проводку (набор записей регистра бухгалтерии) по счету, у которого не установлен флаг Валютный в Плане счетов, система выдает ошибку. Давайте разберем, почему это происходит. На уровне платформы 1С реализована жесткая валидация: ресурс ВалютнаяСумма регистра бухгалтерии неразрывно связан с признаком учета Валютный. Если этот признак у счета отсутствует, платформа считает запись некорректной и блокирует ее сохранение в базе данных.
Это сделано для обеспечения целостности данных. Стандартные механизмы (например, регламентная операция переоценки валютных остатков или расчет курсовых разниц) опираются именно на этот признак. Если бы платформа позволяла записывать валютные суммы бесконтрольно, это привело бы к непредсказуемому поведению типовых отчетов и процедур закрытия месяца.
Попытка использовать программный метод записи с установленным флагом ОбменДанными.Загрузка = Истина может физически поместить данные в таблицу, но это "мина замедленного действия". При первом же перепроведении документа или попытке ручного редактирования записи пользователем система снова вызовет ошибку, либо просто обнулит "незаконные" данные.
Проанализируем наиболее безопасный и методически верный путь — создание отдельных субсчетов. Если заказчику требуется вести учет товаров или взаиморасчетов в валюте только по одной организации, мы можем добавить в План счетов новые субсчета (например, 41.ВЛ вместо 41.01), для которых установим признак Валютный.
Преимущества этого метода:
Рассмотрим пример кода для подбора счета в зависимости от организации при создании документа:
Если Организация = Справочники.Организации.НайтиПоНаименованию("ВалютнаяФирма") Тогда
СтрокаТовара.СчетУчета = ПланыСчетов.Хозрасчетный.ТоварыНаСкладахВалютный;
Иначе
СтрокаТовара.СчетУчета = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
КонецЕсли;
Если создание новых счетов по каким-то причинам невозможно (например, из-за огромного количества существующих алгоритмов, завязанных на конкретные коды счетов), мы можем рассмотреть вариант расширения структуры самого регистра бухгалтерии. Мы можем добавить новый ресурс, назовем его СуммаВВалютеУпр.
Этот ресурс не будет связан платформенной проверкой с признаком Валютный. Для реализации этого решения нам потребуется:
СуммаВВалютеУпр (тип Число) в регистр бухгалтерии.ВалютаУпр (тип СправочникСсылка.Валюты), чтобы знать, в какой валюте сделана запись.Рассмотрим, как может выглядеть заполнение такого ресурса программно:
Движение = НаборЗаписей.Добавить();
Движение.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
Движение.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками;
Движение.Сумма = 1000; // Сумма в гривне/рублях
// Заполняем наш кастомный ресурс
Движение.СуммаВВалютеУпр = 15;
Движение.ВалютаУпр = Справочники.Валюты.НайтиПоКоду("840");
Важное замечание: При таком подходе стандартная ОСВ не покажет эти данные. Вам придется либо кастомизировать отчеты через СКД, либо создавать свои формы для анализа этих сумм.
Выясним, действительно ли эти валютные суммы должны находиться именно в бухгалтерских проводках. Часто заказчику валютный эквивалент нужен лишь для управленческого анализа или оперативного контроля. В этом случае лучшим решением будет использование отдельного регистра накопления.
Мы создаем регистр ВалютныйУчетПоОрганизациям с измерениями Организация, Номенклатура, Валюта и ресурсом Сумма. При проведении бухгалтерского документа система делает запись и в бухгалтерию (в гривне), и в этот регистр (в валюте). Это полностью исключает риски нарушения целостности бухгалтерского учета и значительно упрощает обновление конфигурации.
Если мы выбрали путь с добавлением собственных ресурсов (Способ 2), стандартная переоценка валюты их проигнорирует. Нам придется разработать собственный алгоритм закрытия месяца. Проанализируем логику такой процедуры:
СуммаВВалютеУпр на конец периода.КурсыВалют.Сумма.Пример упрощенной логики расчета:
КурсНаДату = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ДатаЗакрытия, Новый Структура("Валюта", ВалютаУчета)).Курс;
ОжидаемаяСуммаВВалюте = ОстатокПоСчетуВРублях / КурсНаДату;
КурсоваяРазница = ОжидаемаяСуммаВВалюте - ОстатокПоРесурсуВалютаУпр;
// Далее следует запись разницы в регистр
Подводя итог, можно сказать, что технически "запихнуть" валютную сумму в невалютный счет через платформенный ресурс ВалютнаяСумма практически невозможно без критического вреда для системы.
Рекомендуемый порядок действий:
Помните, что любые манипуляции с планом счетов и регистрами бухгалтерии требуют тщательного тестирования на копии базы, так как они напрямую влияют на финансовый результат и формирование налоговой отчетности.