В практике администрирования высоконагруженных систем на базе 1С:Предприятие встречается крайне специфическая и коварная проблема. Пользователи начинают замечать, что в полях реквизитов вместо понятных названий (например, имени контрагента или наименования номенклатуры) отображается надпись «Объект не найден...» с длинным идентификатором в скобках. При этом, если попытаться найти этот объект программно по УИД, он успешно находится и открывается. Однако при детальном анализе выясняется, что ГУИД ссылки в битом объекте «мутировал» — несколько символов в середине строки отличаются от оригинала. Рассмотрим, почему это происходит и как вылечить базу.
Прежде чем приступать к инфраструктурным изменениям, нам необходимо убедиться, что проблема не вызвана банальной нехваткой прав доступа (RLS). Проанализируем ситуацию: если бы у пользователя просто не хватало прав на чтение объекта, платформа действительно писала бы «Объект не найден», но при открытии под полными правами ссылка отображалась бы корректно.
В нашем же случае проблема глубже. Мы можем использовать внешнюю обработку для проверки того, что именно записано в базе данных. Разберем небольшой фрагмент кода, который поможет нам понять, «живая» ли ссылка на самом деле:
// Диагностика ссылки через УИД
УИД_Строка = "0ff42e40-acb8-11e9-80d6-0050569d513d"; // ГУИД из битой ссылки
Попытка
НужныйУИД = Новый УникальныйИдентификатор(УИД_Строка);
СсылкаНаОбъект = Справочники.Контрагенты.ПолучитьСсылку(НужныйУИД);
// Пробуем получить данные объекта
Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Объект действительно отсутствует в таблице БД");
Иначе
ПоказатьЗначение(, СсылкаНаОбъект);
Сообщить("Объект найден, проблема в визуализации или искажении ссылки");
КонецЕсли;
Исключение
Сообщить("Некорректный формат УИД");
КонецПопытки;
Если код выше показывает, что объекта с таким ГУИДом в базе нет, а должен быть объект с похожим номером (отличающимся на пару символов), значит, мы столкнулись с десериализацией данных или их порчей при передаче по сети.
Проанализируем технические данные системы. Часто такая проблема всплывает на платформе 1С:Предприятие 8.3.15.1489 и соседних релизах этой ветки. В этой версии был официально зафиксирован баг, связанный с некорректной передачей XML-пакетов при работе через веб-сервер (IIS или Apache). В моменты пиковой нагрузки, когда в базе одновременно работают более 100 пользователей, механизм сериализации объектов в XML может давать сбой.
В результате при записи документа или справочника ГУИД (который по сути является частью XML-структуры) передается с искажением. Например, часть временной метки (timestamp) в середине идентификатора меняется. В базе сохраняется ссылка на несуществующий адрес, хотя визуально кажется, что данные на месте. Первое и самое важное решение — обновление платформы до актуальных стабильных релизов (ветки 8.3.16, 8.3.18 или выше), где ошибки работы с веб-серверами были исправлены.
Если обновление платформы не помогло или вы используете стабильную версию, а ссылки продолжают «биться», нам нужно спуститься на уровень сетевого оборудования и драйверов. В операционных системах Windows Server по умолчанию включена функция TCP Chimney Offload. Она призвана разгружать центральный процессор, перенося обработку сетевых пакетов на аппаратный уровень сетевой карты.
Однако при работе с MS SQL Server и 1С в режиме высокой нагрузки эта функция часто приводит к порче данных в потоке. Сетевая карта может некорректно собрать фрагментированный пакет, из-за чего в середине длинного идентификатора ГУИД появляются случайные байты. Рассмотрим, как отключить эту функцию для стабилизации системы:
netsh int tcp show global.netsh int tcp set global chimney=disabled.netsh int tcp set global rss=disabled.После выполнения этих действий пакеты будут обрабатываться центральным процессором более предсказуемо, что исключит аппаратные ошибки «перемешивания» данных в TCP-потоке.
Выясним причину возможного искажения данных на стороне веб-сервера. При использовании IIS данные передаются по протоколу HTTP/HTTPS в сжатом виде. Иногда модули динамического сжатия (Dynamic Content Compression) некорректно обрабатывают специфические бинарные данные 1С.
Попробуем выполнить следующие настройки в консоли управления IIS:
Application Pool, под которым работает база, и выполните его рециклинг (Recycle).Когда мы устранили причины появления новых ошибок, нам нужно разобраться с теми объектами, которые уже записаны с «битыми» ссылками. Обычное «Тестирование и исправление» (ТиИ) из конфигуратора часто не видит проблемы, так как с точки зрения логики 1С ссылка существует (просто она указывает в «пустоту»).
Проанализируем ситуацию на уровне СУБД. Рекомендуется выполнить регламентные операции средствами самого MS SQL Server. Нам помогут реиндексация и обновление статистики. В некоторых случаях ГУИДы «теряются» из-за повреждения индексов таблиц. Выполните следующий скрипт в SQL Management Studio для проблемной базы:
-- Реиндексация всех таблиц базы данных
EXEC sp_MSforeachtable 'ALTER INDEX ALL ON ? REBUILD';
-- Обновление статистики
EXEC sp_updatestats;
После выполнения этих команд индексы будут перестроены, и платформа сможет корректно сопоставлять ссылки, если проблема была вызвана «фантомными» записями в индексах SQL.
Подводя итог, можно сказать, что «мутация» ссылок — это всегда следствие проблем передачи данных между клиентом и сервером. Для решения мы рекомендуем придерживаться следующего плана:
Применяя эти шаги комплексно, мы сможем полностью избавиться от пугающих надписей «Объект не найден» и обеспечить стабильную работу пользователей в высоконагруженной системе.