Работа с серверной базой 1С напрямую через СУБД — это мощный инструмент в руках разработчика или системного администратора. Зачастую это требуется для диагностики проблем, которые сложно отловить средствами встроенного языка 1С, например, при поиске дублей в индексированных полях или анализе итогов. В данной статье мы разберем, как правильно выполнять запросы к SQL-серверу, почему возникают ошибки при работе с датами и как расшифровать специфические имена таблиц 1С.
Прежде всего, разберем вопрос о том, где и как выполнять скрипты. Для серверных баз на базе MS SQL Server основным инструментом является SQL Server Management Studio (SSMS). Это графическая оболочка, позволяющая подключаться к экземпляру сервера, просматривать структуру таблиц и выполнять произвольный код.
Для запуска скрипта необходимо выполнить следующие шаги:
Databases и выберем нужную базу данных 1С.Рассмотрим альтернативные варианты. Помимо SSMS, существуют специальные внешние обработки для 1С, называемые "Консоль запросов SQL". Они удобны тем, что позволяют писать запросы, используя привычные метаданные 1С, которые обработка сама транслирует в реальные имена таблиц SQL.
Одной из частых задач является поиск записей, которые нарушают уникальность индексов. Проанализируем пример запроса, который позволяет найти такие дубли:
SELECT COUNT(*) Counter, _Fld100, _Fld101, _Fld102
FROM _InfoRg100
GROUP BY _Fld100, _Fld101, _Fld102
HAVING COUNT(*) > 1
Разберем, как работает этот код. Мы выбираем поля, входящие в состав уникального индекса (например, измерения регистра), и группируем данные по ним. Конструкция HAVING Counter > 1 отсекает все уникальные записи, оставляя только те, которые встречаются в таблице более одного раза. Это позволяет быстро локализовать проблемные данные, ставшие причиной ошибок при реструктуризации базы или проведении документов.
Часто новички сталкиваются с ошибкой: Сообщение 102, уровень 15, состояние 1. Неправильный синтаксис около конструкции "00". Выясним причину этой проблемы на примере некорректного запроса:
SELECT * FROM _AccRgAT1592
WHERE _period = 4019-12-01 00:00:00
Важный момент: SQL Server воспринимает запись 4019-12-01 без кавычек как арифметическую операцию (вычитание чисел). В итоге получается число, после которого следует время, что и вызывает синтаксическую ошибку. Для правильной работы с датами в SQL необходимо соблюдать следующие правила:
'4019-12-01 00:00:00'.'YYYYMMDD HH:MM:SS' (без дефисов) или 'YYYY-MM-DDTHH:MM:SS'.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. Посмотрим, что они означают:
_AccRgAT указывает на таблицу итогов бухгалтерского регистра (Accounting Register Accumulation Table)._InfoRg — регистр сведений._Document — таблица документов.RRef у полей означает, что это ссылка (уникальный идентификатор GUID), хранящаяся в двоичном формате binary(16).Чтобы сопоставить эти странные имена с объектами в конфигураторе, проанализируем ситуацию программно. В 1С существует метод ПолучитьСтруктуруХраненияБазыДанных(). Выполнение этого метода в консоли кода вернет таблицу соответствий всех объектов метаданных их физическим именам в SQL.
Любые действия в SQL-консоли, связанные с изменением данных (UPDATE, DELETE, INSERT), должны сопровождаться крайней осторожностью. Рассмотрим основные правила выживания:
Таким образом, для успешного выполнения скриптов нам необходимо понимать структуру хранения данных 1С, использовать правильное форматирование типов (особенно дат) и всегда иметь под рукой инструменты для сопоставления имен таблиц.