Как исправить ошибку «Заменены не все места использования» при удалении дублей подразделений в 1С:ЗУП 3.1?

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

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

«Заменены не все места использования. Возможно места использования были добавлены или изменены другим пользователем».

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

Выясняем причину возникновения ошибки

Для того чтобы понять природу этой ошибки, нам необходимо заглянуть под капот стандартных механизмов Библиотеки стандартных подсистем (БСП). Проанализируем, как работает замена ссылок:

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

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

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

Способ 1. Программная замена ссылок с отключением бизнес-логики

Самый надежный способ решить проблему — выполнить «техническую» замену ссылок в обход стандартных проверок и подписок на события. Это эквивалентно записи объектов в режиме ОбменДанными.Загрузка = Истина. При таком подходе система не будет проверять корректность старых кадровых документов и позиций штатного расписания, а просто заменит одну ссылку на другую на уровне базы данных.

Для этого мы можем написать и запустить простую внешнюю обработку (или выполнить код через консоль кода / групповую обработку объектов):


ПарыЗамен = Новый Соответствие;
// Укажите ссылки на ваши подразделения: первое — дубль (откуда переносим), второе — оригинал (куда переносим)
ПарыЗамен.Вставить(ПодразделениеОткуда, ПодразделениеКуда); 

ПараметрыЗамены = Новый Структура;
// Отключаем бизнес-логику для обхода проверок при записи документов
ПараметрыЗамены.Вставить("ВключатьБизнесЛогику", Ложь);
ПараметрыЗамены.Вставить("СпособУдаления", "Пометка"); // Помечаем дубль на удаление после замены
ПараметрыЗамены.Вставить("УчитыватьПрикладныеПравила", Истина);

Результат = ОбщегоНазначения.ЗаменитьСсылки(ПарыЗамен, ПараметрыЗамены);

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

Способ 2. Использование обработки «Поиск и замена значений»

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

Проанализируем этот процесс шаг за шагом:

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

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

Способ 3. Временная корректировка кода типовой обработки

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

Разберем, где именно кроется настройка:

  1. Откройте конфигуратор вашей базы данных ЗУП.
  2. Найдите обработку ПоискИУдалениеДублей.
  3. В модуле объекта найдите процедуру ФоновоеУдалениеДублей.
  4. Найдите строку инициализации параметров замены: ПараметрыЗамены = ОбщегоНазначения.ПараметрыЗаменыСсылок();.
  5. Добавьте принудительную установку свойства отключения бизнес-логики:

ПараметрыЗамены.ВключатьБизнесЛогику = Ложь;

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

Важный шаг после замены: очистка регистра перерасчетов

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

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

Выполним очистку зарегистрированных перерасчетов:

  1. Перейдите в раздел программы «Зарплата», далее выберите пункт «Сервис» — «Перерасчеты».
  2. Проанализируйте список зарегистрированных записей перерасчетов. Если вы видите, что там появились массовые записи за прошлые периоды, связанные с измененным подразделением, выделите их.
  3. Нажмите кнопку «Отменить» (или «Удалить»).

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

← На главную