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