Почему в бухгалтерских отчетах по рублевым счетам появляется валюта и как это исправить?

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

При объединении или переносе данных между информационными базами с помощью универсальной обработки ВыгрузкаЗагрузкаДанныхXML можно столкнуться с неприятной ситуацией: в стандартных бухгалтерских отчетах (например, в оборотно-сальдовой ведомости или карточке счета) по невалютным счетам (таким как 60.01, 60.02) внезапно появляются строки с показателем «Вал.». При этом договоры контрагентов оформлены в рублях, а в самих документах валюта отсутствует. Если документ перепровести в открытом периоде, строка пропадает, однако в закрытых периодах перепроведение документов строго запрещено. Разберем причины такого поведения платформы и способ пакетного исправления движений регистра бухгалтерии без нарушения границы последовательности.

Выясним причину появления валютных строк

Проанализируем механику работы регистра бухгалтерии платформы 1С:Предприятие. Поведение связано со следующими факторами:

  1. Особенности сериализации XML: В базе-источнике функциональная опция валютного учета могла быть выключена, либо счет не имел признака валютного учета. В СУБД для неактивных измерений и ресурсов хранится значение NULL. Однако универсальная выгрузка при сериализации объектов и последующей загрузке в базу-приемник, где валютный учет включен, может записать в измерение ВалютаДт или ВалютаКт пустую ссылку Справочники.Валюты.ПустаяСсылка() вместо системного значения NULL.
  2. Отключение проверок конфигурации: При загрузке данных XML свойство ОбменДанными.Загрузка устанавливается в значение Истина. Это отключает типовые обработчики перед записью наборов записей, и платформа не производит автоматическую очистку реквизитов, не привязанных к признаку учета счета. В результате пустые ссылки напрямую попадают в таблицы движений.
  3. Поведение виртуальных таблиц итогов: Виртуальные таблицы регистра бухгалтерии (например, Обороты или ОстаткиИОбороты) при расчете группировок обращаются к полям измерений. Если в строке движения измерение валюты содержит пустое ссылочное значение вместо NULL, система считает, что по данному невалютному счету зафиксирован валютный оборот, и выводит соответствующую строку показателя в отчет.

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

Пошаговый поиск проблемных документов через запрос

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


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|    Т.Регистратор КАК Документ,
|    Т.Счет КАК Счет,
|    Т.Ошибка КАК Ошибка
|ИЗ
|    (ВЫБРАТЬ РАЗЛИЧНЫЕ
|        Хозрасчетный.Регистратор КАК Регистратор,
|        Хозрасчетный.СчетДт КАК Счет,
|        ""Валюта Дт не NULL"" КАК Ошибка
|    ИЗ
|        РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|    ГДЕ
|        &ВалютаНеNULL = ИСТИНА
|        И (&ДатаНач = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
|            И &ДатаКон = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
|            ИЛИ Хозрасчетный.Период МЕЖДУ &ДатаНач И &ДатаКон)
|        И Хозрасчетный.СчетДт.Валютный = ЛОЖЬ
|        И НЕ Хозрасчетный.ВалютаДт ЕСТЬ NULL
|    
|    ОБЪЕДИНИТЬ ВСЕ
|    
|    ВЫБРАТЬ РАЗЛИЧНЫЕ
|        Хозрасчетный.Регистратор,
|        Хозрасчетный.СчетКт,
|        ""Валюта Кт не NULL""
|    ИЗ
|        РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|    ГДЕ
|        &ВалютаНеNULL = ИСТИНА
|        И (&ДатаНач = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
|            И &ДатаКон = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
|            ИЛИ Хозрасчетный.Период МЕЖДУ &ДатаНач И &ДатаКон)
|        И Хозрасчетный.СчетКт.Валютный = ЛОЖЬ
|        И НЕ Хозрасчетный.ВалютаКт ЕСТЬ NULL) КАК Т
|
|СГРУППИРОВАТЬ ПО
|    Т.Регистратор,
|    Т.Счет,
|    Т.Ошибка
|
|УПОРЯДОЧИТЬ ПО
|    Т.Регистратор";

Запрос.УстановитьПараметр("ДатаНач", НачалоДня(НачПериода));
Запрос.УстановитьПараметр("ДатаКон", КонецДня(КонПериода));
Запрос.УстановитьПараметр("ВалютаНеNULL", Истина);

РезультатЗапроса = Запрос.Выполнить();

Программное исправление проводок без перепроведения документов

Для исправления записей без изменения даты запрета загрузки и без сдвига последовательности проведения используем объект НаборЗаписей регистра бухгалтерии с установкой флага ОбменДанными.Загрузка = Истина. В цикле обхода строк проводок принудительно установим значение NULL для невалютных счетов.

Разберем подробнее процедуру пакетной обработки движений:


Процедура ИсправитьВалютныеОшибкиВПроводках(СписокДокументов)
    
    Для Каждого СтрДокумент Из СписокДокументов Цикл
        
        НЗ = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
        НЗ.Отбор.Регистратор.Установить(СтрДокумент.Документ);
        НЗ.Прочитать();
        
        ЕстьИзменения = Ложь;
        
        Для Каждого Запись_НЗ Из НЗ Цикл
            
            // Проверяем дебет проводки
            Если НЕ Запись_НЗ.СчетДт.Валютный 
                И ТипЗнч(Запись_НЗ.ВалютаДт) <> Тип("Null") Тогда
                
                Запись_НЗ.ВалютаДт = NULL;
                ЕстьИзменения = Истина;
            КонецЕсли;
            
            // Проверяем кредит проводки
            Если НЕ Запись_НЗ.СчетКт.Валютный 
                И ТипЗнч(Запись_НЗ.ВалютаКт) <> Тип("Null") Тогда
                
                Запись_НЗ.ВалютаКт = NULL;
                ЕстьИзменения = Истина;
            КонецЕсли;
            
        КонецЦикла; 
        
        Если ЕстьИзменения Тогда
            НЗ.ОбменДанными.Загрузка = Истина;
            НЗ.Записать();
        КонецЕсли;
        
    КонецЦикла;
    
    Сообщить("Обработка наборов записей успешно завершена.");
    
КонецПроцедуры

Обязательный шаг: пересчет итогов регистра бухгалтерии

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

Сделать это можно двумя путями:

  1. Через встроенный язык: Вызвать метод глобального пересчета итогов регистра: РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтоги();
  2. В режиме Конфигуратора: Открыть меню «Администрирование» → «Тестирование и исправление...», выбрать пункт «Пересчет итогов» и нажать кнопку «Выполнить».

После выполнения очистки записей в NULL и обновления итогов лишняя строка «Вал.» перестанет выводиться в оборотно-сальдовых ведомостях, а баланс и аналитика по счетам учета расчетов сохранят свою целостность.

← На главную