Почему очищаются добавленные реквизиты при обновлении с 1С:Бухгалтерии 2.0 на 3.0 и как сохранить данные

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

При переходе с редакции 2.0 на редакцию 3.0 конфигурации 1С:Бухгалтерия предприятия разработчики нередко сталкиваются с неприятной ситуацией: в исходной базе были добавлены собственные реквизиты документов или справочников, перед обновлением точно такие же реквизиты создали в файле новой конфигурации, но после применения изменений и реструктуризации базы данных все сохраненные значения оказываются пустыми. Разберем внутренние механизмы платформы 1С:Предприятие, выясним причину потери информации и рассмотрим надежные способы сохранения данных.

Анализ проблемы: как платформа 1С сопоставляет реквизиты при загрузке конфигурации

Проанализируем, что происходит на уровне структуры базы данных и СУБД в момент обновления. Каждому реквизиту объекта в метаданных сопоставлена отдельная колонка в таблице базы данных (вида _Fld<Номер>). Эта колонка привязана не к символьному имени реквизита (идентификатору), а к его внутреннему уникальному идентификатору — UUID (GUID метаданных).

Когда мы используем операцию «Конфигурация — Загрузить конфигурацию из файла» (загрузка .cf):

  1. Платформа выполняет сопоставление всех объектов и реквизитов исключительно по их внутренним UUID.
  2. Если реквизит в новой конфигурации 3.0 был создан вручную через дерево метаданных, платформа сгенерировала для него совершенно новый уникальный идентификатор, даже если имя, синоним и тип данных полностью идентичны реквизиту из 2.0.
  3. В процессе применения изменений (нажатие F7) платформа считает, что старый реквизит был удален, а новый — добавлен с нуля.
  4. В результате физическая колонка старого реквизита в таблице СУБД удаляется вместе со всей историей данных, а на ее месте создается новая пустая колонка.

Именно поэтому простая ручная вставка реквизита в новую конфигурацию и последующая загрузка файла конфигурации неизбежно приводят к потере информации.

Решение 1: Правильный перенос реквизитов через сравнение и объединение конфигураций

Чтобы данные не пропали, внутренний UUID реквизита в целевой конфигурации должен полностью совпадать с его идентификатором в исходной базе. Для этого необходимо выполнять перенос реквизитов через механизм сравнения и объединения, где сопоставление объектов можно выполнять по их именам.

Разберем по шагам правильный алгоритм подготовки файла конфигурации для обновления:

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

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

Контроль реорганизации информации перед обновлением

Всегда обращаем внимание на окно «Реорганизация информации», которое появляется при обновлении конфигурации базы данных. Если в списке изменений напротив добавленного реквизита указано действие «Удалить» и одновременно «Добавить» — это прямой сигнал о несовпадении UUID и неминуемой потере данных. При корректном объединении реквизит не должен фигурировать в списке удаляемых полей.

Решение 2: Восстановление данных из архивной копии после неудачного обновления

Если обновление уже было выполнено, а реквизиты очистились, восстановить значения можно с помощью внешней обработки из предварительно созданной резервной копии БП 2.0. При этом важно правильно выбрать ключ сопоставления документов.

Поскольку при обновлении конфигурации стандартные ссылки объектов Ссылка не меняются, сопоставлять документы по номерам и датам не требуется (номера могут сбиваться или пересекаться по годам). Достаточно использовать строковое представление уникального идентификатора ссылки Ссылка.УникальныйИдентификатор().

Посмотрим на пример логики переноса данных через внешнее COM-соединение с архивной базой БП 2.0:


// Подключаемся к архивной базе данных
Соединитель = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "File=""C:\Bases\Base20_Backup""; Usr=""Администратор""; Pwd="""";";
Попытка
    База20 = Соединитель.Connect(СтрокаПодключения);
Исключение
    Сообщить("Ошибка подключения к архивной базе: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Выбираем данные из архивной базы
ЗапросCOM = База20.NewObject("Запрос");
ЗапросCOM.Текст = 
    "ВЫБРАТЬ
    |   ВЫРАЗИТЬ(РКО.Ссылка КАК СТРОКА) КАК УИД_Строка,
    |   РКО.ДополнительныйРеквизитGUID КАК ИсходныйGUID
    |ИЗ
    |   Документ.РасходныйКассовыйОрдер КАК РКО
    |ГДЕ
    |   РКО.ДополнительныйРеквизитGUID <> """"";

Выборка = ЗапросCOM.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    // Находим документ в текущей базе БП 3.0 по исходному UUID ссылки
    ТекУИД = Новый УникальныйИдентификатор(Выборка.УИД_Строка);
    ТекСсылка = Документы.РасходныйКассовыйОрдер.ПолучитьСсылку(ТекУИД);
    
    // Проверяем существование объекта и записываем восстановленные данные
    Если Не ТекСсылка.Пустая() Тогда
        ОбъектДок = ТекСсылка.ПолучитьОбъект();
        Если ОбъектДок <> Неопределено Тогда
            ОбъектДок.ДополнительныйРеквизитGUID = Выборка.ИсходныйGUID;
            ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Рекомендации по доработке 1С:Бухгалтерии 3.0

При переходе на современные версии БП 3.0 рекомендуется избегать изменения типовых метаданных на замке. Для решения аналогичных задач применяются более гибкие инструменты:

  1. Расширения конфигурации: позволяют добавлять собственные реквизиты к документам и справочникам типовой конфигурации в режиме адаптации без снятия объектов с поддержки.
  2. Подсистема дополнительных реквизитов и сведений (БСП): позволяет добавлять пользовательские поля непосредственно в режиме 1С:Предприятие через раздел Администрирование — Общие настройки — Дополнительные реквизиты и сведения, не затрагивая конфигуратор и упрощая дальнейшие типовые обновления.
← На главную