Как исправить ошибку «Обнаружено дублирование ключевых значений в колонке ссылка» в списке сотрудников в 1С:Бухгалтерия 3.0

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

При работе в программе 1С:Бухгалтерия предприятия 3.0 (БП 3.0) или 1С:Зарплата и управление персоналом 3 (ЗУП 3) пользователи и администраторы часто сталкиваются с крайне неприятной ошибкой при открытии справочника «Сотрудники»: «Обнаружено дублирование ключевых значений в колонке "Ссылка"». Ошибка полностью блокирует работу со списком сотрудников, не позволяя оперативно принять на работу нового человека, оформить увольнение или кадровый перевод.

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

Почему возникает эта ошибка и почему консоль запросов «молчит»?

Механизм работы динамического списка в платформе 1С:Предприятие 8.3 устроен таким образом, что каждая строка на экране должна иметь уникальный идентификатор (ключ строки), в качестве которого выступает уникальная ссылка на элемент справочника (поле Ссылка). Если в результате выполнения запроса, лежащего в основе динамического списка, для одной и той же ссылки справочника Сотрудники возвращается две или более строки, платформа выдает ошибку дублирования.

Почему же простой запрос к справочнику в консоли запросов не показывает дублей? На это есть две основные причины:

  1. Программная модификация запроса: Разработчики типовых конфигураций 1С очень часто изменяют исходный текст запроса динамического списка непосредственно в коде модуля формы (например, в процедуре ПриСозданииНаСервере). Исходный текст из конфигуратора дополняется условиями, соединениями и выборками в зависимости от настроек программы.
  2. Влияние настроек пользователя (СКД): Динамический список работает на базе Системы компоновки данных. Если пользователь установил отборы, группировки или добавил дополнительные колонки (через «Изменить форму»), СКД автоматически перестраивает SQL-запрос «на лету», выполняя левые соединения с другими таблицами. Если в этих связанных таблицах есть дублирующиеся записи по конкретному сотруднику, то в результирующей выборке одна ссылка раздваивается, что и вызывает сбой системы.

Рассмотрим по шагам все возможные способы локализации и устранения этой проблемы.

Шаг 1. Поиск дублей в ключевых регистрах сведений кадрового учета

В основе динамического списка сотрудников в БП 3.0 лежат левые соединения с несколькими регистрами сведений. Основные «подозреваемые» — это регистры ТекущиеКадровыеДанныеСотрудников и ТекущаяТарифнаяСтавкаСотрудников. Если по какому-то сотруднику в этих регистрах физически записалось две строки (например, из-за сбоя при записи документов или некорректного переноса данных), динамический список раздвоит строку.

Для поиска таких скрытых дублей запустим консоль запросов и выполним пакетный запрос для детального анализа каждого регистра отдельно:


ВЫБРАТЬ
    ДанныеРегистра.Сотрудник КАК Сотрудник,
    ДанныеРегистра.ФизическоеЛицо КАК ФизическоеЛицо,
    КОЛИЧЕСТВО(1) КАК КоличествоЗаписей
ИЗ
    РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ДанныеРегистра
СГРУППИРОВАТЬ ПО
    ДанныеРегистра.Сотрудник,
    ДанныеРегистра.ФизическоеЛицо
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(1) > 1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДанныеРегистра1.Сотрудник КАК Сотрудник,
    ДанныеРегистра1.ФизическоеЛицо КАК ФизическоеЛицо,
    КОЛИЧЕСТВО(1) КАК КоличествоЗаписей
ИЗ
    РегистрСведений.ТекущаяТарифнаяСтавкаСотрудников КАК ДанныеРегистра1
СГРУППИРОВАТЬ ПО
    ДанныеРегистра1.Сотрудник,
    ДанныеРегистра1.ФизическоеЛицо
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(1) > 1

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

Шаг 2. Анализ «опечатки» в стандартном запросе динамического списка

Внимательно проанализируем фрагмент стандартного запроса динамического списка формы справочника Сотрудники, на который обращают внимание опытные разработчики. В нем присутствует достаточно интересное левое соединение, которое в некоторых релизах конфигурации может вести себя некорректно из-за использования фигурных скобок динамического считывания параметров компоновщика настроек:


