Обновление сильно измененных (нетиповых) конфигураций 1С — это всегда трудоемкий процесс, особенно когда необходимо «перепрыгнуть» через десяток промежуточных релизов. Многие специалисты задаются вопросом: можно ли выполнить все манипуляции на копии базы (например, на мощном локальном компьютере), а затем просто перенести результат в рабочую среду? Разберем эту ситуацию подробно, проанализируем риски и выработаем оптимальный алгоритм действий.
Рассмотрим ситуацию, когда конфигурация обновляется не последовательно (1.0.1 -> 1.0.2 -> 1.0.3), а сразу на несколько версий вперед. Основная опасность здесь кроется в механизме работы обработчиков обновления данных. Проанализируем, почему это происходит.
В современных конфигурациях 1С, построенных на базе БСП (Библиотеки стандартных подсистем), процесс обновления разделен на два этапа: изменение структуры таблиц (реструктуризация) и выполнение программного кода, который переносит данные из старых реквизитов в новые. Если мы пропускаем релизы, мы рискуем столкнуться со следующими проблемами:
Пол (булево) перенесли в Перечисление. В релизе №4 старый реквизит удалили. Если вы прыгнули с 1 на 5 релиз, данные из старого реквизита не успеют «перекочевать» в новое перечисление и будут безвозвратно потеряны при удалении поля в структуре базы данных.Выясним, какой способ переноса подготовленного обновления из копии в рабочую базу является наиболее безопасным. Рассмотрим два основных подхода.
1. Загрузка конфигурации из файла (CF)
Этот метод часто кажется самым простым: подготовили базу на копии, выгрузили .cf и загрузили в рабочую через «Администрирование — Загрузить конфигурацию из файла». Однако здесь есть критические нюансы:
.cf в рабочую базу система увидит новую версию и попытается запустить обновление. Но, как мы выяснили выше, «прыжок» может привести к потере данных.2. Полная замена базы данными из копии (DT или восстановление из SQL)
Этот метод подразумевает, что вы обновляете копию, прогоняете все обработчики, а затем загружаете эту базу вместо рабочей. Это допустимо только в том случае, если в рабочей базе в это время никто не работал. Однако и тут есть подводные камни:
Разберем ситуацию, когда обновление выполняется в файловом варианте для ускорения процесса. Файловый режим (формат .1CD) действительно работает быстрее на локальных SSD-дисках, но имеет жесткие ограничения:
Проанализируем лимит размера таблиц. В файловой базе размер одной таблицы не может превышать 4 Гб. При обновлении крупных баз (например, 150-200 Гб в SQL), даже если вся база в сжатом виде помещается в файл, в момент реструктуризации одна из таблиц итогов или регистров может временно вырасти и превысить этот лимит. В этом случае база будет повреждена. Для очень крупных баз все операции следует проводить только на SQL-сервере.
Рассмотрим наиболее надежную методику, которую рекомендуют опытные специалисты для обновления нетиповых конфигураций:
.cf)..cf) или «Сравнить и объединить с конфигурацией из файла». Это позволит сохранить идентификаторы объектов и конфигурацию поставщика.Для понимания того, как работают обработчики, приведем упрощенный пример кода, который может содержаться в модуле обновления подсистемы:
Процедура ПриОбновленииИнформационнойБазы() Экспорт
ВерсияПоСтроке = СтандартныеПодсистемыСервер.ВерсияИнформационнойБазы("МояПодсистема");
Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияПоСтроке, "2.1.3.15") < 0 Тогда
// Здесь выполняется код по переносу данных из старых полей в новые
ПеренестиДанныеВНовыйРегистр();
КонецЕсли;
КонецПроцедуры
Если в новой конфигурации условие СравнитьВерсии будет начинаться, например, с "2.5.0.0", то весь код для более старых версий будет проигнорирован. Именно поэтому важно не допускать слишком больших «разрывов» между версиями без запуска пользовательского режима.
Подведем итог: Обновление на копии — отличная практика, позволяющая сэкономить время и избежать ошибок на «боевой» базе. Однако переносить результат следует максимально аккуратно, используя механизм сравнения и объединения, и всегда обеспечивая последовательное выполнение программных обработчиков данных.