MSSQL Error 18054: Error was raised, but no message found in sys.messages — Решение
- В Errorlog регистрируется:
Error 18054, Severity 16, State 1: Error X, severity Y, state Z was raised, but no message with that error number was found in sys.messages. - Пользовательские транзакции в 1С аварийно прерываются при выполнении внешних обработок или обменов.
- Сбои возникают при вызове кастомных хранимых процедур, триггеров или интеграций через Direct SQL / Linked Servers.
1. Поиск и регистрация отсутствующего сообщения в `sys.messages`
-- Проверка наличия номера ошибки в системном представлении
SELECT * FROM sys.messages WHERE message_id = 50001 AND language_id = 1049;
-- Добавление пользовательского сообщения об ошибке на русском (1049) и английском (1033) языках
EXEC sp_addmessage
@msgnum = 50001,
@severity = 16,
@msgtext = N'Ошибка бизнес-логики интеграции 1С: Некорректные параметры документа.',
@lang = 'Russian',
@replace = 'replace';
EXEC sp_addmessage
@msgnum = 50001,
@severity = 16,
@msgtext = N'1C integration business logic error: Invalid document parameters.',
@lang = 'us_english',
@replace = 'replace';2. Поиск источника вызова RAISERROR / THROW через Extended Events
CREATE EVENT SESSION [Capture_Custom_Raiserror] ON SERVER
ADD EVENT sqlserver.error_reported(
ACTION(sqlserver.client_app_name, sqlserver.sql_text, sqlserver.session_id, sqlserver.tsql_stack)
WHERE ([error_number]=(18054))
)
ADD TARGET package0.ring_buffer;
GO
ALTER EVENT SESSION [Capture_Custom_Raiserror] ON SERVER STATE = START;3. Исправление синтаксиса в T-SQL коде процедур и триггеров
Если в коде используется конструкция RAISERROR(50001, 16, 1) без предварительного добавления сообщения через sp_addmessage, замените ее на явную передачу строки или оператор THROW:
-- Корректный современный синтаксис (не требует sp_addmessage)
THROW 50001, N'Текст ошибки сформирован динамически', 1; Частые вопросы (FAQ)
Почему возникает ошибка 18054?
Она возникает, когда T-SQL код вызывает команду RAISERROR с числовым кодом ошибки (msg_id >= 50000), но это сообщение не было предварительно зарегистрировано в системной таблице sys.messages с помощью процедуры sp_addmessage.
Использует ли типовая конфигурация 1С:Предприятие команду RAISERROR с кастомными кодами?
Платформа 1С напрямую не регистрирует кастомные сообщения через sp_addmessage. Ошибка почти всегда вызвана сторонними триггерами, процедурами интеграции или самописными сервисами очередей.
Как удалить ошибочно зарегистрированное сообщение?
Используйте системную хранимую процедуру: EXEC sp_dropmessage @msgnum = 50001, @lang = 'all';
Является ли ошибка 18054 признаком повреждения метаданных базы данных?
Нет, это ошибка выполнения логики прикладного уровня (T-SQL script logic error), целостность системных таблиц СУБД при этом не нарушена.