Как исправить ошибку "Набор записей, принадлежащий менеджеру записи должен содержать ровно 1 запись"?

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

В этой статье мы подробно разберем ситуацию, когда при работе с документами (чаще всего кадровыми, такими как "Увольнение" или "Прием на работу") или при запуске программы возникает ошибка: "Запись не верна! Набор записей, принадлежащий менеджеру записи должен содержать ровно 1 запись [ОшибкаХранимыхДанных]".

Эта ошибка звучит сложно, но имеет вполне понятную техническую причину. Мы проанализируем, почему она возникает, как найти проблемное место в базе данных и какими способами можно устранить неисправность.

Суть проблемы: Что означает ошибка?

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

Когда разработчик обращается к такому регистру через объект МенеджерЗаписи (например, чтобы прочитать настройки зарплаты), платформа ожидает увидеть в таблице базы данных ровно одну строку (или ноль, если запись еще не создана). Если же в результате сбоя, некорректного обмена данными или ошибки обновления в таблице оказывается две или более записей, платформа не знает, какую из них считать "истинной", и выдает исключение о нарушении целостности данных.

Таким образом, наша задача сводится к поиску регистра, в котором появились дубликаты, и удалению лишних строк.

Способ 1: Диагностика с помощью "Универсального отчета"

Этот способ подходит, если у вас нет возможности или желания писать программный код. Мы воспользуемся встроенным механизмом отчетов.

  1. Откроем раздел Отчеты (или "Все функции") и найдем Универсальный отчет.
  2. В настройках отчета выберем тип объекта — Регистр сведений.
  3. Далее нам нужно методом перебора проверить регистры, которые отвечают за настройки (так как именно в них чаще всего отсутствуют измерения).

    В конфигурации "Бухгалтерия предприятия" или "ЗУП" наиболее частыми виновниками являются:

    • НастройкиЗарплаты
    • НастройкиКадровогоУчета
    • НастройкиВоинскогоУчета
    • ПравилаДляОбменаДанными
    • ФайлыВРабочемКаталоге
  4. Выбираем один из этих регистров, нажимаем Сформировать.
  5. Если в отчете мы видим две и более строк, значит, мы нашли проблемный регистр. В нормальном состоянии там должна быть только одна строка.

Способ 2: Программный поиск проблемного регистра

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

Этот код можно выполнить в обработке с произвольным алгоритмом или в "Консоли кода".


Для Каждого ТекРегистр Из Метаданные.РегистрыСведений Цикл
    // Нас интересуют только регистры без измерений
    Если ТекРегистр.Измерения.Количество() = 0 Тогда
        
        Попытка
            // Создаем набор записей для проверки количества
            Набор = РегистрыСведений[ТекРегистр.Имя].СоздатьНаборЗаписей();
            Набор.Прочитать();
            
            // Если записей больше одной - это ошибка
            Если Набор.Количество() > 1 Тогда
                Сообщить("ОБНАРУЖЕНА ПРОБЛЕМА в регистре: " + ТекРегистр.Имя + ". Количество записей: " + Набор.Количество());
            КонецЕсли;
            
        Исключение
            Сообщить("Не удалось прочитать регистр: " + ТекРегистр.Имя + " | " + ОписаниеОшибки());
        КонецПопытки;
        
    КонецЕсли;
КонецЦикла;

Важное замечание: В некоторых обсуждениях можно встретить условие Набор.Количество() = 2. Это не совсем верно, так как дублей может быть и три, и четыре. Правильнее использовать условие > 1.

Способ 3: Отладка (Если предыдущие способы не помогли)

Иногда ошибка возникает не в очевидных регистрах настроек. В этом случае нам поможет Отладчик.

  1. Запустим конфигуратор и включим режим отладки. Обратите внимание, что если база клиент-серверная, на сервере должен быть запущен режим отладки (ключ -debug).
  2. В настройках отладки включим "Останавливаться по ошибке".
  3. Воспроизведем действия пользователя (например, создание документа "Увольнение").
  4. Платформа должна остановиться в общем модуле. Часто это происходит в модуле ОбщегоНазначения в процедуре СтруктураПоМенеджеруЗаписи или похожей.
  5. В этот момент через "Вычислить выражение" (Shift+F9) мы можем посмотреть значение переменной, отвечающей за имя регистра или сам менеджер записи, чтобы понять, к какой таблице идет обращение.

Как исправить ошибку (Удаление дублей)

После того как мы выяснили имя проблемного регистра (например, пусть это будет НастройкиЗарплаты), нам нужно оставить в нем только одну актуальную запись.

Вариант А: Через интерфейс

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

Вариант Б: Программно (Если кнопки удаления недоступны)

Часто регистры настроек не имеют доступной пользователю формы списка с кнопкой "Удалить". В таком случае мы можем полностью очистить регистр, а затем заново сохранить настройки через штатный интерфейс программы.

Код для очистки конкретного регистра:


// Замените ИмяВашегоРегистра на то, которое вы нашли на этапе диагностики
Рег = РегистрыСведений.НастройкиЗарплаты; 

Набор = Рег.СоздатьНаборЗаписей();
Набор.Записать(); // Запись пустого набора удалит все записи из базы
Сообщить("Регистр очищен.");

После выполнения этого кода:

  1. Зайдите в пользовательском режиме в раздел, соответствующий очищенному регистру (например, Зарплата и кадры - Настройки зарплаты).
  2. Проверьте, что настройки корректны (или заполните их заново).
  3. Нажмите кнопку "Сохранить" или "Записать и закрыть". Программа создаст одну корректную запись.

Почему это происходит? (Профилактика)

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

Мы рекомендуем перед любыми серьезными вмешательствами делать резервную копию базы данных.

← На главную