Как исправить ошибку «Уже существует вид дохода НДФЛ с таким значением поля Код» при обновлении 1С

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

При обновлении типовых конфигураций 1С, таких как Зарплата и управление персоналом 3.1, Бухгалтерия предприятия 3.0, Комплексная автоматизация 2.4/2.5 или ERP, специалисты часто сталкиваются с критической ошибкой, которая прерывает процесс обновления на этапе выполнения отложенных обработчиков. Текст ошибки обычно выглядит так: «Уже существует вид дохода НДФЛ с таким значением поля Код (XXXX)», где вместо XXXX могут быть коды 2012, 2300, 1011, 1550 или другие.

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

Почему возникает эта ошибка?

Давайте проанализируем ситуацию. Основная причина кроется в изменениях налогового законодательства и соответствующих изменениях в классификаторах НДФЛ. Разработчики 1С включают в новые релизы обработчики, которые автоматически создают или обновляют элементы в справочнике ВидыДоходовНДФЛ. Проблема возникает в тот момент, когда в базе уже существует элемент с таким же кодом, созданный пользователем вручную или загруженный ранее из других систем.

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


// Пример процедуры из модуля менеджера справочника ВидыДоходовНДФЛ
ОписатьКодДоходаНДФЛ(, Ставка13, "2012", "Суммы отпускных выплат");
ОписатьКодДоходаНДФЛ(, Ставка13, "2300", "Пособия по временной нетрудоспособности");
// При вызове Объект.Записать() система натыкается на контроль уникальности кода

Обновление пытается программно создать элемент, помеченный как системный, но механизм контроля уникальности (который часто усиливается в новых релизах) блокирует запись из-за дубля по полю Код. Это приводит к аварийному завершению работы обработчика обновления ОбновлениеИнформационнойБазыСлужебный.

Способ 1: Использование типовой обработки «Поиск и удаление дублей»

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

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных.
  2. Выберем гиперссылку Поиск и удаление дублей.
  3. В поле «Искать в:» выберем Виды доходов НДФЛ.
  4. В правилах отбора укажем условие соответствия по полю Код.
  5. Нажмем кнопку Найти дубли. Программа выведет список элементов с одинаковыми кодами.
  6. Нам необходимо определить «Оригинал» (обычно это предопределенный элемент или тот, который имеет больше ссылок) и нажать Удалить дубли.
  7. После завершения процедуры обязательно перейдем в Удаление помеченных объектов и физически удалим дублирующиеся записи.

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

Способ 2: Запуск в режиме обычного приложения (для Базовых версий и блокировки UI)

Когда база находится в состоянии «Ошибка при обновлении», войти в интерфейс Управляемых форм часто невозможно. Однако существует лазейка через Толстый клиент. Проанализируем этот алгоритм:

  1. Закроем все сеансы работы с базой.
  2. В дополнительных параметрах запуска (в списке баз кнопка «Изменить») пропишем команду: /RunModeOrdinaryApplication.
  3. Запустим базу. Она откроется в интерфейсе «Обычное приложение» (похожем на 1С 8.2), где стандартные блокировки Управляемого приложения могут не сработать.
  4. Перейдем в меню Операции — Справочники — Виды доходов НДФЛ.
  5. В командной панели справочника нажмем Все действия (или «Еще») и выберем пункт Восстановить начальные значения.
  6. Эта процедура автоматически пометит на удаление лишние элементы, которые конфликтуют с системным списком.
  7. После этого выполним Операции — Удаление помеченных объектов.
  8. Закроем программу, уберем параметр запуска и запустим обновление в обычном режиме.

Способ 3: Использование расширения для «обхода» ошибки

Если мы являемся программистами, мы можем временно модифицировать логику записи объекта, чтобы обновление прошло до конца, а затем уже навести порядок в данных. Для этого создадим расширение и добавим в него процедуру ПередЗаписью справочника ВидыДоходовНДФЛ.


&Вместо("ПередЗаписью")
Процедура Ист_ПередЗаписью(Отказ)
    Попытка
        ПродолжитьВызов(Отказ);
    Исключение
        // Если код уже существует, мы просто игнорируем запись 
        // этого конкретного элемента в процессе обновления
        ТекстОшибки = ИнформацияОбОшибке().Описание;
        Если Найти(ТекстОшибки, "Уже существует вид дохода ндфл") > 0 Тогда
             Отказ = Истина; 
             // Это позволит обработчику обновления не вылетать с критической ошибкой
        КонецЕсли;
    КонецПопытки;
КонецПроцедуры

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

Способ 4: Прямое удаление через SQL (для клиент-серверного варианта)

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

  1. Найдем имя таблицы справочника ВидыДоходовНДФЛ. Это можно сделать в консоли запросов или через ПолучитьСтруктуруХраненияБазыДанных(). Допустим, это _Reference67.
  2. Выполним запрос для поиска дублей по колонке _Code:
    
    SELECT _Code, COUNT(*) 
    FROM _Reference67 
    GROUP BY _Code 
    HAVING COUNT(*) > 1;
    
  3. Удалим одну из записей-дублей (предварительно убедившись, какая из них лишняя). Например, в PostgreSQL это можно сделать так:
    
    DELETE FROM _Reference67 T1 
    USING _Reference67 T2 
    WHERE T1.ctid < T2.ctid AND T1._Code = T2._Code;
    

Внимание: Любые действия на уровне SQL выполняются только при наличии свежей резервной копии и понимании структуры таблиц 1С!

Рекомендации по завершению работ

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

Проанализировав ситуацию, можно сделать вывод: ошибка с дублями кодов НДФЛ — это результат «наслоения» ручного ввода данных на автоматические алгоритмы обновления 1С. Использование режима обычного приложения для восстановления значений является наиболее универсальным способом, подходящим даже для базовых версий программы.

← На главную