Как перенести данные реквизита документа из одной базы 1С:Бухгалтерия в другую при несовпадении релизов

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

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

Анализ первопричины и подготовка среды

Прежде чем приступать к переносу, проанализируем ситуацию. Исходная база имела доработку — строковый реквизит в табличной части документа РеализацияТоваровУслуг. После загрузки типового .cf файла реквизит исчез. Для восстановления данных нам потребуется копия старой базы (до «затирания» доработок) и текущая рабочая база. В текущей базе необходимо предварительно восстановить структуру метаданных, то есть заново создать тот самый реквизит с тем же типом и идентификатором, чтобы нам было куда записывать данные.

Способ 1: Использование Excel и типовой обработки загрузки данных

Это наиболее доступный метод, не требующий глубоких навыков программирования. Мы воспользуемся механизмом вывода списка и универсальной обработкой ЗагрузкаДанныхИзТабличногоДокумента.epf.

  1. Откроем старую базу и перейдем в список документов Реализация (акты, накладные).
  2. Настроим список, добавив в него колонки: Дата, Номер и наш доработанный реквизит Наименование (англ.). Если реквизит находится в табличной части, целесообразно построить отчет (например, через «Универсальный отчет»), чтобы получить строки в разрезе документов.
  3. Нажмем Еще — Вывести список и сохраним полученную таблицу в формате Excel.
  4. В новой базе откроем обработку Загрузка данных из табличного документа.
  5. Выберем режим "Загрузка в табличную часть" (если реквизит в ТЧ) или "Редактирование существующих объектов".
  6. Проанализируем настройки поиска: установим флаги "Поле поиска" для Номера и Даты документа. Это позволит системе однозначно идентифицировать документ в новой базе.
  7. Запустим загрузку. Программа найдет документы по номеру и дате и заполнит пустое поле нашего нового реквизита данными из Excel.

Способ 2: Программный перенос через таблицу значений и файл

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

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


Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("УИД");
ТЗ.Колонки.Добавить("НаименованиеАнгл");

Пока Выборка.Следующий() Цикл
    Для Каждого СтрокаТЧ Из Выборка.Услуги Цикл
        НоваяСтр = ТЗ.Добавить();
        НоваяСтр.УИД = Строка(Выборка.Ссылка.УникальныйИдентификатор());
        НоваяСтр.НаименованиеАнгл = СтрокаТЧ.НаименованиеАнгл; // Наш реквизит
    КонецЦикла;
КонецЦикла;

ЗначениеВФайл("C:\temp\data_export.txt", ТЗ);

Затем в новой базе выполним загрузку данных из этого файла. Обратите внимание, что поиск по Уникальному Идентификатору (GUID) гораздо надежнее, чем по номеру, так как номера могли измениться при перенумерации.


ТЗ = ЗначениеИзФайла("C:\temp\data_export.txt");
Для Каждого Стр Из ТЗ Цикл
    СсылкаНаДок = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Новый УникальныйИдентификатор(Стр.УИД));
    Если Не СсылкаНаДок.Пустая() Тогда
        Объект = СсылкаНаДок.ПолучитьОбъект();
        // Предположим, мы сопоставляем строки ТЧ по номеру строки или ищем соответствие
        // Для упрощения примера запишем в первую строку
        Если Объект.Услуги.Количество() > 0 Тогда
             Объект.Услуги[0].НаименованиеАнгл = Стр.НаименованиеАнгл;
             Объект.Записать();
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Способ 3: Прямое подключение через COM-соединение

Проанализируем ситуацию, когда баз две, и мы хотим перенести данные «на лету». Это наиболее элегантный способ, если обе базы доступны в одной локальной сети.

В новой базе запустим следующий алгоритм:

  1. Создадим COM-объект для подключения к старой базе.
  2. Выполним запрос к старой базе для получения данных.
  3. Запишем данные в объекты новой базы.

Соединитель = Новый COMObject("V83.COMConnector");
ПутьКБазе = "File=""C:\Bases\OldBase"";Usr=""Администратор"";";
БазаОле = Соединитель.Connect(ПутьКБазе);

Запрос = БазаОле.NewObject("Запрос");
Запрос.Текст = 
"ВЫБРАТЬ
|   Т.Ссылка.Номер КАК Номер,
|   Т.Ссылка.Дата КАК Дата,
|   Т.НаименованиеАнгл КАК НаименованиеАнгл
|ИЗ
|   Документ.РеализацияТоваровУслуг.Услуги КАК Т";

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

Пока Выборка.Следующий() Цикл
    ДокСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Выборка.Номер, Выборка.Дата);
    Если Не ДокСсылка.Пустая() Тогда
        Объект = ДокСсылка.ПолучитьОбъект();
        // Логика поиска нужной строки в табличной части
        // ...
        Объект.Записать();
    КонецЕсли;
КонецЦикла;

Почему не работает "Выгрузка и загрузка данных XML"?

Рассмотрим причину ошибки XDTO, с которой столкнулся автор темы. При использовании типовой обработки ВыгрузкаЗагрузкаДанныхXML.epf происходит попытка сериализации объекта целиком. Если в новом релизе 1С:Бухгалтерии структура табличной части документа изменилась (например, добавилось обязательное поле ИдентификаторСтроки или изменился тип какого-то реквизита), XML-схема старой базы станет невалидной для новой.

Важный момент: Чтобы минимизировать ошибки XDTO, при выгрузке следует снимать флаг "Выгружать по ссылкам" и "Выгружать с движениями". Но даже это не гарантирует успех при значительной разнице релизов. В таких случаях лучше использовать Конвертацию данных 2.0 (КД2), где можно явно сопоставить только нужные поля, игнорируя изменившиеся структуры.

Рекомендация по предотвращению проблемы: "Дополнительные реквизиты"

Чтобы в будущем не сталкиваться с потерей данных при обновлении «затертой» конфигурации, рекомендуем использовать механизм Дополнительных реквизитов и сведений (подсистема БСП). Рассмотрим преимущества этого подхода:

Исправление "Ошибки формата потока"

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

  1. Очистка кэша: Удаление содержимого папок %AppData%\1C\1cv8.
  2. Утилита chdbfl.exe: Проверка физической целостности файла 1Cv8.1cd.
  3. Тестирование и исправление: Запуск из конфигуратора с установленным флагом "Реиндексация таблиц".
  4. Выгрузка/загрузка .dt: Помогает пересобрать базу и устранить логические несоответствия в таблицах Config.

Таким образом, мы выяснили, что наиболее надежным и быстрым способом в данной ситуации является перенос через Excel с поиском по номеру/дате или программный перенос через таблицу значений с поиском по УникальныйИдентификатор. Эти методы позволяют выборочно восстановить утерянную информацию, не вникая в сложные схемы XDTO-сериализации.

← На главную