В процессе обновления конфигураций 1С, особенно при переходе на новые релизы БП 3.0, разработчики иногда сталкиваются с необходимостью изменения периодичности регистра сведений. Чаще всего это переход с периодичности По дням на более точную По позиции регистратора или По секунде. Нередко в этот момент платформа выдает ошибку о наличии дублей, которая блокирует обновление. Давайте разберемся, почему это происходит и как исправить ситуацию.
Основная причина конфликта заключается в изменении правил уникальности записей в таблице базы данных. Когда период был По дням, платформа считала уникальной комбинацию измерений и даты. Все записи с одинаковыми измерениями внутри одного дня могли логически сосуществовать. При переходе на По секунде уникальность становится гораздо строже: теперь платформа требует уникальности для комбинации измерений и точного времени (до секунды).
Если в вашей базе данных ранее существовали записи, которые «схлопывались» из-за грубого периода, то после смены настроек они начинают конфликтовать. Фактически, дубли уже были в базе, просто платформа раньше игнорировала их наличие в рамках индекса.
Чтобы найти записи, которые мешают обновлению, нам не нужно перебирать всю базу вручную. Мы воспользуемся механизмом языка запросов 1С. Рассмотрим алгоритм поиска через Консоль запросов.
Для выявления дублей выполним следующие действия:
Период.ИМЕЮЩИЕ, чтобы отфильтровать только те группы, где количество записей больше единицы.Рассмотрим пример такого запроса для регистра КадроваяИсторияСотрудников:
ВЫБРАТЬ
Регистр.Сотрудник КАК Сотрудник,
Регистр.Организация КАК Организация,
Регистр.Период КАК Период,
КОЛИЧЕСТВО(*) КАК КоличествоДублей
ИЗ
РегистрСведений.КадроваяИсторияСотрудников КАК Регистр
СГРУППИРОВАТЬ ПО
Регистр.Сотрудник,
Регистр.Организация,
Регистр.Период
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
После выполнения этого запроса вы получите точный список наборов измерений и дат, которые платформа считает дублирующимися. Эти данные и являются «камнем преткновения» при обновлении конфигурации.
После того как вы получили список дублей, важно правильно подойти к их устранению. Помните: всегда делайте резервную копию базы данных перед любыми манипуляциями с записями в типовых регистрах.
Рассмотрим основные методы решения проблемы:
Если записи являются полными копиями (дублируют все реквизиты), их можно просто удалить. Для этого используйте метод НаборЗаписей. Создайте объект РегистрСведенийНаборЗаписей.ИмяРегистра, установите отбор по измерениям и периоду, прочитайте данные, удалите лишние строки и запишите набор обратно.
Если записи несут разную смысловую нагрузку и должны быть сохранены (например, два кадровых события, которые раньше имели одну дату), их нужно принудительно разнести во времени. В рамках периодичности По секунде измените значение Период для одной из записей так, чтобы они отличались хотя бы на одну секунду. Это снимет конфликт уникальности.
Если регистр является подчиненным регистратору, лучшим решением будет перепроведение документов, которые сформировали эти записи. В этом случае логика записи данных в 1С сработает штатно, и платформа сама создаст корректные записи в соответствии с новой периодичностью. Это самый безопасный способ, позволяющий избежать нарушения целостности кадрового учета.
При работе с типовым функционалом Бухгалтерии предприятия крайне не рекомендуется удалять записи «в лоб» через SQL или прямым удалением объектов, если вы не уверены в их происхождении. Всегда анализируйте источник записи — если это документ, значит, проблема в его данных или логике проведения. Если записи созданы обработкой или обменом — возможно, стоит проверить код, который осуществляет запись, на предмет корректной обработки РегистрСведенийНаборЗаписей.
Используйте метод НаборЗаписей.Записать() только после того, как убедитесь, что структура данных очищена от конфликтов. Если дублей очень много, напишите небольшую обработку для автоматизированного поиска и удаления, используя механизм Запрос, описанный выше, как основу для фильтрации.
Соблюдая эти шаги, вы сможете успешно обновить конфигурацию, сохранив при этом чистоту данных и корректность учета в вашей системе 1С.