Возникает ошибка "Нарушено условие уникальности данных" при работе с базой 1С

Экспорт в PDF Преобразовать страницу в формат Open Document

Дата создания: 2026/01/19 13:59 (C) mihanik

Дано

  • PostgreSQL используется в качестве СУБД в клиент-серверной версии 1С:Предприятие
  • При работе с базой 1С возникает ошибка «Нарушено условие уникальности данных»
Нарушено условие уникальности данных.
Попытка вставки неуникального значения в уникальный индекс: 23505: ERROR: duplicate key value violates unique constraint "params_pkey" 
DETAIL: Key (filename, partno)=(ibparams.inf, 0) already exists. CONTEXT: COPY params, line 6
Завершить работу
Перезапустить…

Надо

Избавиться от этой ошибки

Решение

PostgreSQL установлен в ОС Linux.

Шаг 1

Предположим, что название базы в PostgreSQL 4ce2951617ef477683c1451ef446a4ea

Становимся пользователем postgres

su postgres

Подключаемся к базе данных

psql 4ce2951617ef477683c1451ef446a4ea

Шаг 2

Проверяем существование записи в базе

SELECT * FROM params WHERE filename = 'ibparams.inf' AND partno = 0; 
Данные для запроса взяты из формулировки ошибки.

DETAIL: Key (filename, partno)=(ibparams.inf, 0) already exists

Я получил следующий «выхлоп»

   filename   |      creation       |      modified       | attributes | datasize |                                                                                                                                                     
                                                    binarydata                                                                                                                                                                          
                               | partno 
--------------+---------------------+---------------------+------------+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------+--------
 ibparams.inf | 2022-12-14 08:38:40 | 2024-07-12 12:47:38 |          0 |      204 | \xefbbbf7b32302c302c302c312c22222c313230302c38363430302c31303435373131352d353363612d366361632d396338632d3265303531303431323962382c35613637626263392d
346631642d363936612d396538662d3438633163643232643836642c2d312c302c342c352c33302c22222c0d0a7b302c22222c332c382c332c33302c22222c22222c22222c353439353937373736383330383338313032322c3436352c312c22222c22222c22222c22222c3136302c307d2c302c
302c302c302c302c3433323030307d |      0
 ibparams.inf | 2018-07-28 00:06:21 | 2024-07-12 12:47:38 |          0 |      204 | \xefbbbf7b32302c302c302c312c22222c313230302c38363430302c31303435373131352d353363612d366361632d396338632d3265303531303431323962382c35613637626263392d
346631642d363936612d396538662d3438633163643232643836642c2d312c302c342c352c33302c22222c0d0a7b302c22222c332c382c332c33302c22222c22222c22222c353439353937373736383330383338313032322c3436352c312c22222c22222c22222c22222c3136302c307d2c302c
302c302c302c302c3433323030307d |      0
(2 строки)

Видим, что действительно у нас 2 (две) строки с одинаковыми параметрами.

Делаем вывод, что нам нужно одну строку удалить.

Шаг 3

Удаляем одну лишнюю строку

DELETE FROM params
WHERE ctid IN (
    SELECT ctid
    FROM params
    WHERE filename = 'ibparams.inf' AND partno = 0
    ORDER BY ctid
    LIMIT 1
);
Почему этот метод безопасен
  • ctid — внутренний идентификатор строки PostgreSQL, уникальный для каждой записи.
  • Запрос удаляет только одну строку (первую по порядку ctid), не затрагивая остальные данные.
  • Нет риска удалить «не ту» запись, если в таблице есть другие значимые поля.

Проверяем, что осталась только одна строка

SELECT * FROM params WHERE filename = 'ibparams.inf' AND partno = 0; 
Должна вернуться ровно 1 строка. Если больше — повторите удаление (но сначала выясните причину дублирования).

Шаг 4

Делаем резервную копию базы 1С

Затем запускаем тестирование базы 1С

Для этого заходим в конфигуратор, а потом:
Администрирование → Тестирование и исправление → Отметьте «Проверка логической целостности», «Пересчёт итогов».

ВАЖНО

ОЧЕНЬ ВАЖНО!
Это может сэкономить вам кучу времени!!!

У меня в базе оказалось несколько filename с дублирующимися записями.

Чтобы найти все filename с расширением .inf, у которых есть дубликаты при partno = 0, используйте следующий SQL‑запрос:

SELECT 
    filename,
    COUNT(*) AS duplicate_count
FROM params
WHERE
    partno = 0
    AND filename LIKE '%.inf'
GROUP BY filename
HAVING COUNT(*) > 1
ORDER BY filename;

У меня этот запрос выдал 2 строки

   filename   | duplicate_count 
--------------+-----------------
 ibparams.inf |               2
 log.inf      |               2
(2 строки)

Пришлось удалять дублирующиеся строки в двух filename

Источники

Просторы интернета и общение с ИИ https://alice.yandex.ru

⇑ Наверх ⇑

В моей WIKI постоянно ведётся какая-то работа со статьями.
Если у вас возникли вопросы или замечания,
можете их отправлять на почту support@mihanik.net
Только авторизованные участники могут оставлять комментарии.
субд/postgresql/возникает_ошибка_нарушено_условие_уникальности_данных_при_работе_с_базой_1с.txt · Последнее изменение: 2026/01/20 03:48 — mihanik
Яндекс.Метрика