{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТекущаяТарифнаяСтавкаСотрудников КАК ТекущаяТарифнаяСтавкаСотрудников
ПО (ТекущаяТарифнаяСтавкаСотрудников.Сотрудник = СправочникСотрудники.Ссылка)
    И (ТекущиеКадровыеДанныеСотрудников.ФизическоеЛицо = СправочникСотрудники.ФизическоеЛицо)}

Обратите внимание на второе условие связи: здесь проверяется поле ФизическоеЛицо таблицы ТекущиеКадровыеДанныеСотрудников вместо таблицы ТекущаяТарифнаяСтавкаСотрудников. Эта опечатка переходит из релиза в релиз. На чистых данных она редко приводит к ошибкам, но если в вашей базе нарушена ссылочная целостность или физическое лицо у сотрудника не заполнено, эта связь начнет множить строки.

Попробуйте скопировать реальный работающий текст запроса непосредственно из отладчика. Для этого:

  1. Откройте конфигуратор, найдите форму списка справочника Сотрудники.
  2. В модуле формы найдите процедуру ПриСозданииНаСервере и поставьте точку останова в самом конце процедуры.
  3. Запустите режим отладки, откройте список сотрудников и остановитесь на точке.
  4. В табло вычислите значение выражения Список.ТекстЗапроса. Скопируйте полученную строку и вставьте её в консоль запросов для тестирования. Именно этот запрос выполняется платформой на самом деле.

Шаг 3. Методический «лайфхак» перезаписи регистров (без программирования)

В конфигурации «1С:Бухгалтерия предприятия 3.0» есть встроенный механизм, который при изменении настроек кадрового учета автоматически очищает, пересчитывает и заново перезаписывает все виртуальные и кэширующие регистры кадровых данных. Мы можем использовать эту особенность для быстрого исправления ошибок без непосредственного вмешательства в конфигурацию.

Выполним следующие шаги:

  1. Перейдем в раздел Зарплата и кадры, далее выберем пункт Настройки зарплаты и откроем подраздел Общие настройки.
  2. Найдем переключатель «Учет расчетов по заработной плате и кадровый учет ведется» и временно переставим его в положение «Во внешней программе».
  3. Нажмем кнопку записи или просто дождемся применения настроек. Программа при этом деактивирует кадровые механизмы и очистит временные таблицы кадрового учета.
  4. Полностью закроем сеанс работы с базой данных 1С (выйдем из программы).
  5. Снова запустим 1С:Бухгалтерию, вернемся в то же меню настроек и переключим параметр обратно в положение «В этой программе».

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

Шаг 4. Сброс настроек отображения формы у пользователя

Если кадровые регистры очищены и пересчитаны, проверка в консоли запросов не выдает дублей, но конкретный пользователь при входе все равно видит ошибку «Обнаружено дублирование ключевых значений...», дело в его персональных настройках формы. Скорее всего, пользователь добавил в список колонку из реквизитов другого связанного справочника, или применил сложный отбор.

Для исправления ситуации выполним сброс настроек:

  1. В правом верхнем углу списка сотрудников нажмем кнопку Еще.
  2. Выберем пункт Установить стандартные настройки (или зайдем в Настроить список и там нажмем аналогичную кнопку сброса).
  3. Если список вообще не открывается и падает в ошибку сразу, сбросим настройки этого пользователя через административный интерфейс: перейдем в Администрирование -> Настройки пользователей и прав -> Персональные настройки пользователей -> Очистка настроек, найдем нужного пользователя, выберем справочник «Сотрудники» и очистим сохраненные настройки формы и параметров выбора.

Шаг 5. Очистка кэша конфигурации

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

  1. Откроем стартер 1С:Предприятия.
  2. Выберем нашу информационную базу и нажмем кнопку Удалить (база удалится только из списка ссылок стартера, сами файлы базы или настройки подключения к серверу останутся нетронутыми).
  3. Нажмем кнопку Добавить и пропишем путь к базе заново. Это приведет к созданию новой уникальной папки кэша на диске и полностью исключит влияние старых кэшированных схем компоновки данных.

Применяя данные подходы последовательно — от простых кадровых регистров к программной отладке запроса и сбросу пользовательских настроек — мы гарантированно устраним ошибку дублирования и вернем справочник «Сотрудники» к штатной и стабильной работе.

← На главную