При обновлении типовых конфигураций 1С, таких как Зарплата и управление персоналом 3.1, Бухгалтерия предприятия 3.0, Комплексная автоматизация 2.4/2.5 или ERP, специалисты часто сталкиваются с критической ошибкой, которая прерывает процесс обновления на этапе выполнения отложенных обработчиков. Текст ошибки обычно выглядит так: «Уже существует вид дохода НДФЛ с таким значением поля Код (XXXX)», где вместо XXXX могут быть коды 2012, 2300, 1011, 1550 или другие.
В этой статье мы подробно разберем причины возникновения этой коллизии и рассмотрим несколько проверенных способов её решения — от стандартных инструментов администратора до низкоуровневых манипуляций с базой данных.
Давайте проанализируем ситуацию. Основная причина кроется в изменениях налогового законодательства и соответствующих изменениях в классификаторах НДФЛ. Разработчики 1С включают в новые релизы обработчики, которые автоматически создают или обновляют элементы в справочнике ВидыДоходовНДФЛ. Проблема возникает в тот момент, когда в базе уже существует элемент с таким же кодом, созданный пользователем вручную или загруженный ранее из других систем.
Посмотрим на пример кода из модуля менеджера справочника, который вызывает сбой:
// Пример процедуры из модуля менеджера справочника ВидыДоходовНДФЛ
ОписатьКодДоходаНДФЛ(, Ставка13, "2012", "Суммы отпускных выплат");
ОписатьКодДоходаНДФЛ(, Ставка13, "2300", "Пособия по временной нетрудоспособности");
// При вызове Объект.Записать() система натыкается на контроль уникальности кода
Обновление пытается программно создать элемент, помеченный как системный, но механизм контроля уникальности (который часто усиливается в новых релизах) блокирует запись из-за дубля по полю Код. Это приводит к аварийному завершению работы обработчика обновления ОбновлениеИнформационнойБазыСлужебный.
Если обновление еще не заблокировало вход в программу (или вы восстановили копию базы), этот способ является самым безопасным и правильным с точки зрения ссылочной целостности. Разберем его по шагам:
Виды доходов НДФЛ.Код.Важный нюанс: Если дубликаты являются предопределенными элементами (имеют значок «шарика» в списке), типовая обработка может их не объединить. В этом случае придется использовать расширенные возможности или другие способы.
Когда база находится в состоянии «Ошибка при обновлении», войти в интерфейс Управляемых форм часто невозможно. Однако существует лазейка через Толстый клиент. Проанализируем этот алгоритм:
/RunModeOrdinaryApplication.Если мы являемся программистами, мы можем временно модифицировать логику записи объекта, чтобы обновление прошло до конца, а затем уже навести порядок в данных. Для этого создадим расширение и добавим в него процедуру ПередЗаписью справочника ВидыДоходовНДФЛ.
&Вместо("ПередЗаписью")
Процедура Ист_ПередЗаписью(Отказ)
Попытка
ПродолжитьВызов(Отказ);
Исключение
// Если код уже существует, мы просто игнорируем запись
// этого конкретного элемента в процессе обновления
ТекстОшибки = ИнформацияОбОшибке().Описание;
Если Найти(ТекстОшибки, "Уже существует вид дохода ндфл") > 0 Тогда
Отказ = Истина;
// Это позволит обработчику обновления не вылетать с критической ошибкой
КонецЕсли;
КонецПопытки;
КонецПроцедуры
После установки такого расширения (обязательно снимите флаг «Безопасный режим»), обновление успешно завершится. Затем необходимо будет вручную через Поиск и замену значений объединить ссылки на дублирующиеся коды и удалить лишние элементы.
Рассмотрим жесткий, но эффективный метод для тех, кто работает с MS SQL Server или PostgreSQL. Выясним причину на уровне базы данных: ошибка возникает из-за нарушения уникального индекса в таблице справочника.
ВидыДоходовНДФЛ. Это можно сделать в консоли запросов или через ПолучитьСтруктуруХраненияБазыДанных(). Допустим, это _Reference67._Code:
SELECT _Code, COUNT(*)
FROM _Reference67
GROUP BY _Code
HAVING COUNT(*) > 1;
DELETE FROM _Reference67 T1
USING _Reference67 T2
WHERE T1.ctid < T2.ctid AND T1._Code = T2._Code;
Внимание: Любые действия на уровне SQL выполняются только при наличии свежей резервной копии и понимании структуры таблиц 1С!
После того как обновление успешно завершится любым из вышеперечисленных способов, крайне важно выполнить следующие действия:
Проанализировав ситуацию, можно сделать вывод: ошибка с дублями кодов НДФЛ — это результат «наслоения» ручного ввода данных на автоматические алгоритмы обновления 1С. Использование режима обычного приложения для восстановления значений является наиболее универсальным способом, подходящим даже для базовых версий программы.