Как устранить битые ссылки и фантомные записи субконто в ОСВ по счету 70

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

При формировании оборотно-сальдовой ведомости (ОСВ) по счету 70 бухгалтеры и разработчики нередко сталкиваются с ситуацией, когда в отчете появляются дубли, непонятные физлица с суффиксами (например, «Иванов1») или записи, которые отсутствуют в справочнике ФизическиеЛица. При попытке расшифровать строку открываются документы совершенно другого сотрудника либо выдается ошибка объекта.

Разберем детально, почему возникает данная проблема, как локализовать ошибочные данные и как корректно устранить битые ссылки без проведения глобального тестирования и исправления всей информационной базы.

Причины возникновения проблемы

Проанализируем основные технические факторы, приводящие к появлению некорректных строк в оборотно-сальдовой ведомости:

  1. Путаница между справочниками «Сотрудники» и «Физические лица». В типовых конфигурациях учет расчетов с персоналом может быть привязан как к физическим лицам, так и к сотрудникам (трудовым договорам). Один человек (физическое лицо) может иметь несколько элементов в справочнике Сотрудники (например, при повторном приеме, внутреннем совместительстве). Если в отчете или настройках счета перепутаны типы субконто, система отображает представление элемента сотрудника, а не физлица.
  2. Смена типа субконто на счете в процессе эксплуатации. Если на счете 70 субконто было изменено пользователем или обновлением (например, с типа Справочник.Сотрудники на Справочник.ФизическиеЛица), в старых проводках регистра бухгалтерии остаются ссылки прежнего типа. Платформа 1С не очищает исторические движения автоматически при редактировании плана счетов.
  3. Физическое удаление объекта из базы (битая ссылка). Если элемент справочника был удален непосредственным удалением или внешней обработкой в обход контроля ссылочной целостности, в проводках и таблицах итогов остается «объект не найден» с GUID удаленной записи.
  4. Рассинхронизация таблиц итогов регистра бухгалтерии. Отчет ОСВ строится по виртуальной таблице остатков и оборотов (таблице итогов), а расшифровка обращается к физической таблице движений. Если итоги сбиты, в отчете отображаются несуществующие фантомы.
  5. Включенный режим ручной корректировки. Если в документе-регистраторе включен флаг ручного редактирования движений, при изменении реквизитов документа его проводки не пересчитываются и сохраняют старые значения субконто.

Шаг 1. Локализация проблемного документа-регистратора

Разберем по шагам, как найти конкретный документ, породивший ошибочную запись в отчете:

  1. Сформируем отчет Оборотно-сальдовая ведомость по счету с максимальной детализацией по периоду (по дням) и с группировкой по регистратору.
  2. Методом половинного деления периода выявим точную дату, когда появляется первое сальдо или оборот по проблемному значению.
  3. Откроем карточку счета 70 за найденный день, чтобы увидеть документ-регистратор и конкретную проводку.
  4. Проверим наличие флага Ручная корректировка (ручное редактирование движений) в документе. Если проводки были исправлены вручную, обычное перепроведение не поможет — потребуется либо отключить ручную корректировку, либо вручную исправить субконто в таблице проводок.

Шаг 2. Проверка типа данных и GUID через консоль запросов

Выясним, чем именно является значение в субконто проводки — битой ссылкой или ссылкой на другой справочник. Для этого выполним запрос к регистру бухгалтерии:


ВЫБРАТЬ
    ХозрасчетныйДвижения.Регистратор КАК Регистратор,
    ХозрасчетныйДвижения.Период КАК Период,
    ХозрасчетныйДвижения.СубконтоДт1 КАК СубконтоДт1,
    ТИПЗНАЧЕНИЯ(ХозрасчетныйДвижения.СубконтоДт1) КАК ТипСубконтоДт,
    ВЫБОР
        КОГДА ХозрасчетныйДвижения.СубконтоДт1.Ссылка ЕСТЬ NULL ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК ЭтоБитаяСсылка
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвижения
ГДЕ
    ХозрасчетныйДвижения.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда)
    И ХозрасчетныйДвижения.СубконтоДт1 ССЫЛКА Справочник.Сотрудники

Посмотрим на результат выполнения запроса: если поле ЭтоБитаяСсылка возвращает значение ИСТИНА, значит, объект физически удален из базы. Если ТипСубконтоДт указывает на Справочник.Сотрудники, значит, в проводку записан элемент не того справочника.

Шаг 3. Методы устранения проблемы

Вариант 1. Пересчет итогов регистра бухгалтерии

Если в проводках документов проблемной записи нет, но в ОСВ она упорно отображается, выполним пересчет итогов:

  1. Перейдем в главное меню: Функции для технического специалиста (или «Все функции»).
  2. Откроем пункт Управление итогами.
  3. Выберем нужный регистр бухгалтерии и выполним полный пересчет итогов.

Вариант 2. Программное восстановление удаленного элемента по GUID

Если ссылка была физически удалена и стала битой, восстановим элемент справочника с тем же самым уникальным идентификатором. Это вернет объект в базу и позволит корректно объединить его с нужным физлицом:


// Получаем УИД битой ссылки из проводки или запроса
СтрокаГУИД = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
НовыйИД = Новый УникальныйИдентификатор(СтрокаГУИД);

// Формируем ссылку и создаем элемент
СсылкаНаОбъект = Справочники.ФизическиеЛица.ПолучитьСсылку(НовыйИД);
НовыйЭлемент = Справочники.ФизическиеЛица.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(СсылкаНаОбъект);
НовыйЭлемент.Наименование = "Восстановленный Иванов";
НовыйЭлемент.Записать();

После выполнения данного кода битая ссылка превращается в полноценный элемент справочника ФизическиеЛица. Далее воспользуемся типовой обработкой Поиск и удаление дублей (раздел Администрирование — Обслуживание — Корректировка данных) и объединим восстановленный элемент с правильной карточкой физлица.

Вариант 3. Программная замена битых ссылок в наборах записей

Если перепроведение документов за прошлые закрытые периоды запрещено, заменим субконто напрямую в наборе записей регистра бухгалтерии:


ПравильноеФизЛицо = Справочники.ФизическиеЛица.НайтиПоНаименованию("Иванов Иван Иванович");

НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
НаборЗаписей.Прочитать();

БылИзменен = Ложь;
Для Каждого Запись Из НаборЗаписей Цикл
    Если Запись.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда Тогда
        Если Запись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ФизическиеЛица] = БитаяСсылка Тогда
            Запись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ФизическиеЛица] = ПравильноеФизЛицо;
            БылИзменен = Истина;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Если БылИзменен Тогда
    // Отключаем обмен данными для записи в закрытый период при необходимости
    НаборЗаписей.ОбменДанными.Загрузка = Истина;
    НаборЗаписей.Записать();
КонецЕсли;

Рекомендации по предотвращению ошибок

  1. Не удаляйте объекты напрямую: всегда используйте штатную процедуру Пометить на удаление и обработку Удаление помеченных объектов с обязательной проверкой ссылочной целостности.
  2. Контролируйте составные типы субконто: при программном заполнении проводок строго проверяйте тип передаваемого объекта с помощью конструкции ЗначениеЗаполнено(Субконто) и проверки метаданных.
  3. Очищайте клиентский кэш: в редких случаях отображение некорректного представления связано с локальным кэшем платформы 1С.
← На главную