При работе в программе 1С:Бухгалтерия предприятия 3.0 (БП 3.0) или 1С:Зарплата и управление персоналом 3 (ЗУП 3) пользователи и администраторы часто сталкиваются с крайне неприятной ошибкой при открытии справочника «Сотрудники»: «Обнаружено дублирование ключевых значений в колонке "Ссылка"». Ошибка полностью блокирует работу со списком сотрудников, не позволяя оперативно принять на работу нового человека, оформить увольнение или кадровый перевод.
Самое коварное в этой ситуации — стандартная проверка через консоль запросов по тексту из конфигуратора часто показывает, что никаких дублирующихся записей в справочнике нет. В этой статье мы подробно разберем, почему возникает эта ошибка, как провести глубокую диагностику базы данных и какие практические шаги помогут быстро вернуть систему в рабочее состояние.
Механизм работы динамического списка в платформе 1С:Предприятие 8.3 устроен таким образом, что каждая строка на экране должна иметь уникальный идентификатор (ключ строки), в качестве которого выступает уникальная ссылка на элемент справочника (поле Ссылка). Если в результате выполнения запроса, лежащего в основе динамического списка, для одной и той же ссылки справочника Сотрудники возвращается две или более строки, платформа выдает ошибку дублирования.
Почему же простой запрос к справочнику в консоли запросов не показывает дублей? На это есть две основные причины:
ПриСозданииНаСервере). Исходный текст из конфигуратора дополняется условиями, соединениями и выборками в зависимости от настроек программы.Рассмотрим по шагам все возможные способы локализации и устранения этой проблемы.
В основе динамического списка сотрудников в БП 3.0 лежат левые соединения с несколькими регистрами сведений. Основные «подозреваемые» — это регистры ТекущиеКадровыеДанныеСотрудников и ТекущаяТарифнаяСтавкаСотрудников. Если по какому-то сотруднику в этих регистрах физически записалось две строки (например, из-за сбоя при записи документов или некорректного переноса данных), динамический список раздвоит строку.
Для поиска таких скрытых дублей запустим консоль запросов и выполним пакетный запрос для детального анализа каждого регистра отдельно:
ВЫБРАТЬ
ДанныеРегистра.Сотрудник КАК Сотрудник,
ДанныеРегистра.ФизическоеЛицо КАК ФизическоеЛицо,
КОЛИЧЕСТВО(1) КАК КоличествоЗаписей
ИЗ
РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ДанныеРегистра
СГРУППИРОВАТЬ ПО
ДанныеРегистра.Сотрудник,
ДанныеРегистра.ФизическоеЛицо
ИМЕЮЩИЕ
КОЛИЧЕСТВО(1) > 1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДанныеРегистра1.Сотрудник КАК Сотрудник,
ДанныеРегистра1.ФизическоеЛицо КАК ФизическоеЛицо,
КОЛИЧЕСТВО(1) КАК КоличествоЗаписей
ИЗ
РегистрСведений.ТекущаяТарифнаяСтавкаСотрудников КАК ДанныеРегистра1
СГРУППИРОВАТЬ ПО
ДанныеРегистра1.Сотрудник,
ДанныеРегистра1.ФизическоеЛицо
ИМЕЮЩИЕ
КОЛИЧЕСТВО(1) > 1
Если в результате выполнения этого запроса вы увидите строки с сотрудниками, это означает, что в соответствующих регистрах присутствуют физические дубли. Вам необходимо перейти в эти регистры (через меню «Функции для технического специалиста» или обработку «Редактирование регистров») и вручную или программно удалить лишние дублирующиеся записи, оставив только по одной актуальной записи на каждого сотрудника.
Внимательно проанализируем фрагмент стандартного запроса динамического списка формы справочника Сотрудники, на который обращают внимание опытные разработчики. В нем присутствует достаточно интересное левое соединение, которое в некоторых релизах конфигурации может вести себя некорректно из-за использования фигурных скобок динамического считывания параметров компоновщика настроек:
{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТекущаяТарифнаяСтавкаСотрудников КАК ТекущаяТарифнаяСтавкаСотрудников
ПО (ТекущаяТарифнаяСтавкаСотрудников.Сотрудник = СправочникСотрудники.Ссылка)
И (ТекущиеКадровыеДанныеСотрудников.ФизическоеЛицо = СправочникСотрудники.ФизическоеЛицо)}
Обратите внимание на второе условие связи: здесь проверяется поле ФизическоеЛицо таблицы ТекущиеКадровыеДанныеСотрудников вместо таблицы ТекущаяТарифнаяСтавкаСотрудников. Эта опечатка переходит из релиза в релиз. На чистых данных она редко приводит к ошибкам, но если в вашей базе нарушена ссылочная целостность или физическое лицо у сотрудника не заполнено, эта связь начнет множить строки.
Попробуйте скопировать реальный работающий текст запроса непосредственно из отладчика. Для этого:
Сотрудники.ПриСозданииНаСервере и поставьте точку останова в самом конце процедуры.Список.ТекстЗапроса. Скопируйте полученную строку и вставьте её в консоль запросов для тестирования. Именно этот запрос выполняется платформой на самом деле.В конфигурации «1С:Бухгалтерия предприятия 3.0» есть встроенный механизм, который при изменении настроек кадрового учета автоматически очищает, пересчитывает и заново перезаписывает все виртуальные и кэширующие регистры кадровых данных. Мы можем использовать эту особенность для быстрого исправления ошибок без непосредственного вмешательства в конфигурацию.
Выполним следующие шаги:
В этот момент система в фоновом режиме запустит транзакцию по полному пересчету и заполнению регистров ТекущиеКадровыеДанныеСотрудников и ТекущаяТарифнаяСтавкаСотрудников на основании актуальных проведенных кадровых документов (Приемы на работу, Кадровые переводы, Увольнения). Все некорректные и «осиротевшие» записи-дубли будут автоматически удалены из базы данных.
Если кадровые регистры очищены и пересчитаны, проверка в консоли запросов не выдает дублей, но конкретный пользователь при входе все равно видит ошибку «Обнаружено дублирование ключевых значений...», дело в его персональных настройках формы. Скорее всего, пользователь добавил в список колонку из реквизитов другого связанного справочника, или применил сложный отбор.
Для исправления ситуации выполним сброс настроек:
В редких случаях дублирование может быть фантомным, вызванным некорректным кэшированием метаданных на рабочем компьютере пользователя после обновления конфигурации. Рекомендуется выполнить стандартную процедуру очистки кэша платформы:
Применяя данные подходы последовательно — от простых кадровых регистров к программной отладке запроса и сбросу пользовательских настроек — мы гарантированно устраним ошибку дублирования и вернем справочник «Сотрудники» к штатной и стабильной работе.