Почему при тестировании и исправлении удаляются движения документов, созданных в расширении

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

При активном использовании механизмов расширений в 1С разработчики часто сталкиваются с ситуацией, когда новые объекты метаданных, созданные внутри расширения, ведут себя нестабильно при выполнении регламентных операций. Одна из самых серьезных проблем — внезапное исчезновение записей в регистрах бухгалтерии или накопления после проведения процедуры Тестирования и исправления (ТИИ). Выглядит это так: документ в расширении проведен, движения в базе есть, но стоит запустить ТИИ, как система рапортует об удалении "лишних" записей, ссылающихся на несуществующие объекты.

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

Разберем причину возникновения проблемы: архитектурный конфликт

Для того чтобы понять, почему Тестирование и исправление удаляет записи, нам необходимо заглянуть на уровень хранения данных в СУБД. Проанализируем механизм работы ссылочной целостности. В основной конфигурации существует регистр (например, Хозрасчетный). Поле Регистратор в этом регистре имеет составной тип данных, который жестко определен в основной конфигурации. Когда мы в расширении создаем новый документ и указываем его в качестве регистратора для этого регистра, платформа должна динамически расширить этот составной тип.

Однако в старых релизах платформы (в частности, 8.3.13 и 8.3.14) при работе в режиме совместимости 8.3.12 и ниже, этот механизм работал с особенностями:

  1. TableID и типы данных: Объекты расширений получают внутренние идентификаторы типов из специального диапазона. Механизм ТИИ, запущенный из Конфигуратора, иногда работает «ниже» уровня расширений. Он видит в таблице движений ссылку на тип объекта, который отсутствует в основной конфигурации, и интерпретирует его как объект неизвестного типа.
  2. Режим совместимости: Если конфигурация находится в режиме совместимости 8.3.12, многие новые возможности расширений по изменению структуры существующих таблиц блокируются или эмулируются виртуально.
  3. Особенности ТИИ: Процедура проверки ссылочной целостности при определенных настройках очищает записи, если не может найти метаданные регистратора в основной схеме базы данных.

Вариант решения №1: Обновление платформы и режима совместимости

Как показывает практика и обсуждения экспертов, стабильная работа с новыми метаданными в расширениях началась с релизов 8.3.15 и выше. Проанализируем, что меняется при переходе на новые версии:

В новых версиях платформы механизмы расширения метаданных были существенно переработаны. Если вы планируете создавать свои документы и использовать их как регистраторы для типовых регистров, рекомендуется:

Важный момент: Если вы используете платформу 8.3.13, расширения в ней считаются "недоделанными" для работы с глубоким изменением структуры данных. В этом случае риск потери данных при ТИИ остается крайне высоким.

Вариант решения №2: Методически правильное расширение регистра

Если нам необходимо добавить новый документ как регистратор к типовому регистру, недостаточно просто создать документ. Рассмотрим правильную последовательность действий:

  1. Добавьте сам объект РегистрБухгалтерии.Хозрасчетный (или другой нужный регистр) в ваше расширение.
  2. В расширении откройте свойства этого регистра и убедитесь, что в списке регистраторов отмечен ваш новый документ, созданный в этом же расширении.
  3. Проверьте, что в свойствах расширения стоит корректное назначение (например, Адаптация или Дополнение).

Проанализируем ситуацию: когда мы добавляем регистр в расширение, платформа начинает более корректно отслеживать связи между "родными" таблицами и таблицами расширения. Однако помните, что даже при таком подходе на старых платформах ТИИ может вести себя агрессивно.

Вариант решения №3: Использование «Документа-контейнера» (Самый надежный способ)

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

Рассмотрим алгоритм реализации:

  1. В основной конфигурации создаем новый документ (например, пр_ДокументКонтейнер).
  2. Назначаем его регистратором всех необходимых регистров в основной конфигурации.
  3. В расширении мы полностью "перехватываем" этот документ:
    • Меняем его синоним на понятный пользователю.
    • Добавляем необходимые реквизиты через расширение.
    • Создаем формы документа в расширении.
    • Пишем логику проведения в модуле объекта расширения.

Почему это работает? С точки зрения платформы и механизма ТИИ, этот документ является частью основной конфигурации. Ссылочная целостность проверяется по стандартным правилам, идентификатор типа объекта (TableID) всегда известен системе, независимо от того, подключено расширение в данный момент или нет. Это исключает удаление движений при любых проверках.

Программная проверка движений

Иногда полезно перед запуском ТИИ убедиться, что ссылки в регистре корректны. Рассмотрим пример кода, который позволяет проверить, какие записи в регистре накопления могут быть проблемными:


Процедура ПроверитьДвиженияНаБитыеСсылки()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ХозрасчетныйДвижения.Регистратор КАК Регистратор,
        |   ХозрасчетныйДвижения.Период КАК Период
        |ИЗ
        |   РегистрБухгалтерии.Хозрасчетный КАК ХозрасчетныйДвижения
        |ГДЕ
        |   ХозрасчетныйДвижения.Регистратор.Ссылка ЕСТЬ NULL";
    
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Пока Выборка.Следующий() Цикл
            Сообщить("Найден битый регистратор: " + Выборка.Регистратор);
        КонецЦикла;
    Иначе
        Сообщить("Ошибок ссылочной целостности не обнаружено.");
    КонецЕсли;
КонецПроцедуры

Если этот код возвращает записи, значит, ТИИ гарантированно их удалит. Если записи возвращаются только при отключенном расширении — значит, проблема именно в механизме интеграции метаданных расширения и основной базы.

Рекомендации по безопасному проведению ТИИ

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

Выясним причину удаления окончательно: если при выполнении запроса РЕГ.Регистратор ССЫЛКА Документ.МойДокументИзРасширения система выдает ошибку или Ложь в тех местах, где записи должны быть, значит, текущий релиз платформы некорректно обрабатывает расширение типов в физических таблицах. В таком случае единственным выходом будет либо обновление платформы, либо переход к схеме с "документом-контейнером" в основной конфигурации.

Подведем итог: расширения — мощный инструмент, но для изменения структуры регистров (особенно типовых, таких как Хозрасчетный) требуется современная платформа (8.3.15+) и осторожность при выполнении низкоуровневых операций с базой данных.

← На главную