Уважаемые коллеги, рассмотрим одну из часто встречающихся проблем при обмене данными между конфигурациями 1С:Управление торговлей (УТ) и 1С:Бухгалтерия предприятия (БП) или 1С:Управление нашей фирмой (УНФ) и 1С:БП, а именно — расхождения в копейках в валютных документах, особенно в суммах НДС. Эти расхождения могут привести к серьезным проблемам с контролирующими органами, таким как ИФНС, поскольку они затрагивают книгу продаж и книгу покупок контрагентов. Давайте вместе разберемся в причинах этих расхождений и возможных путях их устранения.
Основная проблема заключается в том, что при синхронизации данных между УТ (или УНФ) и БП, суммы в валютных документах, которые были рассчитаны и проведены в одной базе, могут пересчитываться заново в базе-приемнике. Это часто приводит к отличиям в копейках из-за разных механизмов округления и логики распределения сумм по строкам. Разберем подробнее ключевые факторы, влияющие на эти расхождения:
Рассмотрим пример, который был описан коллегами. Допустим, у нас есть документ "Реализация товаров" в валюте. Общая сумма документа в рублях в УНФ может быть 11 199 531,35, а в БП — 11 199 531,34. Это расхождение в одну копейку обусловлено тем, что:
Даже если дать один и тот же исходный рублевый итог для распределения, из-за различий в алгоритмах строки будут иметь разные значения, что в итоге приводит к расхождению в общей сумме документа и, как следствие, в НДС.
Для глубокого понимания проблемы, рассмотрим код, который отвечает за расчеты взаиморасчетов и проведение документов в разных конфигурациях.
В модуле УчетВзаиморасчетов одной из конфигураций может использоваться следующий подход для расчета рублевого коэффициента и суммы:
КоэффициентРуб = ?(НЕ СтрокаДокумента.РасчетыВВалюте, 1, ?(СтрокаДокумента.СуммаВзаиморасчетов = 0, 0, СтрокаДокумента.СуммаРуб / СтрокаДокумента.СуммаВзаиморасчетов));
КонецЕсли;
СтрокаВзаиморасчетов.СуммаРуб = Окр(НераспределеннаяСумма * КоэффициентРуб, 2);
Здесь видно, что КоэффициентРуб вычисляется как отношение уже существующей рублевой суммы к валютной, а затем применяется к нераспределенной сумме с округлением до двух знаков.
В то же время, в модуле РасчетыПроведениеДокументов другой конфигурации (например, УНФ) может использоваться иная логика для расчета рублевой суммы движения:
Движение.Сумма = Движение.СуммаВал * ДополнительныеСвойства.КурсДокумента * ДополнительныеСвойства.КратностьВалютыУчета / (?(ДополнительныеСвойства.КратностьДокумента = 0, 1, ДополнительныеСвойства.КратностьДокумента) * ?(ДополнительныеСвойства.КурсВалютыУчета = 0, 1, ДополнительныеСвойства.КурсВалютыУчета));
Здесь рублевая сумма движения рассчитывается напрямую через валютную сумму, курс документа, кратность валюты учета и другие параметры, что может давать отличный результат при округлении, особенно если курс документа хранится с высокой точностью, а итоговая сумма затем округляется. Эти различия в логике и последовательности операций, а также в округлении, и приводят к тем самым "копеечным" расхождениям.
Поскольку проблема носит системный характер и признана разработчиками 1С, существует несколько подходов к ее решению. Некоторые из них временные или частичные, другие требуют более серьезной доработки.
В 1С:Бухгалтерии 3.0 мы можем изменить точность округления чисел. Эти настройки применяются к новым документам и потенциально могут помочь избежать расхождений при обмене с внешними системами. Однако для уже созданных документов, возможно, потребуется их перепроведение. Также мы можем настроить округление цен номенклатуры (например, до 0.10 коп.), но для весового товара это часто требует доработки кода.
Для списания мелких копеечных остатков, возникающих в валютных операциях, особенно на счетах расчетов (например, 60), мы можем использовать документ «Корректировка долга». Однако важно убедиться, что это не нарушает соответствие сальдо расчетов с контрагентом и допустимо с точки зрения учета.
Разработчики 1С осведомлены о данной проблеме и занимаются ее решением, о чем неоднократно сообщалось на форумах. Мы можем отслеживать новые релизы конфигураций и их описания, так как некоторые проблемы с некорректной выгрузкой документов при синхронизации могут быть ошибками конкретных релизов и исправляются в более новых версиях. Поддерживать конфигурации в актуальном состоянии — важная рекомендация.
Если официальные исправления не удовлетворяют нашим требованиям или мы не можем ждать, наиболее надежным решением является программная доработка. Рассмотрим шаги, которые мы можем предпринять:
РегистрНакопления.НДСПредъявленный, РегистрНакопления.РасчетыСКонтрагентами) и регистры сведений, которые хранят рублевые суммы документов. Например, можно скорректировать записи в регистре сведений с рублевыми суммами, чтобы они соответствовали эталонному расчету.КоэффициентРуб: Мы можем проанализировать и унифицировать расчет КоэффициентРуб, чтобы он был одинаковым в обеих конфигурациях. Например, если в УТ коэффициент считается одним образом, а в БП — другим, нам потребуется привести их к единому стандарту.Допустим, мы хотим, чтобы рублевые суммы в УТ (при передаче в БП) всегда соответствовали тому, как их рассчитает БП. Тогда мы можем:
Альтернативный подход (как было реализовано в одном из случаев): после загрузки документов в БП, специализированное расширение корректирует записи в регистрах накопления и сведений, выравнивая рублевые суммы (особенно НДС) по эталонному алгоритму БП. Этот подход может выглядеть следующим образом:
// Примерный псевдокод для расширения в БП после загрузки документа
Процедура ПослеЗагрузкиДокументаРеализация(ДокументСсылка) Экспорт
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
Если ДокументОбъект.Проведен Тогда
// Отменить движения, сделанные типовым проведением
ДокументОбъект.Движения.НДСПредъявленный.Очистить();
ДокументОбъект.Движения.РасчетыСКонтрагентами.Очистить();
// ... другие регистры
// Пересчитать НДС и другие рублевые суммы по строкам
// используя эталонный алгоритм БП или унифицированный
Для Каждого СтрокаТЧ Из ДокументОбъект.Товары Цикл
// Вычисление правильной рублевой суммы НДС для строки
ПравильныйНДСРуб = ВычислитьНДСПоЭталону(СтрокаТЧ.СуммаВал, СтрокаТЧ.СтавкаНДС, ДокументОбъект.Курс);
// Создание нового движения для регистра НДСПредъявленный
ДвижениеНДС = ДокументОбъект.Движения.НДСПредъявленный.Добавить();
ДвижениеНДС.СуммаБезНДС = ПравильнаяСуммаБезНДСРуб;
ДвижениеНДС.СуммаНДС = ПравильныйНДСРуб;
// ... заполнение остальных полей движения
КонецЦикла;
// Пересчитать и скорректировать общую сумму в регистрах взаиморасчетов
// ...
// Записать новые движения
ДокументОбъект.Движения.Записать();
КонецЕсли;
КонецПроцедуры
Функция ВычислитьНДСПоЭталону(СуммаВал, СтавкаНДС, Курс)
// Здесь должна быть логика расчета НДС, которая точно соответствует
// тому, как она рассчитывается в БП, или унифицированный алгоритм
// с учетом требуемого округления
СуммаРуб = Окр(СуммаВал * Курс, 2);
НДС = Окр(СуммаРуб * СтавкаНДС / 100, 2);
Возврат НДС;
КонецФункции
Важно помнить, что такая доработка требует тщательного тестирования и понимания внутренней структуры регистров и алгоритмов обеих конфигураций. Необходимо также настроить синхронизацию данных таким образом, чтобы приоритет данных отдавался одной из конфигураций (например, из УТ при выгрузке в БП), это может быть настроено в правилах обмена.
Для эффективного решения проблемы расхождений в копейках между конфигурациями мы рекомендуем следующее:
Таким образом, проблема расхождений в копейках в валютных документах при обмене между 1С:УТ и 1С:БП является сложной, но решаемой. Комплексный подход, включающий понимание причин, применение настроек и, при необходимости, программную доработку, поможет нам обеспечить точность учета и избежать проблем с контролирующими органами.