При обновлении конфигурации «1С:Бухгалтерия предприятия 3.0» (начиная с релиза 3.0.157.32 на 3.0.158.х и выше) многие администраторы и программисты сталкиваются с критической ошибкой, прерывающей процесс обновления информационной базы. Сообщение об ошибке гласит: «Записи регистра сведений стали не уникальными». Проблема локализуется в регистре сведений РасчетТранспортногоНалога.
В этой статье мы подробно разберем причины возникновения этой ситуации, проанализируем изменения в структуре хранения данных транспортного налога и рассмотрим несколько надежных способов устранения ошибки, чтобы успешно завершить обновление.
Прежде чем приступать к лечению, давайте разберемся в диагностике. Ошибка возникает на этапе выполнения обработчиков обновления, когда система пытается преобразовать данные из старой структуры регистра в новую.
В релизах версии 3.0.158 разработчики 1С существенно изменили механизм хранения данных по расчету транспортного налога. Это связано с требованиями ФНС и необходимостью приблизить вид справки-расчета к формату сообщений об исчисленных налогах от налоговой инспекции.
Основные изменения, которые мы наблюдаем:
РасчетТранспортногоНалогаДо2020.РасчетТранспортногоНалога добавлено новое измерение ДатаСведений.Алгоритм обновления работает следующим образом: данные из старого регистра должны быть перенесены в архивный, а основной регистр — перезаполнен с учетом новой структуры (включая заполнение измерения ДатаСведений). Ошибка уникальности возникает, если у вас в базе есть транспортные средства, по которым в течение одного отчетного периода (года) происходили изменения регистрационных данных (перерегистрация).
Рассмотрим пример ситуации, вызывающей сбой:
В 2020 или 2021 году одно и то же транспортное средство (ТС) было зарегистрировано с одними параметрами (например, мощностью двигателя), а затем, в середине года, параметры изменились (изменилась налоговая ставка, мощность или был исправлен код вида ТС). В старой версии регистра это хранилось корректно, так как уникальность записи определялась периодом и самим основным средством.
Однако при конвертации данных в новую структуру обработчик обновления может некорректно заполнить новое измерение ДатаСведений (оставить его пустым или одинаковым для обеих записей). В результате мы получаем две записи с одинаковым набором измерений:
Для платформы 1С это является нарушением уникальности записей в регистре сведений, что и вызывает остановку обновления.
Фирма 1С признала наличие данной проблемы и выпустила специальное исправление (патч). Это самый безопасный и правильный метод решения, так как он исправляет логику обработчика обновления данных.
Нам необходимо выполнить следующие действия:
Патч корректирует процедуру РегистрыСведений.РасчетТранспортногоНалога.ЗаполнитьДаннымиПрежнегоРегистра, обеспечивая корректное заполнение измерения ДатаСведений для исторических записей, что предотвращает появление дублей.
Если по какой-то причине установка патча невозможна или не помогает (что бывает крайне редко), существует проверенный сообществом метод обхода проблемы. Суть метода заключается в очистке регистра перед обновлением и его автоматическом перезаполнении уже по новым правилам.
Регистр РасчетТранспортногоНалога является подчиненным — он заполняется документами «Регламентная операция» с видом операции «Расчет транспортного налога» при закрытии месяца (обычно это декабрь, или ежеквартально, если есть авансы).
Давайте выполним следующие шаги:
РасчетТранспортногоНалога.Почему это работает? Когда мы проводим расчет налога уже в обновленной конфигурации, срабатывает новый алгоритм расчета. Программа сразу формирует записи в соответствии с новой структурой регистра, корректно заполняя ДатаСведений и другие поля, минуя глючный механизм конвертации старых записей.
Если вы хотите глубже понять суть происходящего, давайте посмотрим на логику кода, которая управляет процессом перехода. В конфигурации существует функция, определяющая дату перехода на новые рельсы:
Функция НачалоПримененияНовогоРасчетаТранспортногоНалога() Экспорт
Возврат '20200101';
КонецФункции
Также существует обработчик обновления, который пытается перенести данные. Он выглядит примерно так (в упрощенном виде):
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "3.0.158.14"; // Или более ранняя в зависимости от ветки
Обработчик.Процедура = "РегистрыСведений.РасчетТранспортногоНалога.ЗаполнитьДаннымиПрежнегоРегистра";
Обработчик.НачальноеЗаполнение = Истина;
Проблема кроется именно в процедуре ЗаполнитьДаннымиПрежнегоРегистра. Она считывает данные из РасчетТранспортногоНалогаДо2020 (куда данные должны были попасть на предыдущем шаге) и пишет их в РасчетТранспортногоНалога. Если в исходных данных есть записи за один период по одному ТС, но с разными ресурсами (ставками), и алгоритм не присваивает им уникальную дату сведений — происходит крах обновления.
Важное примечание: Если вы решите исправлять данные вручную (например, удалять дубли), учтите, что после обновления регистр РасчетТранспортногоНалогаДо2020 может остаться пустым, а в основном регистре могут быть незаполненные измерения (ОКТМО, ВидТранспортногоСредства). Поэтому ручная правка данных через XML или обработки не рекомендуется, так как высок риск получить некорректные данные для отчетов. Лучше использовать автоматический пересчет (Способ 2) или официальный патч (Способ 1).
Ошибка обновления, связанная с дублями в регистре транспортного налога, вызвана перерегистрацией транспортных средств внутри одного налогового периода в прошлых годах (2020-2021). Мы рекомендуем использовать официальный патч EF_60017826 для корректного переноса исторических данных. Если это невозможно — выполните перепроведение регламентных операций по расчету налога после обновления.