При формировании оборотно-сальдовой ведомости (ОСВ) по счету 70 бухгалтеры и разработчики нередко сталкиваются с ситуацией, когда в отчете появляются дубли, непонятные физлица с суффиксами (например, «Иванов1») или записи, которые отсутствуют в справочнике ФизическиеЛица. При попытке расшифровать строку открываются документы совершенно другого сотрудника либо выдается ошибка объекта.
Разберем детально, почему возникает данная проблема, как локализовать ошибочные данные и как корректно устранить битые ссылки без проведения глобального тестирования и исправления всей информационной базы.
Проанализируем основные технические факторы, приводящие к появлению некорректных строк в оборотно-сальдовой ведомости:
Сотрудники (например, при повторном приеме, внутреннем совместительстве). Если в отчете или настройках счета перепутаны типы субконто, система отображает представление элемента сотрудника, а не физлица.Справочник.Сотрудники на Справочник.ФизическиеЛица), в старых проводках регистра бухгалтерии остаются ссылки прежнего типа. Платформа 1С не очищает исторические движения автоматически при редактировании плана счетов.Разберем по шагам, как найти конкретный документ, породивший ошибочную запись в отчете:
Выясним, чем именно является значение в субконто проводки — битой ссылкой или ссылкой на другой справочник. Для этого выполним запрос к регистру бухгалтерии:
ВЫБРАТЬ
ХозрасчетныйДвижения.Регистратор КАК Регистратор,
ХозрасчетныйДвижения.Период КАК Период,
ХозрасчетныйДвижения.СубконтоДт1 КАК СубконтоДт1,
ТИПЗНАЧЕНИЯ(ХозрасчетныйДвижения.СубконтоДт1) КАК ТипСубконтоДт,
ВЫБОР
КОГДА ХозрасчетныйДвижения.СубконтоДт1.Ссылка ЕСТЬ NULL ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ЭтоБитаяСсылка
ИЗ
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвижения
ГДЕ
ХозрасчетныйДвижения.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда)
И ХозрасчетныйДвижения.СубконтоДт1 ССЫЛКА Справочник.Сотрудники
Посмотрим на результат выполнения запроса: если поле ЭтоБитаяСсылка возвращает значение ИСТИНА, значит, объект физически удален из базы. Если ТипСубконтоДт указывает на Справочник.Сотрудники, значит, в проводку записан элемент не того справочника.
Если в проводках документов проблемной записи нет, но в ОСВ она упорно отображается, выполним пересчет итогов:
Если ссылка была физически удалена и стала битой, восстановим элемент справочника с тем же самым уникальным идентификатором. Это вернет объект в базу и позволит корректно объединить его с нужным физлицом:
// Получаем УИД битой ссылки из проводки или запроса
СтрокаГУИД = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
НовыйИД = Новый УникальныйИдентификатор(СтрокаГУИД);
// Формируем ссылку и создаем элемент
СсылкаНаОбъект = Справочники.ФизическиеЛица.ПолучитьСсылку(НовыйИД);
НовыйЭлемент = Справочники.ФизическиеЛица.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(СсылкаНаОбъект);
НовыйЭлемент.Наименование = "Восстановленный Иванов";
НовыйЭлемент.Записать();
После выполнения данного кода битая ссылка превращается в полноценный элемент справочника ФизическиеЛица. Далее воспользуемся типовой обработкой Поиск и удаление дублей (раздел Администрирование — Обслуживание — Корректировка данных) и объединим восстановленный элемент с правильной карточкой физлица.
Если перепроведение документов за прошлые закрытые периоды запрещено, заменим субконто напрямую в наборе записей регистра бухгалтерии:
ПравильноеФизЛицо = Справочники.ФизическиеЛица.НайтиПоНаименованию("Иванов Иван Иванович");
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
НаборЗаписей.Прочитать();
БылИзменен = Ложь;
Для Каждого Запись Из НаборЗаписей Цикл
Если Запись.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда Тогда
Если Запись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ФизическиеЛица] = БитаяСсылка Тогда
Запись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ФизическиеЛица] = ПравильноеФизЛицо;
БылИзменен = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если БылИзменен Тогда
// Отключаем обмен данными для записи в закрытый период при необходимости
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
КонецЕсли;
ЗначениеЗаполнено(Субконто) и проверки метаданных.