Работа с внешними источниками данных в 1С — это мощный инструмент интеграции, однако при попытке записи в таблицы, которые не имеют объектной сущности (необъектные данные), разработчики часто сталкиваются с нетипичными ошибками. Одной из наиболее распространенных является ошибка ODBC SQLSTATE: 42000 с описанием "Неправильный синтаксис около конструкции 'T1'" или "Incorrect syntax near '<'". В этой статье мы подробно разберем причины возникновения этих ошибок и способы их устранения.
Проанализируем ситуацию: когда мы работаем с внешним источником данных, платформа 1С выступает в роли генератора SQL-запросов. Если тип СУБД не указан явно, 1С может формировать запросы, используя универсальные или неподходящие под конкретный драйвер ODBC диалекты SQL. Ошибка с упоминанием алиаса T1 часто возникает из-за того, что драйвер MS SQL Server ожидает иную структуру команды INSERT или UPDATE, чем та, которую сгенерировала платформа по умолчанию.
Рассмотрим, как правильно инициализировать соединение в коде программно. Важно не просто передать строку соединения, но и явно заполнить свойство СУБД (DBMS) объекта ПараметрыСоединенияВнешнегоИсточникаДанных.
Соединение = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
// Указываем стандартную строку соединения через драйвер
Соединение.СтрокаСоединения = "Driver={SQL Server};Server=bd-srv.srv.local;Database=Holding_Exchange;Uid=user;Pwd=password;";
// КРИТИЧЕСКИ ВАЖНО: Явно указываем тип СУБД
// Без этой строки 1С может генерировать некорректные запросы (например, в формате MySQL)
Соединение.СУБД = "MSSQLServer";
Источник = ВнешниеИсточникиДанных.Holding_Exchange;
Источник.УстановитьПараметрыСоединенияСеанса(Соединение);
Источник.УстановитьСоединение();
После явного указания типа СУБД платформа начнет использовать специфический диалект SQL, совместимый с Microsoft SQL Server, что уберет проблемы с неправильными алиасами таблиц.
Если вы предпочитаете настраивать соединение через визуальный интерфейс, обратите внимание на настройки в самой платформе (начиная с версии 8.3.7 и выше). Выясним, как это сделать без написания кода: в форме настройки общих параметров внешнего источника данных есть поле выбора типа СУБД. Установка этого значения вручную в конфигураторе или в режиме "1С:Предприятие" (если предусмотрен интерфейс настройки) решает проблему аналогично программному способу.
Разберем другую ошибку: "Incorrect syntax near '<'". Эта проблема часто возникает в момент непосредственной записи данных через СоздатьМенеджерЗаписи() или СоздатьНаборЗаписей().
Посмотрим на пример кода, который может вызвать такую ошибку:
НоваяЗап = ВнешниеИсточникиДанных.Holding_Exchange.Таблицы.dbo_CurrentStatus.СоздатьМенеджерЗаписи();
НоваяЗап._Person = Строка(НаборЗап.Менеджер.УникальныйИдентификатор);
НоваяЗап._DateEvent = НаборЗап.ДатаСостояния;
// Если какое-то поле в таблице SQL не заполнено и 1С пытается отправить "пустоту"
НоваяЗап.Записать();
Проанализируем ситуацию с помощью SQL Server Profiler. Выяснится, что если в объекте 1С поле не было инициализировано (осталось пустым), платформа может попытаться отправить в SQL-запрос внутреннее представление пустого значения, которое выглядит как тег <...>. SQL Server не понимает этот синтаксис и возвращает ошибку.
Как правильно передавать значения:
NULL, убедитесь, что вы явно передаете NULL или инициализируете поле корректным значением.datetime, а в 1С передается пустая дата (01.01.0001), это вызовет ошибку, так как минимальная дата в SQL Server — 1753 год.Для необъектных данных крайне важно, как определен первичный ключ в метаданных 1С. Рассмотрим основные правила:
МенеджерЗаписи будет практически невозможна, так как 1С не сможет сформировать условие WHERE для поиска существующей строки. В таком случае рекомендуется добавить техническое поле identity в SQL или использовать набор полей, гарантирующий уникальность.СоздатьНаборЗаписей() помните, что 1С сначала выполняет чтение по фильтру. Если фильтр неточный, это может привести к деградации производительности внешней базы.Если вышеуказанные способы не помогают, воспользуемся проверенным методом диагностики — трассировкой запросов. Запустив SQL Server Profiler, мы сможем увидеть "сырой" текст запроса, который 1С отправляет на сервер.
Часто проблема кроется в QUOTED_IDENTIFIER. Если имена ваших полей начинаются с подчеркивания (например, _Person) или содержат спецсимволы, 1С заключает их в двойные кавычки. Если на сервере SQL настройка QUOTED_IDENTIFIER выключена, это приведет к синтаксической ошибке. Явное указание типа СУБД в параметрах соединения обычно корректирует и это поведение платформы.
Подведем итог: для стабильной записи во внешние источники данных всегда явно указывайте Соединение.СУБД = "MSSQLServer" и тщательно проверяйте заполнение всех полей перед вызовом метода Записать(), избегая передачи неопределенных значений или дат вне диапазона СУБД.