Пропали субконто из ОСВ после обновления 1С: разбираем причины и восстанавливаем аналитику без перепроведения

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

После проведения очередного обновления конфигурации «1С:Предприятие» вы можете столкнуться с крайне неприятной технической проблемой: при формировании Оборотно-сальдовой ведомости (ОСВ) или анализа субконто полностью отсутствует аналитика. Общая сумма по счету отображается корректно, однако разрезы субконто остаются пустыми. При этом, если зайти непосредственно в документ и открыть его проводки (кнопка Дт/Кт), все движения присутствуют и аналитика в них заполнена. Если же попытаться обратиться к регистру бухгалтерии через запрос к виртуальным таблицам остатков и оборотов, или открыть сам регистр «Хозрасчетный» напрямую, субконто оказываются пустыми.

Перепроведение документов вручную или программно решает эту проблему, но в базах с большим объемом данных этот процесс может растянуться на многие часы или даже дни. В этой статье мы подробно разберем, почему возникает этот сбой на уровне СУБД, и рассмотрим альтернативные, гораздо более быстрые методы восстановления аналитики.

Выясняем техническую причину сбоя: почему «ломается» связь субконто

Для того чтобы выбрать наиболее эффективный метод лечения, нам необходимо проанализировать внутреннее устройство хранения данных 1С в СУБД (будь то MySQL, MS SQL Server или PostgreSQL). Платформа 1С хранит данные регистра бухгалтерии не в одной плоской таблице, а разделяет их на несколько связанных физических таблиц:

  1. Основная таблица движений (в СУБД обычно именуется как _AccRg): содержит общую информацию о проводках (регистратор, период, активность, счета дебета и кредита, суммы и валюты).
  2. Вспомогательная таблица значений субконто (обычно _AccRgED): в ней хранятся конкретные ссылки на объекты аналитики (контрагенты, договоры, номенклатура, статьи затрат) для каждой строки проводки.

Связь между этими таблицами осуществляется по внутренним уникальным идентификаторам. Когда мы формируем Оборотно-сальдовую ведомость или делаем запрос к виртуальным таблицам (РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты), платформа выполняет SQL-соединение (JOIN) основной таблицы и таблицы субконто.

Сбой происходит при некорректном обновлении Плана счетов или Плана видов характеристик «Виды субконто». Если во время обновления конфигурации базы данных были сняты флаги сопоставления или производилось объединение конфигураций с некорректными приоритетами (например, при переходе с сильно кастомизированных старых редакций), уникальные идентификаторы (UUID) предопределенных счетов или видов субконто в метаданных заменяются на новые.

В результате СУБД теряет логическую связь между существующими физическими записями субконто в таблице _AccRgED и обновленным описанием метаданных в конфигурации. Платформа начинает считать эти субконто «несуществующими» для данных счетов. SQL-запрос при соединении таблиц возвращает пустое значение (NULL). При этом в форме Дт/Кт самого документа данные могут отображаться корректно, так как они считываются напрямую из объектного кэша или набора записей конкретного регистратора, который еще не был перезаписан в базе данных.

Решение 1: Быстрая программная перезапись наборов записей

Полноценное перепроведение документов запускает сложные алгоритмы бизнес-логики: проверку остатков на складах, расчет себестоимости, проведение по другим регистрам накопления и т.д. Чтобы избежать этих временных затрат, мы можем выполнить только перезапись движений по регистру бухгалтерии. При этом данные будут считаны из кэша объектной модели 1С и принудительно записаны в СУБД с восстановлением всех внутренних связей.

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


