При работе с информационной базой в 1С:Управление торговлей 11.5 (релиз 11.5.11.96) мы можем столкнуться с ситуацией, когда стандартная обработка «Поиск и удаление дублей», предназначенная для объединения повторяющихся элементов справочников, работает некорректно. В частности, при удалении дубля контрагента и переносе данных на оригинал, связанные объекты, такие как договоры, могут не переноситься, оставаясь привязанными к удаляемому элементу. Давайте вместе разберем эту проблему и рассмотрим возможные пути ее решения.
Стандартная обработка «Поиск и удаление дублей» в типовых конфигурациях 1С, включая УТ 11.5, спроектирована таким образом, чтобы при объединении дублирующихся элементов справочника (например, контрагентов) все ссылки на дубль в документах, регистрах и других объектах базы данных были автоматически заменены на ссылки на выбранный нами "правильный" или оригинальный элемент. После успешной замены ссылок, дубль помечается на удаление. Это означает, что если у нас есть два контрагента — один «Короткое название» (оригинал) и другой «Длинное название» (дубль), и у дубля есть привязанные договоры, то при корректной работе обработки эти договоры должны быть перепривязаны к контрагенту «Короткое название».
Однако, в нашем случае, мы видим отклонение от этого ожидаемого поведения: договоры остаются привязанными к дублю, даже если мы просто помечаем дубль на удаление. Это является серьезной проблемой, так как нарушается целостность данных и затрудняется дальнейшая работа с контрагентами и их взаиморасчетами.
Почему это происходит? Согласно информации из форума, для версии УТ 11.5.11.96 зарегистрирована ошибка под номером 00-00534485. Наличие зарегистрированной ошибки подтверждает, что данная проблема является известной и связана с некорректной работой самой конфигурации или ее стандартных механизмов в конкретном релизе. Это может быть связано с особенностями обработки определенных типов ссылок или спецификой данных, приводящей к сбою в логике переноса.
Учитывая, что стандартная обработка в данном релизе работает некорректно из-за известной ошибки, нам потребуется использовать альтернативные методы для объединения дублей и переноса связанных данных. Рассмотрим несколько подходов.
Одним из наиболее мощных и гибких решений является использование внешней обработки «Поиск дублей и замена ссылок ИР», которая входит в состав подсистемы «Инструменты разработчика», разработанной Сергеем Старых. Эта подсистема значительно расширяет возможности работы с данными в 1С и часто используется разработчиками и опытными пользователями для решения сложных задач по работе с базой.
Это набор утилит и обработок, которые предоставляют расширенные возможности для анализа, отладки и модификации данных в 1С. Они позволяют осуществлять более глубокий поиск дублей, сравнивать реквизиты по сложным правилам, анализировать ссылающиеся объекты и выполнять выборочную замену ссылок по всей базе данных.
Обработка «Поиск дублей и замена ссылок ИР» находится не на просторах интернета в виде отдельного файла, а является частью подсистемы «Инструменты разработчика». Ее можно скачать, например, с таких ресурсов, как Инфостарт. Рекомендуемый способ использования — это установка в виде расширения конфигурации (вариант «Расширение»), что позволяет применять инструменты без изменения основной конфигурации. Для работы с подсистемой часто требуется запуск 1С в режиме толстого клиента управляемого приложения.
Давайте рассмотрим общие шаги, как мы можем использовать эту обработку для решения нашей проблемы:
Контрагенты.Иногда, в случае проблем со стандартным переносом ссылок, можно попробовать использовать обработку «Удаление помеченных объектов». Эта обработка предназначена для окончательного удаления объектов, которые уже помечены на удаление, но в процессе удаления она также пытается перенести оставшиеся ссылки на оригиналы, если такие связи настроены в конфигурации. Однако, это менее надежный метод, особенно учитывая зарегистрированную ошибку.
Мы должны вручную пометить контрагента-дубля на удаление. Для этого откроем карточку дубля, найдем кнопку «Еще» или «Действия» и выберем пункт «Пометить на удаление / Снять пометку». Необходимо убедиться, что дубль именно помечен на удаление, а не удален.
Перейдем в раздел «Администрирование», найдем пункт «Удаление помеченных объектов» и запустим его. Мы можем выбрать режим «Выборочное удаление» и указать, что хотим удалить помеченные объекты типа «Контрагенты», чтобы не удалять лишнее.
Обработка попытается удалить помеченные объекты и, в процессе, перенести все оставшиеся ссылки. После завершения работы обработки мы должны тщательно проверить, перенеслись ли договоры на оригинал. Если проблема с ошибкой 00-00534485 связана именно с этим механизмом, то успех не гарантирован.
В случае, если ни один из вышеуказанных методов не приводит к желаемому результату, или если мы сталкиваемся с очень специфическими требованиями к переносу данных (например, необходимо перенести не только договоры, но и специфические регистры сведений или изменить данные в документах по определенным правилам), нам, возможно, придется прибегнуть к разработке собственной внешней обработки. Это требует наличия квалифицированного программиста 1С.
Программист сможет:
Пример концепции кода (без учета всех нюансов и ошибок):
// Предполагаем, что "ДубльКонтрагента" - это ссылка на дублирующий контрагент
// "ОригиналКонтрагента" - это ссылка на оригинальный контрагент
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоговорыКонтрагентов.Ссылка КАК Ссылка
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.Владелец = &ДубльКонтрагента";
Запрос.УстановитьПараметр("ДубльКонтрагента", ДубльКонтрагента);
Выборка = Запрос.Выполнить().Выбрать();
НачатьТранзакцию();
Попытка
Пока Выборка.Следующий() Цикл
ОбъектДоговор = Выборка.Ссылка.ПолучитьОбъект();
ОбъектДоговор.Владелец = ОригиналКонтрагента;
// Мы можем также изменить другие реквизиты, если это необходимо,
// например, если в договоре есть явное поле "Контрагент", а не только "Владелец".
ОбъектДоговор.Записать();
КонецЦикла;
// После переноса договоров, мы можем пометить дубль на удаление
ОбъектДубль = ДубльКонтрагента.ПолучитьОбъект();
ОбъектДубль.ПометкаУдаления = Истина;
ОбъектДубль.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка при переносе договоров: " + ОписаниеОшибки());
КонецПопытки;
Важно помнить, что при работе с программным изменением данных мы должны быть крайне осторожны и учитывать все возможные последствия, всегда работать с резервной копией и тщательно тестировать код.
Независимо от выбранного метода, существуют общие правила и рекомендации, которые мы должны соблюдать при работе с удалением и объединением дублей в 1С:
Перед началом любых операций по удалению или объединению объектов, особенно если речь идет о замене ссылок, обязательно создайте полную и актуальную резервную копию информационной базы. Это наша страховка на случай непредвиденных ошибок или некорректных действий.
После выполнения обработки по объединению дублей мы должны не просто убедиться, что дубль помечен на удаление, но и тщательно проверить целостность данных. Это включает:
Если после работы обработки мы видим такое сообщение, это означает, что в каких-то объектах (документах, регистрах) ссылка на дубль не была заменена. В этом случае нам нужно будет вручную найти и исправить эти ссылки. Обычно, обработка указывает, в каких именно объектах возникли проблемы.
После того, как мы убедились, что все ссылки успешно перенесены на оригинал, а дубли помечены на удаление, мы можем окончательно удалить эти объекты из базы данных. Для этого используем обработку «Удаление помеченных объектов» (находится в разделе «Администрирование»). Если объекты не удаляются, это верный признак того, что на них все еще существуют ссылки, которые не были перенесены или заменены.
В нашем случае, учитывая зарегистрированную ошибку в УТ 11.5.11.96, наиболее надежным и контролируемым решением будет использование специализированных инструментов, таких как «Поиск дублей и замена ссылок ИР» из подсистемы «Инструменты разработчика». Эти инструменты предоставляют нам гораздо больше контроля над процессом замены ссылок и позволяют избежать проблем, связанных с некорректной работой стандартного функционала.