В современных конфигурациях на базе платформы 1С:Предприятие 8.3, таких как Управление торговлей 11 (УТ 11), ERP Управление предприятием 2 и Комплексная автоматизация 2, пользователи часто сталкиваются с неприятным визуальным эффектом: один и тот же документ (например, «Списание безналичных денежных средств») отображается в списке двумя, тремя или более строками. При этом, если пометить на удаление одну строку, помечаются и все остальные, а консоль запросов подтверждает, что в базе данных существует только один экземпляр объекта. Разберем подробно, почему это происходит и как привести интерфейс в порядок.
Для начала проанализируем ситуацию с технической точки зрения. В старых версиях 1С динамические списки обращались напрямую к таблицам документов. В крупных базах это приводило к замедлению работы, если в списке нужно было вывести данные из разных типов документов (например, в журнале безналичных платежей). Чтобы ускорить работу, разработчики фирмы «1С» внедрили механизм реестра документов.
Этот механизм состоит из двух ключевых компонентов:
РеестрДокументов: это плоская таблица, в которой хранятся основные реквизиты документов (дата, номер, сумма, организация и т.д.). Именно из этого регистра система берет данные для отображения в списке.КлючиРеестраДокументов: вспомогательный объект, который хранит уникальные комбинации ключевых реквизитов. Каждая запись в регистре сведений ссылается на элемент этого справочника.Проблема «затроения» строк возникает тогда, когда в регистре РеестрДокументов по какой-то причине появляется несколько записей для одного и того же документа. Рассмотрим подробнее, как это исправить.
Первым делом нам необходимо убедиться, что проблема действительно в реестре. Для этого выполним следующие действия:
РеестрДокументов.Если в результате отбора мы видим несколько строк вместо одной — причина найдена. Каждая такая строка соответствует отдельному элементу в справочнике КлючиРеестраДокументов. Часто это случается при программной загрузке данных (например, из клиент-банка), когда документ записывается несколько раз, и система не успевает корректно обновить кэш ключей.
Самый простой и безопасный способ заставить систему пересчитать записи в реестре — это инициировать штатную процедуру обновления при записи объекта. Разберем по шагам, как это сделать без изменения данных:
ПриЗаписи, которые должны очистить старые записи в РеестрДокументов и создать одну актуальную.Проанализируем ситуацию: если ручная перезапись не помогла или документов слишком много, стоит обратиться к фоновым процессам. В конфигурациях предусмотрено специальное регламентное задание, отвечающее за поддержание реестра в актуальном состоянии. Оно называется «Текстовое извлечение и обновление реестра документов».
Попробуем запустить его принудительно:
Дождемся завершения выполнения и проверим список документов. Часто системные механизмы самоочистки срабатывают именно на этом этапе.
Если предыдущие методы не помогли, значит, проблема засела глубже — в справочнике КлючиРеестраДокументов. Рассмотрим пример, когда для одной организации и одного типа документа создалось несколько идентичных ключей. В этом случае поможет типовая обработка «Поиск и удаление дублей».
Важно: перед выполнением подобных операций обязательно создайте резервную копию базы данных!
Алгоритм работы:
Ключи реестра документов.Если вы столкнулись с массовым затроением после некорректного импорта, можно воспользоваться программным методом очистки записей. Рассмотрим пример кода, который принудительно обновляет реестр для конкретного документа:
// Пример принудительного обновления реестра для документа
ДокументОбъект = ПроблемнаяСсылка.ПолучитьОбъект();
// Установка признака необходимости обновления (зависит от версии БСП)
ДокументОбъект.ДополнительныеСвойства.Вставить("ПересчитатьРеестрДокументов", Истина);
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Также проанализируем возможность полной очистки регистра. В исключительных случаях, когда объем поврежденных данных велик, программисты прибегают к полной очистке РегистрСведений.РеестрДокументов с последующим запуском процедуры РеестрДокументов.ОбновитьВесьРеестр() (название метода может отличаться в зависимости от версии конфигурации). Это запустит полное переформирование списка, что может занять длительное время, но гарантированно уберет все визуальные дубли.
Выясним причину появления таких «хвостов». Чаще всего это происходит при использовании сторонних обработок загрузки из банк-клиента или обменов данными, которые записывают документы в режиме ОбменДанными.Загрузка = Истина. В этом режиме многие стандартные проверки и обновления регистров (включая реестр документов) отключаются.
Чтобы избежать этого в будущем, рекомендуем:
КлючейРеестра.Подводя итог, можно сказать, что «затроение» в списках — это лишь рассинхронизация между основным объектом и его «отражением» в оптимизированном реестре. Использование перезаписи объектов или чистки справочника ключей позволяет быстро вернуть интерфейс 1С в рабочее состояние.