В процессе эксплуатации и развития конфигураций на платформе 1С: Предприятие часто возникают ситуации, когда структура хранения информации требует изменений. Это может быть связано как с рефакторингом устаревшего кода, так и с необходимостью оптимизации производительности базы данных. Наиболее сложной задачей в таком сценарии становится корректный перенос исторических данных из старого регистра сведений в новый.
Процедура миграции не терпит ошибок, так как некорректный перенос может нарушить целостность документов и отчетов, формируемых на основе этих сведений. Существует несколько подходов к решению этой задачи: от использования стандартных средств обмена данными до написания специализированных внешних обработок или выполнения прямых SQL-запросов. Выбор конкретного метода зависит от объема переносимой информации и версии платформы.
Перед началом любых работ с данными необходимо создать резервную копию информационной базы. Даже если вы планируете использовать штатные механизмы платформы, риск возникновения непредвиденных ситуаций при массовой записи всегда сохраняется. Резервное копирование является единственным способом быстро восстановить работоспособность системы в случае сбоя.
Анализ структуры и подготовка к переносу
Первым шагом является тщательный анализ исходной и целевой структур. Вам необходимо сопоставить измерения, ресурсы и реквизиты старого регистра с аналогичными элементами нового. Если в новой структуре появились дополнительные обязательные поля, необходимо определить логику их заполнения для переносимых записей.
Обратите внимание на типы данных и длину строк. Несоответствие типов может привести к усечению информации или ошибкам при записи. Например, если в старом регистре строка имела длину 50 символов, а в новом — 20, критически важные данные могут быть потеряны без предупреждения.
⚠️ Внимание: При переносе данных в регистры с периодичностью «Независимый» или «Внутри месяца» убедитесь, что временные метки записей не конфликту с уже существующими данными в целевом регистре.
Также важно проверить наличие уникальных ограничений. Если новый регистр требует уникальности комбинации измерений, а в старом регистре допускались дубли, процесс переноса прервется на первой же ошибке. В таких случаях требуется предварительная агрегация или фильтрация данных.
☑️ Подготовка к миграции данных
Использование отчета «Универсальный» для выборки данных
Самый безопасный и наглядный способ выгрузить данные для последующего анализа или переноса — использование стандартного отчета «Универсальный». Этот инструмент позволяет сформировать выборку из любого регистра сведений без написания кода. Вы можете отфильтровать ненужные записи и выгрузить результат в табличный документ.
Для работы с отчетом перейдите в меню Администрирование → Поддержка и обслуживание → Универсальный отчет. В открывшемся окне выберите тип объекта «Регистр сведений» и укажите имя вашего исходного регистра. Настройте отборы по периоду или конкретным измерениям, если требуется перенести не весь массив данных.
После формирования отчета данные можно выгрузить в формат MXL или CSV. Этот файл станет источником для последующей загрузки. Однако стоит помнить, что данный метод подходит только для относительно небольших объемов данных, так как формирование отчета в режиме предприятия может быть медленным.
При выгрузке больших объемов данных через Универсальный отчет используйте группировки, чтобы избежать переполнения оперативной памяти клиента 1С.
Если вам требуется автоматизировать процесс, структуру отчета можно сохранить как внешнюю обработку. Это позволит запускать выгрузку данных по расписанию или в рамках регламентной процедуры без участия пользователя.
Написание внешней обработки для переноса
Для профессионального переноса данных наиболее эффективным решением является создание внешней обработки на языке 1С: Предприятие. Такой подход дает полный контроль над процессом, позволяет реализовать сложную логику преобразования данных и обрабатывать ошибки «на лету».
В модуле обработки необходимо организовать цикл чтения записей из старого регистра с помощью объекта РегистрСведенийВыборка. Для каждой прочитанной строки создается новая запись в целевом регистре через объект РегистрСведенийМенеджер. Ниже приведен пример базовой структуры алгоритма:
Выборка = РегистрыСведений.СтарыйРегистра.СоздатьВыборку();
Пока Выборка.Следующий() Цикл
НоваяЗапись = РегистрыСведений.НовыйРегистра.СоздатьЗапись();
НоваяЗапись.Период = Выборка.Период;
НоваяЗапись.Измерение1 = Выборка.Измерение1;
НоваяЗапись.Ресурс1 = Выборка.Ресурс1 * 1.2; // Пример трансформации
НоваяЗапись.Записать();
КонецЦикла;
Использование внешней обработки позволяет реализовать механизм транзакционности. Вы можете разбить процесс на пакеты по 1000 записей, фиксируя изменения после каждого пакета. Это предотвратит блокировку базы данных на длительное время и позволит возобновить процесс в случае сбоя.
Оптимизация скорости записи
Для ускорения процесса можно отключить регистрацию изменений в плане обмена перед началом переноса и включить его после завершения всех операций. Это снизит нагрузку на таблицу изменений.
Прямой перенос через SQL-запросы
В случаях, когда объем данных исчисляется миллионами строк, использование средств платформы 1С может быть неоправданно долгим. Тогда администраторы баз данных прибегают к выполнению прямых SQL-запросов. Этот метод требует глубокого знания внутренней структуры таблиц 1С: Предприятие.
Имена таблиц в SQL соответствуют именам регистров с префиксом _InfoRg. Для периодических регистров имя таблицы будет содержать суффикс Periodicals. Важно правильно сопоставить поля измерений и ресурсов, так как их имена в SQL могут отличаться от имен в конфигураторе (например, добавление префикса _Fld).
| Объект 1С | Префикс таблицы SQL | Пример имени поля |
|---|---|---|
| Регистр сведений (непериодический) | _InfoRg | _InfoRg8542 |
| Регистр сведений (периодический) | _InfoRg...Periodicals | _InfoRg8542Periodicals |
| Измерение (Справочник) | _Fld (числовой ID) | _Fld8543 |
| Ресурс (Число) | _Fld (числовой ID) | _Fld8544 |
Пример SQL-запроса для переноса данных может выглядеть следующим образом:
INSERT INTO _InfoRgNew (Period, _FldRef, _FldValue)
SELECT Period, _FldRefOld, _FldValueOld
FROM _InfoRgOld;
⚠️ Внимание: Выполнение прямых SQL-запросов отключает механизмы контроля целостности данных платформы 1С. Ошибка в запросе может привести к повреждению базы, которое невозможно исправить средствами конфигуратора.
Перед выполнением таких операций рекомендуется перевести базу в монопольный режим и остановить всех пользователей. После завершения SQL-операций необходимо выполнить реструктуризацию служебных таблиц 1С через режим предприятия.
Обработка ошибок и верификация результатов
После завершения процедуры переноса критически важно выполнить сверку данных. Количество записей в исходном и целевом регистрах должно совпадать, если не применялась фильтрация. Суммовые показатели по ресурсам также должны быть идентичны.
Для автоматической проверки можно написать простой отчет, который соединяет старый и новый регистры по ключевым измерениям и выводит расхождения. Особое внимание следует уделить записям, которые могли не попасть в выборку из-за особенностей типов данных или ограничений уникальности.
Если в процессе переноса возникали ошибки записи, они должны быть зафиксированы в отдельном журнале или файле протокола. Анализ этого лога позволит понять причину сбоев: будь то нарушение ограничений ссылочной целостности или превышение допустимой длины строки.
Всегда проводите сверку суммовых показателей и количества записей после миграции. Визуальный просмотр нескольких строк не гарантирует отсутствия скрытых ошибок в массиве данных.
Очистка и архивация старых данных
После успешного переноса и подтверждения корректности работы новых отчетов и документов, старый регистр можно очистить. Однако не рекомендуется удалять его из конфигурации сразу. Лучше оставить его в системе в неактивном состоянии на период гарантированной работы новой схемы.
Для очистки данных используйте обработку Администрирование → Поддержка и обслуживание → Удаление данных. Выберите нужный регистр сведений и установите период удаления. Это позволит освободить место в базе данных и ускорить работу других механизмов платформы.
Если старый регистр больше не используется нигде в коде конфигурации, его можно удалить из метаданных. Перед этим убедитесь, что все ссылки на него удалены из модулей объектов, форм и запросов, иначе возникнут ошибки компиляции.
Можно ли перенести данные, если изменился состав измерений?
Да, это возможно, но требует дополнительной логики. Если в новом регистре меньше измерений, данные могут быть агрегированы (сгруппированы). Если измерений больше, необходимо определить значения для новых полей: использовать константы, значения из связанных справочников или вычислять их программно.
Как перенести данные в регистр накопления?
Перенос из регистра сведений в регистр накопления возможен, но требует анализа движений. Обычно данные из регистра сведений используются для формирования начальных остатков или корректирующих движений. Прямое копирование структуры невозможно из-за разной природы хранения данных (остатки/обороты против срезов).
Нужно ли останавливать пользователей при переносе?
При использовании внешних обработок в режиме предприятия желательно, но не всегда обязательно останавливать пользователей, если объем данных мал. При использовании SQL-запросов или больших объемов данных монопольный режим и остановка сеансов строго обязательны для избежания блокировок и конфликтов.
Что делать, если при переносе возникла ошибка «Нарушение уникальности»?
Это означает, что в целевом регистре уже существует запись с такой же комбинацией измерений и периода. Необходимо проверить данные на дубликаты в исходном регистре или очистить целевой регистр перед началом загрузки. Также возможно, что в новом регистре добавлено дополнительное измерение, делающее ключ уникальным.