Как правильно запускать SQL-запросы к серверной базе 1С и исправлять ошибки синтаксиса дат

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

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

Инструментарий для работы с SQL-запросами

Прежде всего, разберем вопрос о том, где и как выполнять скрипты. Для серверных баз на базе MS SQL Server основным инструментом является SQL Server Management Studio (SSMS). Это графическая оболочка, позволяющая подключаться к экземпляру сервера, просматривать структуру таблиц и выполнять произвольный код.

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

  1. Запустим Management Studio и подключимся к вашему серверу баз данных.
  2. В дереве объектов (Object Explorer) развернем ветку Databases и выберем нужную базу данных 1С.
  3. Нажмем кнопку "New Query" (Новый запрос) на панели инструментов.
  4. В открывшееся окно вставим текст нашего скрипта и нажмем F5 или кнопку "Execute".

Рассмотрим альтернативные варианты. Помимо SSMS, существуют специальные внешние обработки для 1С, называемые "Консоль запросов SQL". Они удобны тем, что позволяют писать запросы, используя привычные метаданные 1С, которые обработка сама транслирует в реальные имена таблиц SQL.

Поиск дубликатов в таблицах базы данных

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


SELECT COUNT(*) Counter, _Fld100, _Fld101, _Fld102 
FROM _InfoRg100
GROUP BY _Fld100, _Fld101, _Fld102
HAVING COUNT(*) > 1

Разберем, как работает этот код. Мы выбираем поля, входящие в состав уникального индекса (например, измерения регистра), и группируем данные по ним. Конструкция HAVING Counter > 1 отсекает все уникальные записи, оставляя только те, которые встречаются в таблице более одного раза. Это позволяет быстро локализовать проблемные данные, ставшие причиной ошибок при реструктуризации базы или проведении документов.

Исправление ошибок синтаксиса даты в SQL

Часто новички сталкиваются с ошибкой: Сообщение 102, уровень 15, состояние 1. Неправильный синтаксис около конструкции "00". Выясним причину этой проблемы на примере некорректного запроса:


SELECT * FROM _AccRgAT1592
WHERE _period = 4019-12-01 00:00:00

Важный момент: SQL Server воспринимает запись 4019-12-01 без кавычек как арифметическую операцию (вычитание чисел). В итоге получается число, после которого следует время, что и вызывает синтаксическую ошибку. Для правильной работы с датами в SQL необходимо соблюдать следующие правила:

  1. Использование кавычек: Любая дата должна быть заключена в одинарные кавычки. Правильный вариант: '4019-12-01 00:00:00'.
  2. Формат записи: Чтобы избежать проблем с региональными настройками сервера (например, когда сервер ожидает формат ММ-ДД-ГГ, а вы передаете ДД-ММ-ГГ), рекомендуется использовать универсальный формат ISO: 'YYYYMMDD HH:MM:SS' (без дефисов) или 'YYYY-MM-DDTHH:MM:SS'.
  3. Смещение дат в 1С: Обратим внимание на год в примере — 4019. Это не ошибка пользователя, а особенность 1С. При создании базы часто выбирается смещение дат на 2000 лет. Это делается для того, чтобы пустые даты 1С (0001 год) не выходили за пределы минимально допустимой даты в SQL Server (1753 год). Таким образом, дата 2019 год в SQL превращается в 4019 год.

Рассмотрим исправленный и безопасный вариант запроса:


SELECT * FROM _AccRgAT1592
WHERE _AccountRRef = 0xae4d415a6e83af724fbc9ec0040727cc 
AND _period = '40191201 00:00:00'

Дешифровка имен таблиц и полей

Работая напрямую с SQL, мы видим названия вроде _AccRgAT1592 или _Fld561RRef. Посмотрим, что они означают:

Чтобы сопоставить эти странные имена с объектами в конфигураторе, проанализируем ситуацию программно. В 1С существует метод ПолучитьСтруктуруХраненияБазыДанных(). Выполнение этого метода в консоли кода вернет таблицу соответствий всех объектов метаданных их физическим именам в SQL.

Меры предосторожности и рекомендации

Любые действия в SQL-консоли, связанные с изменением данных (UPDATE, DELETE, INSERT), должны сопровождаться крайней осторожностью. Рассмотрим основные правила выживания:

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

← На главную