Почему пропали или задвоились предопределенные счета в 1С 8.3 и как это исправить?

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

При обслуживании распределенных информационных баз (РИБ) или переводе старых конфигураций (таких как «1С:Комплексная автоматизация 1.1» или «1С:Управление производственным предприятием 1.3») на платформу 8.3 администраторы и разработчики нередко сталкиваются с критической ситуацией. В режиме «1С:Предприятие» план счетов неожиданно двоится, у счетов накапливаются десятки пустых строк видов субконто, а после выполнения стандартного тестирования и исправления (ТиИ) счета и вовсе полностью исчезают из пользовательского интерфейса, очищая проводки в проведенных документах.

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

Выясняем причину: механизм предопределенных данных в 8.3 и разрыв РИБ

Проанализируем поведение платформы при работе с предопределенными объектами. Начиная с версии платформы 8.3, концепция хранения предопределенных элементов справочников и планов счетов претерпела существенные изменения:

  1. В отличие от платформы 8.2, где предопределенные элементы жестко связывались на уровне метаданных, в 8.3 они хранятся как физические записи в общих таблицах базы данных. Признак предопределенности определяется системным свойством ИмяПредопределенныхДанных.
  2. В распределенной информационной базе главный узел имеет режим обновления предопределенных данных UpdateAutomatically (обновлять автоматически), а подчиненные узлы функционируют в режиме DoNotUpdateAutomatically (не обновлять автоматически). Это исключает конфликты: подчиненный узел просто принимает готовые идентификаторы из главного узла через сообщения обмена.
  3. Если подчиненный узел отвязывают от РИБ (например, очищают главный узел с помощью вызова ПланыОбмена.УстановитьГлавныйУзел(Неопределено)), база теряет признак периферийной. При следующем старте или первой реструктуризации платформа переключает режим инициализации данных в автоматический.
  4. Платформа пытается сопоставить список предопределенных счетов из конфигуратора с записями в таблице базы данных. Если сопоставление по внутренним идентификаторам дает сбой, система создает новый дублирующий комплект предопределенных счетов.
  5. При повторной инициализации табличная часть ВидыСубконто у существующих счетов многократно перезаписывается: к исходным строкам добавляются пустые строки или копии видов субконто (вплоть до 10–16 строк на счетах 90 или 91).
  6. Последующий запуск процедуры «Тестирование и исправление» с проверкой логической и ссылочной целостности и установленным флагом «Очищать ссылки» воспринимает поврежденные внутренние связки как неразрешимые ошибки. В результате платформа удаляет дублирующиеся системные записи и зачищает ссылки на них во всех регистрах и документах. План счетов становится абсолютно пустым.

Способ 1. Восстановление из резервной копии и правильная отвязка от РИБ

Если после запуска ТиИ ссылки в документах уже зачистились, наиболее надежным и безопасным путем является возврат к резервной копии, сделанной до сбоя. Рассмотрим правильную последовательность действий при изменении топологии узлов:

  1. Восстановим копию базы данных до момента появления дублей и запуска тестирования.
  2. Если требуется перенести документы, созданные за период сбоя, воспользуемся универсальной выгрузкой и загрузкой данных XML или правилами обмена через обработку «Конвертация данных».
  3. Чтобы отключение от РИБ не спровоцировало автоматическое создание дублирующих счетов, запуск конфигуратора для реструктуризации необходимо производить с блокировкой обновления предопределенных данных.

Посмотрим на пример пакетной команды запуска конфигуратора с параметром /SetPredefinedDataUpdate:


"C:\Program Files\1cv8\8.3.X.XXXX\bin\1cv8.exe" DESIGNER /F "D:\Bases\MyBase" /N "Администратор" /P "Пароль" /SetPredefinedDataUpdate -DoNotUpdateAutomatically

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


УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(РежимОбновленияПредопределенныхДанных.НеОбновлятьАвтоматически);

Способ 2. Исправление задвоенного плана счетов без отката к копии

Если свежей резервной копии нет, а ТиИ еще не запускалось (или выполнялось на отдельной копии), устранить задвоение можно программным путем. Разберем по шагам алгоритм исправления:

  1. Программное снятие признака предопределенности у дублей. Платформа не позволяет напрямую пометить на удаление предопределенный счет. Чтобы обойти это ограничение, найдем дублирующий счет (у которого отсутствуют субконто или движения) и очистим его системный реквизит:
    
    СчетОбъект = ДубликатСчетаСсылка.ПолучитьОбъект();
    СчетОбъект.ИмяПредопределенныхДанных = "";
    СчетОбъект.Записать();
    
    После выполнения этого кода счет трансформируется в обычный пользовательский элемент.
  2. Замена ссылок и удаление лишних элементов. С помощью стандартной обработки «Поиск и замена дублей» перенаправим все возможные ссылки с отвязанного счета на оригинальный счет, после чего удалим ненужный элемент.
  3. Очистка поврежденных табличных частей видов субконто. У счетов, сохранивших движения, удалим лишние и пустые строки из табличной части видов субконто, приведя их в строгое соответствие с конфигурацией:
    
    СчетОбъект = СчетСсылка.ПолучитьОбъект();
    // Очищаем некорректно задвоенные строки
    Индекс = СчетОбъект.ВидыСубконто.Количество() - 1;
    Пока Индекс >= 0 Цикл
        СтрокаСубконто = СчетОбъект.ВидыСубконто[Индекс];
        Если Не ЗначениеЗаполнено(СтрокаСубконто.ВидСубконто) Тогда
            СчетОбъект.ВидыСубконто.Удалить(Индекс);
        КонецЕсли;
        Индекс = Индекс - 1;
    КонецЦикла;
    СчетОбъект.Записать();
    
  4. Использование инструментов БСП. Если в конфигурацию внедрена «Библиотека стандартных подсистем», запустим специализированную внешнюю обработку «Исправление предопределенных элементов» из состава инструментария БСП. Она автоматически сопоставляет идентификаторы метаданных с записями в таблицах информационной базы и восстанавливает корректные связи без потери аналитики.

Важное предостережение: никогда не запускайте процедуру «Тестирование и исправление» с опцией «Очищать ссылки» на рабочей базе при обнаружении дублей предопределенных данных. Любые диагностические и восстановительные манипуляции следует предварительно тестировать на резервной копии информационной базы.

← На главную