При наведении порядка в справочнике Подразделения в конфигурации 1С:Зарплата и управление персоналом 3.1 пользователи и администраторы часто сталкиваются с неприятной ситуацией. При попытке объединить два подразделения (например, созданное вручную и пришедшее из конфигурации «1С:Бухгалтерия» при синхронизации) с помощью стандартной обработки «Поиск и удаление дублей» система выдает ошибку:
«Заменены не все места использования. Возможно места использования были добавлены или изменены другим пользователем».
При этом сам процесс замены ссылок в документах полностью откатывается, и дублирующие элементы остаются в базе данных нетронутыми. Давайте подробно разберем, почему возникает эта ошибка и как ее правильно исправить несколькими способами.
Для того чтобы понять природу этой ошибки, нам необходимо заглянуть под капот стандартных механизмов Библиотеки стандартных подсистем (БСП). Проанализируем, как работает замена ссылок:
ОбщегоНазначения.ЗаменитьСсылки.ВключатьБизнесЛогику установлен в значение Истина. Это означает, что каждый документ или справочник, в котором происходит замена подразделения, перезаписывается в обычном режиме (как если бы его перезаписывал пользователь вручную).ПередЗаписью и ПриЗаписи.Подразделения тесно связан со справочником Штатное расписание и кадровыми документами. Если в базе данных присутствуют старые, некорректно перенесенные документы или «битые» ссылки (когда объект фактически удален напрямую, но ссылка на него осталась в позициях штатного расписания), стандартная бизнес-логика блокирует запись таких документов.Дополнительной проблемой в ЗУП является то, что при изменении подразделений кадровых документов система автоматически регистрирует необходимость перерасчетов для сотрудников. Это может привести к перегрузке базы данных и заполнению регистров перерасчетов лишними записями.
Рассмотрим рабочие способы обхода этой проблемы, начиная с наиболее эффективных.
Самый надежный способ решить проблему — выполнить «техническую» замену ссылок в обход стандартных проверок и подписок на события. Это эквивалентно записи объектов в режиме ОбменДанными.Загрузка = Истина. При таком подходе система не будет проверять корректность старых кадровых документов и позиций штатного расписания, а просто заменит одну ссылку на другую на уровне базы данных.
Для этого мы можем написать и запустить простую внешнюю обработку (или выполнить код через консоль кода / групповую обработку объектов):
ПарыЗамен = Новый Соответствие;
// Укажите ссылки на ваши подразделения: первое — дубль (откуда переносим), второе — оригинал (куда переносим)
ПарыЗамен.Вставить(ПодразделениеОткуда, ПодразделениеКуда);
ПараметрыЗамены = Новый Структура;
// Отключаем бизнес-логику для обхода проверок при записи документов
ПараметрыЗамены.Вставить("ВключатьБизнесЛогику", Ложь);
ПараметрыЗамены.Вставить("СпособУдаления", "Пометка"); // Помечаем дубль на удаление после замены
ПараметрыЗамены.Вставить("УчитыватьПрикладныеПравила", Истина);
Результат = ОбщегоНазначения.ЗаменитьСсылки(ПарыЗамен, ПараметрыЗамены);
Этот способ позволяет мгновенно слить подразделения без вызова транзакционных ошибок. Обратите внимание, что дублирующее подразделение после этого получит пометку на удаление, и его можно будет окончательно удалить из базы стандартным удалением помеченных объектов.
Если вы не хотите писать код, мы можем воспользоваться универсальной внешней обработкой «Поиск и замена значений» для управляемых форм. Ее логика работы отличается от стандартного поиска дублей БСП.
Проанализируем этот процесс шаг за шагом:
В некоторых случаях (например, при наличии связей в иерархии штатного расписания) обработка может выдать ошибку на первом проходе. Как показывает практика, повторный запуск этой же обработки по тем же элементам успешно завершает замену оставшихся «проблемных» ссылок (в частности, в позициях штатного расписания).
Если вам обязательно нужно использовать именно штатную обработку «Поиск и удаление дублей», вы можете временно скорректировать ее поведение в конфигураторе (или через расширение конфигурации).
Разберем, где именно кроется настройка:
ПоискИУдалениеДублей.ФоновоеУдалениеДублей.ПараметрыЗамены = ОбщегоНазначения.ПараметрыЗаменыСсылок();.
ПараметрыЗамены.ВключатьБизнесЛогику = Ложь;
Сохраните изменения. Теперь штатная обработка при поиске и удалении любых дублей в системе будет производить замену в техническом режиме «Загрузка», что полностью нивелирует возникновение подобных ошибок.
Каким бы способом вы ни воспользовались, изменение подразделения в кадровых документах (особенно если замена шла с включенной бизнес-логикой) неизбежно приведет к тому, что система зафиксирует изменения условий труда сотрудников. Программа автоматически сделает записи в регистре сведений «Перерасчеты».
Если оставить эти записи без внимания, то при следующем расчете заработной платы программа попытается пересчитать прошлые периоды для множества сотрудников. Это приведет к сильному замедлению расчета и потенциальному появлению «нулевых» строк-корректировок в документах начисления зарплаты.
Выполним очистку зарегистрированных перерасчетов:
После удаления этих записей расчет зарплаты за текущий месяц пройдет в штатном режиме, без попыток скорректировать прошлые закрытые периоды.