При работе с интеграцией 1С:Управление торговлей 11 и Битрикс иногда возникает крайне специфическая проблема: при загрузке новых заказов с сайта система автоматически устанавливает в качестве их основания старые документы РеализацияТоваровУслуг (РТУ), например, за 2019 год. При этом визуально в форме документа всё может выглядеть корректно, но структура подчиненности и запросы через консоль показывают «битые» ссылки или нелогичные связи.
В этой статье мы подробно разберем, почему это происходит, проанализируем механизмы работы GUID и предложим пошаговое решение для очистки базы данных от подобных фантомных связей.
Первое, с чем сталкивается разработчик — это невозможность поймать момент изменения документа через точки останова в модуле объекта. Мы ставим прерывания в процедурах ПередЗаписью или ПриЗаписи, но они не срабатывают. Разберем, почему так происходит:
ОбменДанными.Загрузка = Истина. В этом режиме платформа отключает большинство стандартных проверок и обработчиков событий в модулях документов, чтобы ускорить запись и избежать конфликтов с бизнес-логикой (например, запретом редактирования в закрытом периоде).Для поиска места изменения мы рекомендуем использовать Замер производительности. Даже если точка останова не срабатывает, замер зафиксирует все обращения к модулям и позволит увидеть, какая процедура инициировала запись документа РеализацияТоваровУслуг.
Рассмотрим ситуацию с идентификаторами. В системе 1С GUID может выглядеть по-разному в зависимости от метода получения. Например:
8e23902b34750a0711e92dc59974bd459974bd45-2dc5-11e9-8e23-902b34750a07Это идентификаторы типа Version 1 UUID, которые генерируются на основе времени и MAC-адреса. Если в базе данных есть поврежденные записи в таблицах _Document или _Reference, платформа может «видеть» запись в индексе, но не находить данных в самой таблице. В результате поисковые механизмы модуля Битрикс могут ошибочно сопоставлять новый GUID заказа с «пустой» или битой записью старого документа.
Модуль обмена использует специальные регистры для хранения связей. Рассмотрим подробнее, где может скрываться ошибка:
битрикс_СоответствияОбъектов. Если в нем произошел сбой и GUID сайта по какой-то причине привязался к ссылке на старую РТУ, система при каждой выгрузке будет пытаться обновить этот объект, считая его актуальным заказом.СвязанныеДокументы). Если в документе за 2019 год в поле ДокументОснование записан мусорный идентификатор, который случайно совпал с ГУИД-ом нового заказа, они окажутся связаны в дереве подчиненности, хотя логической связи между ними нет.Проанализируем ситуацию и выполним следующие действия для исправления структуры данных:
Необходимо найти в базе регистр, отвечающий за связь идентификаторов Битрикс и ссылок 1С. Выполните запрос к этому регистру, отфильтровав его по проблемным документам РТУ 2019 года. Если связь обнаружена — ее нужно удалить.
Посмотрим на пример запроса, который поможет выявить документы с некорректными основаниями. Мы ищем все РТУ, у которых в качестве основания указан объект, не являющийся заказом клиента или имеющий битую ссылку:
ВЫБРАТЬ
Реализация.Ссылка КАК СсылкаНаРТУ,
Реализация.ДокументОснование КАК Основание
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.ДокументОснование.Номер ЕСТЬ NULL
И Реализация.ДокументОснование <> ЗНАЧЕНИЕ(Документ.ЗаказКлиента.ПустаяСсылка)
Если стандартное Тестирование и исправление (ТиИ) не помогает, значит проблема глубже — на уровне индексов SQL. Проанализируем состояние таблиц. Рекомендуется выполнить следующие команды в SQL Management Studio (предварительно сделав бэкап!):
DBCC CHECKDB для проверки физической целостности базы._Document_Base в соответствующей таблице _Document. Если там содержится некорректный двоичный код, его нужно очистить прямой SQL-командой UPDATE, установив значение 0x00 (в зависимости от структуры таблицы).Если вы обнаружили конкретный список документов, которые «подтягивают» к себе новые заказы, можно воспользоваться следующим кодом для очистки их реквизитов:
ОбъектРТУ = ДокументСсылка.ПолучитьОбъект();
// Устанавливаем режим загрузки, чтобы обойти проверки периода
ОбъектРТУ.ОбменДанными.Загрузка = Истина;
// Очищаем битую ссылку
ОбъектРТУ.ДокументОснование = Неопределено;
Попытка
ОбъектРТУ.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Документ " + ОбъектРТУ + " успешно очищен");
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
Всегда делайте архивную копию базы перед любыми манипуляциями с данными, особенно если планируете использовать прямой доступ к SQL или режим ОбменДанными.Загрузка = Истина. Помните, что удаление РТУ, к которой привязался заказ, часто приводит к тому, что система находит «следующую жертву» — другой старый документ с поврежденным индексом. Поэтому системное решение заключается именно в исправлении индексов СУБД и очистке регистра соответствий Битрикс.