Обновление крупных конфигураций, таких как 1С:ERP Управление предприятием или 1С:Комплексная автоматизация, нередко преподносит неприятные сюрпризы системным администраторам и разработчикам. Особенно критичными являются ошибки уровня СУБД и транслятора SDBL, которые прерывают обновление информационной базы на «самом интересном месте» — во время выполнения отложенных или системных обработчиков обновления.
В этой статье мы подробно разберем, как победить взаимосвязанный комплекс ошибок: зависание конфигуратора при реструктуризации таблиц, ошибку SDBL Тип поля 21:00000000000000000000000000000000 несовместим с типом поля Fld62825, а также ее «эхо» в режиме Предприятия — Таблица или поле ID не содержится в разделе FROM.
Для начала проанализируем ситуацию с технической точки зрения. Что такое SDBL (Simple Data Base Language)? Это внутренний язык и транслятор платформы 1С, который преобразует запросы встроенного языка 1С в «чистый» SQL-код, понятный СУБД (MS SQL, PostgreSQL и др.). Ошибка транслятора возникает тогда, когда описание метаданных в конфигурации расходится с фактической физической структурой таблиц на сервере баз данных.
Разберем структуру ошибочного поля из лога:
21:00000000000000000000000000000000 — это представление пустой ссылки определенного типа. Число 21 — это внутренний идентификатор типа метаданных в вашей конкретной базе данных (его можно узнать из таблицы dbnames).Fld62825 — это физическое имя колонки в SQL-таблице СУБД, созданное платформой для какого-то реквизита.Ошибка несовместимости типов означает, что при обновлении обработчик пытается записать пустую ссылку (или значение по умолчанию) в поле, тип которого был изменен разработчиками 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 или обратившись к получению структуры в чистой тестовой базе.
Часто при такой ошибке попытка выполнить «Тестирование и исправление» (ТиИ) с включенной реструктуризацией таблиц приводит к тому, что Конфигуратор «виснет минут на 10, а после этого и вовсе закрывается без ошибок». Это связано с багами конкретных релизов платформы 1С при работе со сложными схемами метаданных ERP.
Для решения этой проблемы выполним следующие действия по шагам:
8.3.14 (особенно ранние сборки) имеют проблемы с падением процесса реструктуризации. Проанализируем требования к релизу конфигурации. Если минимальные требования позволяют, необходимо временно запустить базу на стабильном релизе ветки 8.3.12 (например, 8.3.12.1855). Именно на платформе 8.3.12 процесс ТиИ и реструктуризации чаще всего проходит до конца без аварийного завершения.srvinfo\reg_1541, исключая файлы конфигурации и логов). Это исключит влияние старых описаний типов.Проанализируем конкретный пример: ошибка возникает на шаге выполнения обработчика обновления ПланыВидовХарактеристик.СтатьиРасходов.ОбработатьДанныеДляПереходаНаНовуюВерсию.
В новых версиях ERP разработчики 1С часто меняют структуру хранения аналитики статей расходов. Если в базе содержатся устаревшие элементы (или некорректно заполненные предопределенные статьи), обработчик обновления спотыкается на попытке приведения типов данных.
Решать эту проблему на уровне СУБД следует аккуратно:
_Fld62825 (или аналогичного проблемного поля) заполнено некорректно.NULL или пустую бинарную ссылку аналогичной длины, выполнив SQL-команду UPDATE для конкретных строк. Например:
-- Пример очистки проблемного поля в SQL (выполнять только после точного анализа типов!)
UPDATE _Reference150
SET _Fld62825 = 0x00000000000000000000000000000000
WHERE _Fld62825 IS NULL OR _Fld62825 = <проблемное_значение>;
Эта ошибка появляется в режиме «1С:Предприятие» при открытии списков (например, документов безналичных платежей или касс) уже после того, как вам удалось завершить ТиИ на более старой платформе. Она является прямым следствием незавершенной реструктуризации.
Когда конфигуратор аварийно закрывался на этапе реструктуризации, платформа оставила структуру SQL-таблиц и SQL-представлений (Views) в промежуточном состоянии. В СУБД некоторые таблицы лишились поля ID (которое платформа использует для идентификации строк), либо системные вьюхи обращаются к несуществующим колонкам.
Чтобы заставить платформу принудительно пересоздать SQL-представления и таблицы, выполним проверенный алгоритм:
Документ.ПоступлениеБезналичныхДенежныхСредств или регистр накопления РегистрНакопления.ДенежныеСредстваВКассахОрганизаций).ID.Для предотвращения подобных ситуаций в будущем рекомендуем придерживаться следующих правил:
ReadMe.txt из дистрибутива обновления конфигурации — там жестко прописаны минимальные и рекомендуемые версии платформы. Выход за эти рамки вверх или вниз часто провоцирует ошибки SDBL.