Как найти и исправить ссылки на «Объект не найден» в 1С:Зарплата и управление персоналом 3.1?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом
← На главную

В процессе эксплуатации конфигурации «Зарплата и управление персоналом 3.1» пользователи и администраторы часто сталкиваются с неприятной ситуацией: в документах или отчетах вместо фамилии сотрудника или физического лица отображается непонятная строка вида <Объект не найден> (403:81100cc47a203e3f11e9cd4e645d822a). Это так называемая «битая ссылка». Она возникает, когда в базе данных существует запись, ссылающаяся на объект, который физически был удален из таблицы справочника.

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

Разбор структуры идентификатора

Прежде чем приступать к поиску, давайте проанализируем, что именно нам известно. Строка 403:81100cc47a203e3f11e9cd4e645d822a несет в себе важную техническую информацию. Рассмотрим её структуру подробнее:

Для того чтобы использовать этот GUID в программном коде 1С, нам необходимо привести его к стандартному виду (8-4-4-4-12 символов). Для нашего примера 81100cc47a203e3f11e9cd4e645d822a превратится в 81100cc4-7a20-3e3f-11e9-cd4e645d822a. Это преобразование критически важно для корректной работы методов поиска.

Способ 1: Программный поиск через НайтиПоСсылкам

Самый быстрый и точный способ найти все места, где «засветилась» битая ссылка — использовать встроенный метод глобального контекста НайтиПоСсылкам. Рассмотрим, как это реализовать с помощью небольшой внешней обработки или в консоли кода.

Проанализируем алгоритм: сначала мы восстановим объект ссылки по имеющемуся текстовому идентификатору, а затем попросим систему найти все зависимости. Пример кода будет выглядеть следующим образом:


// Определяем текстовый GUID (уже в стандартном формате)
ТекстGUID = "81100cc4-7a20-3e3f-11e9-cd4e645d822a";
НужныйGUID = Новый УникальныйИдентификатор(ТекстGUID);

// Получаем ссылку на объект (даже если его нет в базе, ссылка будет создана в памяти)
СсылкаНаФизЛицо = Справочники.ФизическиеЛица.ПолучитьСсылку(НужныйGUID);

// Помещаем ссылку в массив, так как метод НайтиПоСсылкам работает с массивами
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаНаФизЛицо);

// Выполняем поиск
ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);

// Обходим результат и выводим информацию
Для Каждого Строка Из ТаблицаСсылок Цикл
    Сообщить("Найдена ссылка в объекте: " + Строка.Данные + " (Метаданные: " + Строка.Метаданные.Имя + ")");
КонецЦикла;

Этот метод хорош тем, что он просматривает не только реквизиты документов, но и записи в регистрах сведений, накопления и расчета, что крайне важно для конфигурации ЗУП 3.1.

Способ 2: Создание «объекта-пустышки» для визуализации

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

Выполним следующие шаги:

  1. Создадим новый объект справочника ФизическиеЛица.
  2. Установим ему ссылку принудительно.
  3. Запишем объект с каким-нибудь понятным наименованием (например, «Временный объект для восстановления»).

Посмотрим на пример реализации:


ГуидТекст = "81100cc4-7a20-3e3f-11e9-cd4e645d822a";
НовыйЭлемент = Справочники.ФизическиеЛица.СоздатьЭлемент();

// Устанавливаем ссылку ДО записи объекта
НужнаяСсылка = Справочники.ФизическиеЛица.ПолучитьСсылку(Новый УникальныйИдентификатор(ГуидТекст));
НовыйЭлемент.УстановитьСсылкуНового(НужнаяСсылка);

НовыйЭлемент.Наименование = "Восстановленное физлицо (битая ссылка)";
НовыйЭлемент.Записать();

Сообщить("Объект успешно создан. Теперь во всех документах вместо <Объект не найден> будет отображаться указанное наименование.");

После выполнения этого кода битая ссылка превратится в обычный элемент справочника. Теперь вы сможете использовать стандартную обработку «Поиск и удаление дублей», чтобы заменить это временное лицо на корректное (существующее) во всех местах использования.

Способ 3: Тестирование и исправление (ТИИ)

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

Перейдем в Администрирование — Тестирование и исправление. Нас интересует пункт «Проверка ссылочной целостности». Рассмотрим два варианта настройки:

Способ 4: Поиск через Консоль запросов

Если вам нужно проанализировать ситуацию без внесения изменений, воспользуемся консолью запросов. Простой поиск ГДЕ ФизЛицо = &Ссылка может не сработать, если ссылка действительно «битая». В таких случаях мы рекомендуем проверять наличие ссылки, которая не соединяется с основной таблицей справочника.

Разберем пример запроса, который ищет битые ссылки в регистре сведений ДанныеФизическихЛиц:


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

Этот запрос покажет все записи регистра, где ссылка на физлицо заполнена, но самого физлица в таблице справочника не существует. Подобный подход можно применить к любому документу или регистру в ЗУП 3.1.

Особенности ЗУП 3.1: Почему это происходит?

Проанализируем специфику конфигурации. В «Зарплате и управлении персоналом» битые ссылки чаще всего возникают в двух сценариях:

  1. Синхронизация с Бухгалтерией (БП 3.0): Если в Бухгалтерии объект был удален вручную (через «Удаление помеченных объектов»), а в ЗУП он всё еще используется, при следующем обмене может возникнуть коллизия. Проверьте регистр сведений Соответствия объектов информационных баз.
  2. Объединение карточек: В ЗУП есть помощник «Объединение личных данных». Если в процессе слияния двух физических лиц произошел сбой (например, отключение электричества или ошибка сети), старая ссылка может удалиться из справочника, но остаться в одном из многочисленных регистров расчета зарплаты.

Рекомендации по исправлению

Выяснив причину и найдя все вхождения, мы рекомендуем следующий план действий:

  1. Всегда делайте резервную копию базы перед любыми манипуляциями с битыми ссылками.
  2. Используйте Способ 2 для создания временного объекта. Это самый безопасный путь, так как он не удаляет данные, а лишь делает их «видимыми» для системы.
  3. Воспользуйтесь типовой обработкой «Поиск и замена значений» (ее можно найти на ИТС или в составе инструментов разработчика). Замените созданный временный объект на правильное физическое лицо. Эта обработка корректно перепишет данные во всех таблицах, включая сложные регистры расчета.
  4. После замены обязательно пересчитайте документы, в которых фигурировало данное лицо, если это касается текущего расчетного периода, чтобы убедиться в корректности формирования налогов и взносов.

Таким образом, мы рассмотрели комплексный подход к решению проблемы «Объект не найден». Помните, что в сложных учетных системах, таких как ЗУП 3.1, простое удаление ссылки — это крайняя мера. Лучшим решением всегда будет восстановление объекта или его корректная замена на существующий аналог.

← На главную