Почему новые заказы из Битрикс привязываются к старым реализациям и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с интеграцией 1С:Управление торговлей 11 и Битрикс иногда возникает крайне специфическая проблема: при загрузке новых заказов с сайта система автоматически устанавливает в качестве их основания старые документы РеализацияТоваровУслуг (РТУ), например, за 2019 год. При этом визуально в форме документа всё может выглядеть корректно, но структура подчиненности и запросы через консоль показывают «битые» ссылки или нелогичные связи.

В этой статье мы подробно разберем, почему это происходит, проанализируем механизмы работы GUID и предложим пошаговое решение для очистки базы данных от подобных фантомных связей.

Выясним причину: почему не срабатывают стандартные методы отладки?

Первое, с чем сталкивается разработчик — это невозможность поймать момент изменения документа через точки останова в модуле объекта. Мы ставим прерывания в процедурах ПередЗаписью или ПриЗаписи, но они не срабатывают. Разберем, почему так происходит:

  1. Режим загрузки данных: Модули обмена часто используют свойство ОбменДанными.Загрузка = Истина. В этом режиме платформа отключает большинство стандартных проверок и обработчиков событий в модулях документов, чтобы ускорить запись и избежать конфликтов с бизнес-логикой (например, запретом редактирования в закрытом периоде).
  2. Запись через наборы записей: Если связь устанавливается не в самом документе, а в регистре или через прямые манипуляции с движениями, код в модуле документа просто не будет вызван.
  3. Подписки на события: Изменение может происходить в подписках на события, которые выполняются уже после записи основного объекта или вообще в контексте другого процесса.

Для поиска места изменения мы рекомендуем использовать Замер производительности. Даже если точка останова не срабатывает, замер зафиксирует все обращения к модулям и позволит увидеть, какая процедура инициировала запись документа РеализацияТоваровУслуг.

Проанализируем природу GUID и битых ссылок

Рассмотрим ситуацию с идентификаторами. В системе 1С GUID может выглядеть по-разному в зависимости от метода получения. Например:

Это идентификаторы типа Version 1 UUID, которые генерируются на основе времени и MAC-адреса. Если в базе данных есть поврежденные записи в таблицах _Document или _Reference, платформа может «видеть» запись в индексе, но не находить данных в самой таблице. В результате поисковые механизмы модуля Битрикс могут ошибочно сопоставлять новый GUID заказа с «пустой» или битой записью старого документа.

Разберем по шагам механизм идентификации в модуле Битрикс

Модуль обмена использует специальные регистры для хранения связей. Рассмотрим подробнее, где может скрываться ошибка:

  1. Регистр соответствий объектов: Обычно это регистр битрикс_СоответствияОбъектов. Если в нем произошел сбой и GUID сайта по какой-то причине привязался к ссылке на старую РТУ, система при каждой выгрузке будет пытаться обновить этот объект, считая его актуальным заказом.
  2. Критерии отбора: Структура подчиненности строится на основе критерия отбора (например, СвязанныеДокументы). Если в документе за 2019 год в поле ДокументОснование записан мусорный идентификатор, который случайно совпал с ГУИД-ом нового заказа, они окажутся связаны в дереве подчиненности, хотя логической связи между ними нет.

Инструкция по локализации и решению проблемы

Проанализируем ситуацию и выполним следующие действия для исправления структуры данных:

Шаг 1: Проверка регистра соответствий

Необходимо найти в базе регистр, отвечающий за связь идентификаторов Битрикс и ссылок 1С. Выполните запрос к этому регистру, отфильтровав его по проблемным документам РТУ 2019 года. Если связь обнаружена — ее нужно удалить.

Шаг 2: Трассировка реквизита через консоль запросов

Посмотрим на пример запроса, который поможет выявить документы с некорректными основаниями. Мы ищем все РТУ, у которых в качестве основания указан объект, не являющийся заказом клиента или имеющий битую ссылку:


ВЫБРАТЬ
    Реализация.Ссылка КАК СсылкаНаРТУ,
    Реализация.ДокументОснование КАК Основание
ИЗ
    Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
    Реализация.ДокументОснование.Номер ЕСТЬ NULL
    И Реализация.ДокументОснование <> ЗНАЧЕНИЕ(Документ.ЗаказКлиента.ПустаяСсылка)

Шаг 3: Работа на уровне СУБД (SQL)

Если стандартное Тестирование и исправление (ТиИ) не помогает, значит проблема глубже — на уровне индексов SQL. Проанализируем состояние таблиц. Рекомендуется выполнить следующие команды в SQL Management Studio (предварительно сделав бэкап!):

  1. Выполнить DBCC CHECKDB для проверки физической целостности базы.
  2. Провести полную реиндексацию таблиц документов.
  3. Если консоль 1С показывает пустые поля, а связь существует, проверьте поле _Document_Base в соответствующей таблице _Document. Если там содержится некорректный двоичный код, его нужно очистить прямой SQL-командой UPDATE, установив значение 0x00 (в зависимости от структуры таблицы).

Шаг 4: Программная очистка битых ссылок

Если вы обнаружили конкретный список документов, которые «подтягивают» к себе новые заказы, можно воспользоваться следующим кодом для очистки их реквизитов:


ОбъектРТУ = ДокументСсылка.ПолучитьОбъект();
// Устанавливаем режим загрузки, чтобы обойти проверки периода
ОбъектРТУ.ОбменДанными.Загрузка = Истина;
// Очищаем битую ссылку
ОбъектРТУ.ДокументОснование = Неопределено; 
Попытка
    ОбъектРТУ.Записать(РежимЗаписиДокумента.Запись);
    Сообщить("Документ " + ОбъектРТУ + " успешно очищен");
Исключение
    Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;

Важные рекомендации

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

← На главную