Как исправить ошибку SDBL «Тип поля несовместим с типом поля» и «Поле ID не содержится в разделе FROM» при обновлении 1С:ERP

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

Обновление крупных конфигураций, таких как 1С:ERP Управление предприятием или 1С:Комплексная автоматизация, нередко преподносит неприятные сюрпризы системным администраторам и разработчикам. Особенно критичными являются ошибки уровня СУБД и транслятора SDBL, которые прерывают обновление информационной базы на «самом интересном месте» — во время выполнения отложенных или системных обработчиков обновления.

В этой статье мы подробно разберем, как победить взаимосвязанный комплекс ошибок: зависание конфигуратора при реструктуризации таблиц, ошибку SDBL Тип поля 21:00000000000000000000000000000000 несовместим с типом поля Fld62825, а также ее «эхо» в режиме Предприятия — Таблица или поле ID не содержится в разделе FROM.

Причина возникновения ошибок SDBL при обновлении

Для начала проанализируем ситуацию с технической точки зрения. Что такое SDBL (Simple Data Base Language)? Это внутренний язык и транслятор платформы 1С, который преобразует запросы встроенного языка 1С в «чистый» SQL-код, понятный СУБД (MS SQL, PostgreSQL и др.). Ошибка транслятора возникает тогда, когда описание метаданных в конфигурации расходится с фактической физической структурой таблиц на сервере баз данных.

Разберем структуру ошибочного поля из лога:

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


Шаг 1. Локализация проблемного реквизита и таблицы

Выясним, к какому объекту метаданных относится проблемное поле Fld62825. Нам необходимо сопоставить имя физической колонки с объектом в конфигураторе 1С. Рассмотрим два способа решения этой задачи.

Способ А. С помощью встроенного языка 1С (если Конфигуратор работает стабильно)

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


СтруктураБД = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Для Каждого Таблица Из СтруктураБД Цикл
    Для Каждого Поле Из Таблица.Поля Цикл
        Если ВРег(Поле.ИмяПоляХранения) = "FLD62825" Тогда
            Сообщить("Найдено совпадение!");
            Сообщить("Имя таблицы: " + Таблица.ИмяТаблицы);
            Сообщить("Имя метаданных таблицы: " + Таблица.ИмяМетаданных);
            Сообщить("Имя реквизита в 1С: " + Поле.ИмяПоля);
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Способ Б. Напрямую через СУБД (MS SQL Server)

Если конфигуратор «вылетает» или зависает, мы можем обойтись силами SQL-сервера. Откроем SQL Server Management Studio (SSMS), выберем нашу базу данных и выполним поисковый запрос по системному реестру колонок:


SELECT 
    t.name AS TableName, 
    c.name AS ColumnName
FROM 
    sys.columns c
JOIN 
    sys.tables t ON c.object_id = t.object_id
WHERE 
    c.name = 'Fld62825';

Этот запрос вернет нам имя физической таблицы (например, _Reference150). Зная имя таблицы и колонки, мы легко сопоставим их с метаданными 1С через ту же таблицу Params или обратившись к получению структуры в чистой тестовой базе.


Шаг 2. Борьба с падением Конфигуратора при реструктуризации (Тестирование и исправление)

Часто при такой ошибке попытка выполнить «Тестирование и исправление» (ТиИ) с включенной реструктуризацией таблиц приводит к тому, что Конфигуратор «виснет минут на 10, а после этого и вовсе закрывается без ошибок». Это связано с багами конкретных релизов платформы 1С при работе со сложными схемами метаданных ERP.

Для решения этой проблемы выполним следующие действия по шагам:

  1. Правильный подбор версии платформы. Как показывает практика работы с релизами ERP линейки 2.4.5, платформы ветки 8.3.14 (особенно ранние сборки) имеют проблемы с падением процесса реструктуризации. Проанализируем требования к релизу конфигурации. Если минимальные требования позволяют, необходимо временно запустить базу на стабильном релизе ветки 8.3.12 (например, 8.3.12.1855). Именно на платформе 8.3.12 процесс ТиИ и реструктуризации чаще всего проходит до конца без аварийного завершения.
  2. Очистка серверного кэша. Перед запуском исправления обязательно остановим службу «Агент сервера 1С:Предприятия» и физически удалим папки с кэшем метаданных (каталоги внутри папки srvinfo\reg_1541, исключая файлы конфигурации и логов). Это исключит влияние старых описаний типов.

Шаг 3. Устранение логической несогласованности данных (Статьи Расходов)

Проанализируем конкретный пример: ошибка возникает на шаге выполнения обработчика обновления ПланыВидовХарактеристик.СтатьиРасходов.ОбработатьДанныеДляПереходаНаНовуюВерсию.

В новых версиях ERP разработчики 1С часто меняют структуру хранения аналитики статей расходов. Если в базе содержатся устаревшие элементы (или некорректно заполненные предопределенные статьи), обработчик обновления спотыкается на попытке приведения типов данных.

Решать эту проблему на уровне СУБД следует аккуратно:

  1. Сделаем резервную копию базы данных SQL.
  2. Через SQL-запрос найдем строки в таблице ПВХ «Статьи расходов» (или связанной таблице значений свойств), где значение поля _Fld62825 (или аналогичного проблемного поля) заполнено некорректно.
  3. Если это поле ссылочного типа, но содержит битую ссылку или несовместимый тип, запишем туда значение NULL или пустую бинарную ссылку аналогичной длины, выполнив SQL-команду UPDATE для конкретных строк. Например:

-- Пример очистки проблемного поля в SQL (выполнять только после точного анализа типов!)
UPDATE _Reference150 
SET _Fld62825 = 0x00000000000000000000000000000000 
WHERE _Fld62825 IS NULL OR _Fld62825 = <проблемное_значение>;

Шаг 4. Решение проблемы «Таблица или поле ID не содержится в разделе FROM»

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

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

Чтобы заставить платформу принудительно пересоздать SQL-представления и таблицы, выполним проверенный алгоритм:

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

Общие рекомендации при регулярных обновлениях больших баз ERP

Для предотвращения подобных ситуаций в будущем рекомендуем придерживаться следующих правил:

← На главную