Динамическое обновление (в среде разработчиков также известное как «демоническое») — удобный механизм быстрого внесения изменений в рабочую базу 1С без выгона пользователей. Однако при затягивании в динамическое обновление структурных изменений метаданных (новые реквизиты, справочники, изменение типов полей) часто происходит сбой синхронизации кешей и служебных таблиц. В результате объект остается виден в дереве метаданных Конфигуратора, но исчезает из пользовательского интерфейса, а тестирование и исправление завершается аварийно с ошибкой вида: SDBL тип поля undefined не совместим с типом поля Fld....
Рассмотрим подробно причины возникновения этой проблемы и способы ее устранения — от безопасных штатных методов до прямого восстановления служебных таблиц СУБД MS SQL Server.
Проанализируем ситуацию, которая приводит к подобному поведению системы:
Fld10423) с описанием метаданных. Если метаданные повреждены или рассинхронизированы, платформа не может определить тип поля и считает его undefined.Config, DBSchema и бинарные параметры (в частности, dbnames в таблице Params). При сбое динамического обновления связь между реальными SQL-таблицами и их описанием рушится.Важное предупреждение: Перед выполнением любых операций с базами данных обязательно остановите службу сервера приложений 1С (1C:Enterprise 8.3 Server Agent) и сделайте полные резервные копии базы данных СУБД (дамп .bak)!
Если штатные средства не помогают, а откат всей базы данных на бэкап приводит к потере введенных за день документов, можно восстановить только конфигурационную часть информационной базы прямо на уровне СУБД. Этот метод эффективен, когда физические данные в рабочих таблицах не пострадали.
Разберем по шагам алгоритм действий:
ut-test).ut-test в рабочую базу (в примере — crm):
USE [crm]
GO
-- Очистка и замена таблицы ConfigSave
DELETE FROM [dbo].[ConfigSave]
GO
INSERT INTO [dbo].[ConfigSave]
SELECT * FROM [ut-test].[dbo].[Config]
GO
-- Очистка и замена таблицы _YearOffset
DELETE FROM [dbo].[_YearOffset]
GO
INSERT INTO [dbo].[_YearOffset]
SELECT * FROM [ut-test].[dbo].[_YearOffset]
GO
-- Очистка и замена основной конфигурации Config
DELETE FROM [dbo].[Config]
GO
INSERT INTO [dbo].[Config]
SELECT * FROM [ut-test].[dbo].[Config]
GO
-- Очистка и замена схемы базы DBSchema
DELETE FROM [dbo].[DBSchema]
GO
INSERT INTO [dbo].[DBSchema]
SELECT * FROM [ut-test].[dbo].[DBSchema]
GO
-- Очистка и замена служебных файлов Files
DELETE FROM [dbo].[Files]
GO
INSERT INTO [dbo].[Files]
SELECT * FROM [ut-test].[dbo].[Files]
GO
-- Очистка и замена версий информационных баз IBVersion
DELETE FROM [dbo].[IBVersion]
GO
INSERT INTO [dbo].[IBVersion]
SELECT * FROM [ut-test].[dbo].[IBVersion]
GO
-- Очистка и замена параметров Params (содержит dbnames)
DELETE FROM [dbo].[Params]
GO
INSERT INTO [dbo].[Params]
SELECT * FROM [ut-test].[dbo].[Params]
GO
После выполнения скрипта запускаем службу сервера 1С, заходим в Конфигуратор и обновляем конфигурацию базы данных уже в обычном (не динамическом) режиме.
Если лезть в СУБД нет возможности, но Конфигуратор открывается и дает вносить изменения, попробуем заставить платформу принудительно пересчитать карту соответствия типов DBSchema и dbnames.
Строка в любом справочнике.Иногда обойти зависший кэш динамического обновления помогает явный запуск Конфигуратора в монопольном режиме через командную строку с ключом запрета динамических изменений:
"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" DESIGNER /S "ServerName\BaseName" /N "Admin" /P "Password" /UpdateDBCfg -Dynamic-
Параметр -Dynamic- запрещает выполнение динамического обновления и заставляет платформу провести стандартное сопоставление метаданных.
Посмотрим на правила, соблюдение которых убережет базу от подобных повреждений: