При обновлении конфигурации базы данных на платформе 1С:Предприятие разработчики и администраторы нередко сталкиваются со сбоем реструктуризации, сопровождающимся сообщением: «В схеме базы данных отсутствует таблица DocumentChngR[номер]». Ситуация осложняется тем, что типовые средства тестирования и исправления завершаются аварийно, а попытки вручную создать пустую таблицу в СУБД средствами SQL не дают результата. Проанализируем природу этой ошибки, выясним, за что отвечает данная таблица, и подробно разберем по шагам действенные способы восстановления работоспособности базы данных.
Для понимания корня проблемы разберем внутреннее устройство платформы. Имя таблицы с префиксом DocumentChngR указывает на то, что это вспомогательная таблица регистрации изменений для конкретного объекта метаданных типа «Документ», включенного в состав одного или нескольких планов обмена. Числовой идентификатор в конце имени (например, 35788) представляет собой внутренний уникальный номер объекта метаданных в конфигурации базы данных.
Ошибка генерируется не самой СУБД (PostgreSQL, MS SQL Server и др.), а внутренним уровнем трансляции запросов платформы 1С — механизмом SDBL (Simple Data Base Language). Платформа 1С хранит внутреннее описание структуры базы данных в специальной двоичной схеме DBSchema (в таблице Params СУБД). При обновлении конфигурации платформа сравнивает исходную схему, метаданные новой конфигурации и физические таблицы в СУБД. Если в результате некорректных динамических обновлений, резкой смены режима совместимости конфигурации или скачка через несколько релизов нарушается целостность схемы DBSchema, SDBL пытается обратиться к описанию таблицы регистрации изменений, которого во внутренней схеме уже или еще нет. Именно поэтому прямое создание физической таблицы в СУБД через SQL Management Studio не помогает: механизм SDBL не находит запись об объекте в метаописании 1С.
Прежде чем исправлять метаданные, выясним, какому именно документу принадлежит идентификатор из текста ошибки. В рабочей конфигурации, где таблица уже исключена из схемы, штатная функция ПолучитьСтруктуруХраненияБазыДанных() в обычном режиме может ничего не вернуть, поэтому используем параметр расширенного получения сведений.
Посмотрим на пример программного кода, который запускается во внешней обработке в режиме «1С:Предприятие» для поиска проблемного объекта:
ЧтоИщем = "_DocumentChngR35788";
СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Для Каждого Таблица Из СтруктураХранения Цикл
Если Таблица.ИмяТаблицыХранения = ЧтоИщем Тогда
Сообщить("Имя таблицы: " + Таблица.ИмяТаблицы + " (метаданные: " + Таблица.Метаданные + ", назначение: " + Таблица.Назначение + ")");
Прервать;
КонецЕсли;
КонецЦикла;
Если код не вернул результат в текущей базе, развернем архивную копию базы (до попытки обновления) либо промежуточную тестовую базу и выполним поиск там. Альтернативный способ диагностики — выгрузить конфигурацию в файлы XML через меню «Конфигурация — Выгрузить конфигурацию в файлы...» и выполнить глобальный поиск числа 35788 по содержимому каталога. Это позволит точно узнать имя документа.
Рассмотрим основной прикладной способ решения, не требующий прямого вмешательства в базу данных на уровне SQL. Так как сбой возникает при попытке реструктуризации таблиц регистрации изменений, рассинхронизацию можно снять путем временного вывода объекта из состава планов обмена:
ПланОбмена, в состав которых входит данный документ.Если конфигуратор аварийно завершил работу во время обновления, в служебных таблицах СУБД фиксируется состояние незавершенной транзакции реструктуризации. Проанализируем, как сбросить зависшие данные.
Обязательно создадим полную резервную копию базы данных средствами СУБД перед выполнением следующих действий:
1C:Enterprise 8.3 Server Agent.C:\Program Files\1cv8\srvinfo\...) удалим временные папки с префиксами snacc.
DELETE FROM ConfigSave;
Это действие возвращает конфигуратор к последней стабильно зафиксированной конфигурации базы данных.В случаях, когда повреждение структуры вызвано последствиями динамических обновлений, в служебной таблице Params накапливается устаревшее описание схемы. Разберем процедуру принудительного перестроения схемы:
DELETE FROM Params WHERE FileName = 'DBSchema';
DBSchema и выполнит полное сканирование текущих объектов метаданных, заново генерируя корректное описание внутренней структуры.Если ошибка возникла при попытке обновить информационную базу сразу через несколько релизов («пакетное обновление»), критически важно изменить подход к обновлению. В различных релизах типовых конфигураций может изменяться режим совместимости (например, переход с версии 8.3.14 на 8.3.17). При пропуске промежуточных релизов платформа не успевает выполнить процедуры переноса данных версионирования и регистрации изменений.
Разберем правильный порядок действий:
Для гарантированного исключения проблем с динамическим обновлением применим запуск обновления конфигурации базы данных через командную строку с ключом монопольной реструктуризации:
1cv8.exe DESIGNER /S "ИмяСервера\ИмяБазы" /UpdateDBCfg -Dynamic-
Параметр -Dynamic- запрещает использование механизма фонового обновления и форсирует прямое применение структуры данных, что сводит к минимуму риск рассинхронизации таблиц планов обмена.