Процедура ВосстановитьСубконтоНажатием(Кнопка)
    
    // Определяем период, за который пропала аналитика
    НачалоПериода = НачалоДня(Объект.ПериодРегистрацииС);
    КонецПериода  = КонецДня(Объект.ПериодРегистрацииПо);
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |	ХозрасчетныйДвижения.Регистратор КАК Регистратор
        |ИЗ
        |	РегистрБухгалтерии.Хозрасчетный КАК ХозрасчетныйДвижения
        |ГДЕ
        |	ХозрасчетныйДвижения.Период МЕЖДУ &НачалоПериода И &КонецПериода";
    
    Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
    Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Сообщить("Движения за указанный период не найдены.");
        Возврат;
    КонецЕсли;
    
    Выборка = РезультатЗапроса.Выполнить();
    Пока Выборка.Следующий() Цикл
        
        // Создаем набор записей по конкретному регистратору
        НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
        
        Попытка
            // Читаем движения из базы (платформа корректно сопоставит значения)
            НаборЗаписей.Прочитать();
            
            // Записываем набор обратно с заменой существующих записей
            НаборЗаписей.Записать(Истина);
        Исключение
            Сообщить("Не удалось перезаписать движения по документу: " + Строка(Выборка.Регистратор) + ". Ошибка: " + ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;
    
    Сообщить("Процесс восстановления аналитики успешно завершен!");
    
КонецПроцедуры

Этот способ работает в 10–50 раз быстрее, чем стандартное перепроведение документов, поскольку база данных избавляется от необходимости проводить сложные математические расчеты и проверки ограничений в модулях проведения документов.

Решение 2: Принудительная реструктуризация таблиц регистра через Конфигуратор

Если документов в базе слишком много и даже программная перезапись занимает длительное время, мы можем заставить саму платформу перестроить физические таблицы СУБД и восстановить их индексы. Для этого используется механизм принудительной реструктуризации.

Разберем по шагам, как выполнить эту операцию:

  1. Откройте базу данных в режиме Конфигуратор.
  2. Найдите в дереве метаданных проблемный регистр (например, РегистрБухгалтерии.Хозрасчетный).
  3. Внесите незначительное изменение в свойства регистра. Например, можно временно изменить длину синонима регистра, добавить несущественный вспомогательный реквизит с типом Число или увеличить длину какого-либо текстового реквизита на один символ.
  4. Нажмите клавишу F7 (или выберите «Конфигурация — Обновить конфигурацию базы данных»). Платформа обнаружит изменение структуры и запустит полную физическую реструктуризацию таблиц данного регистра на уровне СУБД. В ходе этого процесса SQL-таблицы будут пересозданы, а связи между ними пересчитаны заново.
  5. После успешного завершения обновления верните измененное свойство регистра в исходное состояние и повторно обновите конфигурацию кнопкой F7.

Решение 3: Использование встроенной обработки обновления записей

При переходе между релизами разработчики типовых решений часто предусматривают возникновение подобных проблем и внедряют специализированные процедуры обновления. В составе типовых конфигураций (например, «Бухгалтерия для Казахстана» или «Бухгалтерия предприятия») имеется встроенный механизм обновления записей регистра.

Для запуска этого механизма мы можем использовать стандартную обработку ОбновлениеИнформационнойБазы или запустить встроенную обработку «Обновление записей по Хозрасчетный». Данная обработка точечно анализирует записи в таблицах регистра бухгалтерии, находит «битые» связи с субконто (где тип значения в таблице СУБД перестал соответствовать описанию метаданных) и автоматически перезаписывает только поврежденные записи, не затрагивая корректные проводки.

Решение 4: Профилактика проблемы — правильное сопоставление метаданных при обновлении

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

Решение 5: Тестирование и исправление (ТИИ)

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

Запустите режим Тестирование и исправление в Конфигураторе и выберите следующие опции:

  1. Реиндексация таблиц информационной базы: полностью перестроит индексы всех физических таблиц СУБД, включая таблицы связи субконто.
  2. Проверка логической целостности: выявит некорректные ссылки и связи в таблицах.
  3. Пересчет итогов: принудительно очистит и заново рассчитает таблицы остатков и оборотов регистра бухгалтерии, что позволит виртуальным таблицам снова видеть восстановленные значения субконто.

Для файловых баз перед проведением ТИИ также настоятельно рекомендуется запустить внешнюю утилиту проверки физической целостности файла базы данных chdbfl.exe, которая находится в каталоге установленной платформы «1С:Предприятие».

← На главную