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

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

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

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

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

При обновлении конфигурации программа пытается автоматически заполнить справочники ОснованияУвольнения и ПричиныУвольненияПФР актуальными данными из своих внутренних макетов. Это необходимо для корректного формирования отчетности (например, ЕФС-1). Ошибка возникает в следующих случаях:

  1. Ручной ввод данных: Бухгалтер ранее создал элемент справочника вручную с таким же наименованием, которое теперь 1С пытается создать как «системное».
  2. Дублирование GUID: В базе уже есть элемент с таким именем, но его внутренний идентификатор не совпадает с тем, который ожидает алгоритм обновления.
  3. Последствия переноса данных: Если база была создана путем переноса из 1С 7.7 или старых версий 8-ки, справочники могли заполниться некорректно.
  4. Жесткая проверка в коде: В модуле менеджера справочника или в общем модуле ЗарплатаКадрыСобытия прописана процедура ПередЗаписью, которая блокирует создание элементов с одинаковыми именами, чтобы избежать путаницы в кадровых приказах.

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

Способ 1: Использование встроенных инструментов очистки (в режиме Предприятие)

Если обновление прервалось, но система позволяет запустить базу (иногда это возможно через запуск с параметром /AllowExecuteScheduledJobs -Force), попробуем решить проблему штатными средствами; для этого может потребоваться получить монопольный доступ к базе.

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

Способ 2: Использование внешней обработки в момент ошибки

Часто ошибка возникает именно в процессе «Пользовательского режима обновления», когда интерфейс программы недоступен. Посмотрим, как применить «хак» с внешней обработкой:

В момент, когда на экране висит окно с ошибкой обновления, мы можем нажать сочетание клавиш Ctrl + O. Это откроет диалог выбора файла. Если у вас есть заранее подготовленная обработка для очистки или переименования элементов справочника, вы можете запустить ее прямо сейчас. Логика такой обработки обычно заключается в следующем:


Выборка = Справочники.ОснованияУвольнения.Выбрать();
Пока Выборка.Следующий() Цикл
    Объект = Выборка.ПолучитьОбъект();
    // Добавляем префикс к наименованию, чтобы проверка уникальности прошла успешно
    Объект.Наименование = Объект.Наименование + "_дубль";
    Объект.Записать();
КонецЦикла;

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

Способ 3: Временная очистка макетов (для версий ПРОФ и КОРП)

Если у вас есть доступ к Конфигуратору и база не на «замке» (разрешено редактирование), проанализируем «дедовский», но крайне надежный метод:

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

Способ 4: Использование расширения конфигурации

Чтобы не снимать базу с поддержки и не менять основную конфигурацию, создадим расширение. Это современный и безопасный метод.

  1. Создадим новое расширение (Конфигурация — Расширения конфигурации).
  2. Добавим в него справочник ПричиныУвольненияПФР (или ОснованияУвольнения).
  3. Добавим в расширение макет этого справочника.
  4. В макете внутри расширения удалим все строки. При работе система будет обращаться к макету из расширения, увидит, что он пуст, и не будет пытаться записывать дублирующиеся данные.
  5. После того как обновление завершится, расширение можно просто удалить.

Способ 5: Модификация кода через «Попытку»

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


Процедура НачальноеЗаполнение() Экспорт
    // ... какой-то код инициализации данных
    Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
        ОбъектСправочника = ... // получение объекта
        Попытка
            ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ОбъектСправочника);
        Исключение
            // Если запись не удалась из-за дубля наименования, просто пропускаем
            ЗаписьЖурналаРегистрации("Обновление", УровеньЖурналаРегистрации.Предупреждение, , , 
                "Не удалось записать основание: " + ОбъектСправочника.Наименование);
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры

Использование блока Попытка...Исключение гарантирует, что даже если система встретит дубль, она не «упадет» с критической ошибкой, а просто перейдет к следующей записи. Это позволит обработчику обновления дойти до 100%.

Рекомендации по профилактике

Чтобы в будущем не сталкиваться с подобными ситуациями, рекомендуем соблюдать следующие правила:

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

← На главную