При обновлении конфигурации (особенно при переходе на версии платформы 8.3.23, 8.3.24 и выше) технические специалисты часто сталкиваются с критической ошибкой: «Ошибка СУБД: неправильный синтаксис около конструкции "<"». Эта проблема чаще всего проявляется в клиент-серверном варианте работы при попытке принять изменения, требующие реструктуризации таблиц базы данных. В данной статье мы подробно проанализируем причины возникновения этой ошибки и разберем по шагам проверенные методы ее устранения.
Прежде чем переходить к лечению, проанализируем ситуацию. Основная причина кроется в некорректной работе механизмов генерации T-SQL кода платформой 1С. Начиная с определенных релизов, при создании или перестроении индексов (особенно если используются расширения или полнотекстовый поиск), платформа может ошибочно сформировать имя индекса на стороне MS SQL Server, содержащее символы < или >. Поскольку эти символы являются служебными в языке SQL, любая попытка обращения к такому индексу вызывает синтаксическую ошибку.
Также важную роль играет «наслоение» изменений при частом использовании динамического обновления. В системных таблицах Config и DBSchema могут накопиться несоответствия, которые приводят к сбою при попытке легального (не динамического) обновления с изменением структуры данных.
Это самый универсальный, хотя и трудоемкий метод. Рассмотрим, почему он помогает: при выгрузке данных в файл .dt сохраняются только объекты метаданных и сами данные, а при последующей загрузке в новую базу платформа полностью пересоздает структуру SQL-таблиц и индексов «с нуля» (предварительно полезно провести анализ размера таблиц и индексов), формируя таблицу DBSchema заново.
Важное замечание: При работе с большими базами данных помните, что процесс выгрузки использует временную папку Windows (Temp). Убедитесь, что на системном диске достаточно свободного места, иначе вы получите ошибку нехватки пространства еще на этапе подготовки файла.
Если база данных слишком велика для регулярных выгрузок в .dt, мы можем прибегнуть к «лечению» структуры индексов напрямую в MS SQL Server. Разберем исправленный скрипт, который помогает сбросить некорректные блокировки и перестроить индексы, что зачастую устраняет синтаксическую ошибку (см. также инструкцию по настройке регламентных операций SQL).
Выполним следующий скрипт в SQL Server Management Studio (SSMS), заменив ИмяВашейБазы на реальное название:
USE [ИмяВашейБазы]
GO
-- Шаг 1: Разрешаем блокировки страниц и строк для всех таблиц
EXEC sp_MSforeachtable 'ALTER INDEX ALL ON ? SET (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON)';
-- Шаг 2: Выполняем реорганизацию индексов
EXEC sp_MSforeachtable 'ALTER INDEX ALL ON ? REORGANIZE';
-- Шаг 3: Возвращаем настройки блокировок (опционально, согласно стандартам 1С)
EXEC sp_MSforeachtable 'ALTER INDEX ALL ON ? SET (ALLOW_PAGE_LOCKS = OFF, ALLOW_ROW_LOCKS = ON)';
Рассмотрим подробнее, что происходит: команда REORGANIZE является современной и безопасной альтернативой устаревшей INDEXDEFRAG. Она физически переупорядочивает страницы индексов и очищает метаданные, что позволяет платформе 1С при следующем обновлении корректно сопоставить структуру объектов (для крупных систем рекомендуется адаптивное обновление индексов).
Проанализируем ситуацию, когда платформа уже создала индекс с символом < в названии. Мы можем найти такие объекты прямым запросом к системным таблицам SQL Server. Если запрос ниже вернет строки, значит, причина именно в именовании.
SELECT t.name AS TableName, i.name AS IndexName
FROM sys.indexes i
INNER JOIN sys.tables t ON i.object_id = t.object_id
WHERE i.name LIKE '%<%' OR i.name LIKE '%>%';
Если вы обнаружили такие индексы, их необходимо переименовать или удалить (если это индексы полнотекстового поиска, они пересоздадутся автоматически). Для переименования используйте системную процедуру sp_rename. После этого обязательно выполните Тестирование и исправление в конфигураторе с флагом Реструктуризация таблиц.
Часто проблема возникает в командах, где несколько разработчиков активно используют Хранилище конфигурации и злоупотребляют динамическим обновлением. Проанализируем правильный алгоритм действий для профилактики ошибки:
srvinfo/reg_1541/snacc... (серверный кэш).Подводя итог, отметим: если вы столкнулись с ошибкой конструкции <, наиболее быстрым «костылем» является выполнение скрипта реорганизации индексов в SQL (Способ 2). Однако для долгосрочного решения рекомендуется выполнить разовую перезагрузку через .dt и в дальнейшем строго соблюдать регламент обновлений, минимизируя использование динамических правок при изменении структуры данных. Также проверьте наличие официальных патчей (исправлений) для вашей версии платформы в личном кабинете на портале 1С, так как разработчики периодически выпускают фиксы для подобных ошибок генерации запросов.