При объединении или переносе данных между информационными базами с помощью универсальной обработки ВыгрузкаЗагрузкаДанныхXML можно столкнуться с неприятной ситуацией: в стандартных бухгалтерских отчетах (например, в оборотно-сальдовой ведомости или карточке счета) по невалютным счетам (таким как 60.01, 60.02) внезапно появляются строки с показателем «Вал.». При этом договоры контрагентов оформлены в рублях, а в самих документах валюта отсутствует. Если документ перепровести в открытом периоде, строка пропадает, однако в закрытых периодах перепроведение документов строго запрещено. Разберем причины такого поведения платформы и способ пакетного исправления движений регистра бухгалтерии без нарушения границы последовательности.
Проанализируем механику работы регистра бухгалтерии платформы 1С:Предприятие. Поведение связано со следующими факторами:
NULL. Однако универсальная выгрузка при сериализации объектов и последующей загрузке в базу-приемник, где валютный учет включен, может записать в измерение ВалютаДт или ВалютаКт пустую ссылку Справочники.Валюты.ПустаяСсылка() вместо системного значения NULL.ОбменДанными.Загрузка устанавливается в значение Истина. Это отключает типовые обработчики перед записью наборов записей, и платформа не производит автоматическую очистку реквизитов, не привязанных к признаку учета счета. В результате пустые ссылки напрямую попадают в таблицы движений.Обороты или ОстаткиИОбороты) при расчете группировок обращаются к полям измерений. Если в строке движения измерение валюты содержит пустое ссылочное значение вместо 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;
ЕстьИзменения = Истина;
КонецЕсли;
КонецЦикла;
Если ЕстьИзменения Тогда
НЗ.ОбменДанными.Загрузка = Истина;
НЗ.Записать();
КонецЕсли;
КонецЦикла;
Сообщить("Обработка наборов записей успешно завершена.");
КонецПроцедуры
После прямой перезаписи наборов записей с флагом загрузки таблицы агрегированных итогов регистра могут сохранить старые связки с пустыми валютными значениями. Чтобы отчеты начали корректно отображать данные, необходимо актуализировать итоги.
Сделать это можно двумя путями:
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтоги();
После выполнения очистки записей в NULL и обновления итогов лишняя строка «Вал.» перестанет выводиться в оборотно-сальдовых ведомостях, а баланс и аналитика по счетам учета расчетов сохранят свою целостность.