Как исправить ошибку «неправильный синтаксис около конструкции "<"» при обновлении конфигурации 1С?

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

При обновлении конфигурации (особенно при переходе на версии платформы 8.3.23, 8.3.24 и выше) технические специалисты часто сталкиваются с критической ошибкой: «Ошибка СУБД: неправильный синтаксис около конструкции "<"». Эта проблема чаще всего проявляется в клиент-серверном варианте работы при попытке принять изменения, требующие реструктуризации таблиц базы данных. В данной статье мы подробно проанализируем причины возникновения этой ошибки и разберем по шагам проверенные методы ее устранения.

Выясняем причину возникновения ошибки

Прежде чем переходить к лечению, проанализируем ситуацию. Основная причина кроется в некорректной работе механизмов генерации T-SQL кода платформой 1С. Начиная с определенных релизов, при создании или перестроении индексов (особенно если используются расширения или полнотекстовый поиск), платформа может ошибочно сформировать имя индекса на стороне MS SQL Server, содержащее символы < или >. Поскольку эти символы являются служебными в языке SQL, любая попытка обращения к такому индексу вызывает синтаксическую ошибку.

Также важную роль играет «наслоение» изменений при частом использовании динамического обновления. В системных таблицах Config и DBSchema могут накопиться несоответствия, которые приводят к сбою при попытке легального (не динамического) обновления с изменением структуры данных.

Способ 1: Использование выгрузки и загрузки информационной базы (DT)

Это самый универсальный, хотя и трудоемкий метод. Рассмотрим, почему он помогает: при выгрузке данных в файл .dt сохраняются только объекты метаданных и сами данные, а при последующей загрузке в новую базу платформа полностью пересоздает структуру SQL-таблиц и индексов «с нуля» (предварительно полезно провести анализ размера таблиц и индексов), формируя таблицу DBSchema заново.

  1. Запустим конфигуратор в монопольном режиме.
  2. Выберем пункт меню Администрирование -> Выгрузить информационную базу.
  3. Создадим пустую базу на SQL-сервере.
  4. Загрузим полученный файл через Администрирование -> Загрузить информационную базу.

Важное замечание: При работе с большими базами данных помните, что процесс выгрузки использует временную папку Windows (Temp). Убедитесь, что на системном диске достаточно свободного места, иначе вы получите ошибку нехватки пространства еще на этапе подготовки файла.

Способ 2: Обслуживание индексов и статистики через SQL-скрипты

Если база данных слишком велика для регулярных выгрузок в .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С при следующем обновлении корректно сопоставить структуру объектов (для крупных систем рекомендуется адаптивное обновление индексов).

Способ 3: Поиск и переименование «кривых» индексов

Проанализируем ситуацию, когда платформа уже создала индекс с символом < в названии. Мы можем найти такие объекты прямым запросом к системным таблицам 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. После этого обязательно выполните Тестирование и исправление в конфигураторе с флагом Реструктуризация таблиц.

Способ 4: Очистка серверного кэша и методология работы с хранилищем

Часто проблема возникает в командах, где несколько разработчиков активно используют Хранилище конфигурации и злоупотребляют динамическим обновлением. Проанализируем правильный алгоритм действий для профилактики ошибки:

  1. Очистка кэша: Перед выполнением реструктуризации необходимо остановить службу сервера 1С и полностью очистить содержимое папок srvinfo/reg_1541/snacc... (серверный кэш).
  2. Отказ от динамики: Если планируется изменение реквизитов, добавление новых объектов или работа с расширениями, крайне рекомендуется предварительно выполнить «пустое» обновление (без изменений), чтобы убедиться, что база находится в актуальном состоянии.
  3. Работа с хранилищем: Все разработчики должны получить последние изменения из хранилища. После этого один ответственный администратор выполняет захват корня конфигурации и проводит обновление в монопольном режиме.

Резюме и рекомендации

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

← На главную