Как вернуть конфигурацию 1С на предыдущую версию и решить ошибку уникальности записей в регистре

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

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

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

Физическая причина ошибки неуникальности записей регистра

Для того чтобы эффективно бороться с ошибкой, проанализируем физику процесса на уровне базы данных. В системе «1С:Предприятие» уникальность записей в регистре сведений (как в периодическом, так и в непериодическом) гарантируется уникальным индексом СУБД. Этот индекс строится по набору всех ключевых полей — то есть измерений регистра (а для периодических регистров — дополнительно по периоду).

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

  1. В старой (целевой) версии конфигурации у регистра было меньше измерений. Например, в новом релизе разработчики добавили измерение Организация или Склад, а в старой версии его не существовало.
  2. При даунгрейде платформа пытается удалить «лишнее» измерение из таблицы СУБД.
  3. В результате записи, которые в новой версии базы отличались друг от друга значением этого удаляемого измерения, на уровне СУБД «схлопываются» в одну строку.
  4. СУБД (будь то MS SQL Server, PostgreSQL или файловый вариант) пытается перестроить уникальный индекс по уменьшенному составу полей. Происходит коллизия: в таблице оказываются строки с абсолютно одинаковым набором ключевых полей.
  5. СУБД возвращает ошибку нарушения уникального ключа (например, «Cannot insert duplicate key row...»), и платформа экстренно прекращает процесс реструктуризации базы.

Ниже мы рассмотрим пять способов решения этой проблемы, начиная от самых простых и заканчивая продвинутыми методами работы непосредственно с СУБД.

Способ 1. Восстановление архивной копии (Золотой стандарт)

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

Разберем по шагам, почему этот вариант наиболее предпочтителен:

Если в обновленной базе пользователи уже успели поработать и внести новые документы, не стоит отчаиваться. Мы можем восстановить архивную копию в новую пустую базу, а затем перенести в нее только те документы и справочники, которые были созданы за период работы в ошибочной конфигурации. Для этого отлично подойдет встроенная обработка ВыгрузкаЗагрузкаДанныхXML.epf или правила обмена в «1С:Конвертация данных».

Способ 2. Очистка и выборочный импорт данных через XML

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

Мы можем использовать метод временного удаления данных проблемного регистра. Выполним следующие шаги:

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

НаборЗаписей = РегистрыСведений.ИмяПроблемногоРегистра.СоздатьНаборЗаписей();
// Отборы не устанавливаем, чтобы очистить регистр полностью
НаборЗаписей.Записать(Истина);
  1. После успешной очистки закроем сеанс «1С:Предприятие», зайдем в конфигуратор и загрузим конфигурацию старой версии (.cf-файл). Поскольку регистр теперь пуст, реструктуризация таблиц на уровне СУБД пройдет без единой ошибки.
  2. Снова запустим базу в режиме «1С:Предприятие» и через ту же обработку загрузим XML-файл с сохраненными записями обратно.

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

Способ 3. Очистка на уровне СУБД (Для клиент-серверного варианта)

Если информационная база развернута на сервере под управлением MS SQL Server или PostgreSQL, а размер проблемного регистра исчисляется миллионами записей, очистка штатными средствами «1С» может привести к зависанию системы. В таком случае очистку можно произвести напрямую через СУБД.

Важно: Перед выполнением любых операций напрямую в СУБД обязательно создайте резервную копию базы данных средствами SQL!

Выполним процедуру по шагам:

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

ТаблицыБД = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого СтрокаТаблицы Из ТаблицыБД Цикл
    Если Найти(СтрокаТаблицы.ИмяМетаданных, "РегистрСведений.ИмяПроблемногоРегистра") > 0 Тогда
        Сообщить("Имя таблицы в СУБД: " + СтрокаТаблицы.ИмяТаблицыХранения);
    КонецЕсли;
КонецЦикла;
  1. Допустим, имя таблицы в СУБД определено как _InfoRg12345. Откроем консоль управления вашей СУБД (SQL Server Management Studio или pgAdmin).
  2. Выполним запрос на быструю очистку таблицы (операция TRUNCATE выполняется мгновенно и не забивает логи транзакций):

TRUNCATE TABLE dbo._InfoRg12345;

  1. После этого возвращаемся в конфигуратор 1С и запускаем обновление базы данных (клавиша F7). Конфигурация успешно обновится. Далее можно восстановить данные в регистр из копии или пересчитать их программно.

Способ 4. Корректная работа с поддержкой при даунгрейде

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

Рассмотрим правильный алгоритм действий для сохранения корректного статуса поддержки:

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

Способ 5. Перенос данных в чистую базу нужной версии

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

Разберем данный сценарий:

  1. Создайте пустую информационную базу.
  2. Разверните в ней конфигурацию старой версии (которая вам требуется).
  3. Используйте обработку ВыгрузкаЗагрузкаДанныхXML.epf.
  4. Выгрузите из рабочей («проблемной») базы все необходимые справочники, документы и регистры, за исключением того самого регистра, который вызывает ошибку неуникальности.
  5. Загрузите полученный файл в новую базу.

Такой подход гарантирует 100% чистоту базы данных от различного конфигурационного мусора, который мог остаться после некорректно выполненных обновлений.

Режим совместимости платформы при откате

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

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

← На главную