В практике работы с 1С:Предприятие часто возникают ситуации, когда типовое обновление конфигурации прерывается критическими ошибками, такими как "Ошибка формата потока". В подобных случаях администраторы иногда прибегают к радикальному методу — загрузке чистой типовой конфигурации поверх поврежденной. Однако это приводит к потере всех нетиповых доработок и, что более критично, данных, которые хранились в этих доработках. Рассмотрим детально, как можно восстановить данные конкретного реквизита (например, английского наименования услуги в документе реализации) из резервной копии и перенести их в новую, обновленную базу, даже если их структуры метаданных различаются.
Прежде чем приступать к переносу, проанализируем ситуацию. Исходная база имела доработку — строковый реквизит в табличной части документа РеализацияТоваровУслуг. После загрузки типового .cf файла реквизит исчез. Для восстановления данных нам потребуется копия старой базы (до «затирания» доработок) и текущая рабочая база. В текущей базе необходимо предварительно восстановить структуру метаданных, то есть заново создать тот самый реквизит с тем же типом и идентификатором, чтобы нам было куда записывать данные.
Это наиболее доступный метод, не требующий глубоких навыков программирования. Мы воспользуемся механизмом вывода списка и универсальной обработкой ЗагрузкаДанныхИзТабличногоДокумента.epf.
Реализация (акты, накладные).Загрузка данных из табличного документа.Рассмотрим более надежный метод для программистов, который исключает ошибки форматирования Excel. Мы выгрузим данные в файл в виде сериализованной таблицы значений. Выясним, как это сделать с помощью простых скриптов.
В старой базе создадим внешнюю обработку и пропишем код для выгрузки данных:
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("УИД");
ТЗ.Колонки.Добавить("НаименованиеАнгл");
Пока Выборка.Следующий() Цикл
Для Каждого СтрокаТЧ Из Выборка.Услуги Цикл
НоваяСтр = ТЗ.Добавить();
НоваяСтр.УИД = Строка(Выборка.Ссылка.УникальныйИдентификатор());
НоваяСтр.НаименованиеАнгл = СтрокаТЧ.НаименованиеАнгл; // Наш реквизит
КонецЦикла;
КонецЦикла;
ЗначениеВФайл("C:\temp\data_export.txt", ТЗ);
Затем в новой базе выполним загрузку данных из этого файла. Обратите внимание, что поиск по Уникальному Идентификатору (GUID) гораздо надежнее, чем по номеру, так как номера могли измениться при перенумерации.
ТЗ = ЗначениеИзФайла("C:\temp\data_export.txt");
Для Каждого Стр Из ТЗ Цикл
СсылкаНаДок = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Новый УникальныйИдентификатор(Стр.УИД));
Если Не СсылкаНаДок.Пустая() Тогда
Объект = СсылкаНаДок.ПолучитьОбъект();
// Предположим, мы сопоставляем строки ТЧ по номеру строки или ищем соответствие
// Для упрощения примера запишем в первую строку
Если Объект.Услуги.Количество() > 0 Тогда
Объект.Услуги[0].НаименованиеАнгл = Стр.НаименованиеАнгл;
Объект.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Проанализируем ситуацию, когда баз две, и мы хотим перенести данные «на лету». Это наиболее элегантный способ, если обе базы доступны в одной локальной сети.
В новой базе запустим следующий алгоритм:
Соединитель = Новый COMObject("V83.COMConnector");
ПутьКБазе = "File=""C:\Bases\OldBase"";Usr=""Администратор"";";
БазаОле = Соединитель.Connect(ПутьКБазе);
Запрос = БазаОле.NewObject("Запрос");
Запрос.Текст =
"ВЫБРАТЬ
| Т.Ссылка.Номер КАК Номер,
| Т.Ссылка.Дата КАК Дата,
| Т.НаименованиеАнгл КАК НаименованиеАнгл
|ИЗ
| Документ.РеализацияТоваровУслуг.Услуги КАК Т";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ДокСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Выборка.Номер, Выборка.Дата);
Если Не ДокСсылка.Пустая() Тогда
Объект = ДокСсылка.ПолучитьОбъект();
// Логика поиска нужной строки в табличной части
// ...
Объект.Записать();
КонецЕсли;
КонецЦикла;
Рассмотрим причину ошибки XDTO, с которой столкнулся автор темы. При использовании типовой обработки ВыгрузкаЗагрузкаДанныхXML.epf происходит попытка сериализации объекта целиком. Если в новом релизе 1С:Бухгалтерии структура табличной части документа изменилась (например, добавилось обязательное поле ИдентификаторСтроки или изменился тип какого-то реквизита), XML-схема старой базы станет невалидной для новой.
Важный момент: Чтобы минимизировать ошибки XDTO, при выгрузке следует снимать флаг "Выгружать по ссылкам" и "Выгружать с движениями". Но даже это не гарантирует успех при значительной разнице релизов. В таких случаях лучше использовать Конвертацию данных 2.0 (КД2), где можно явно сопоставить только нужные поля, игнорируя изменившиеся структуры.
Чтобы в будущем не сталкиваться с потерей данных при обновлении «затертой» конфигурации, рекомендуем использовать механизм Дополнительных реквизитов и сведений (подсистема БСП). Рассмотрим преимущества этого подхода:
ДополнительныеЗначения.Поскольку автор темы упомянул, что не смог обновиться из-за ошибки формата потока, кратко разберем, как следовало поступить вместо затирания конфигурации:
%AppData%\1C\1cv8.1Cv8.1cd.Config.Таким образом, мы выяснили, что наиболее надежным и быстрым способом в данной ситуации является перенос через Excel с поиском по номеру/дате или программный перенос через таблицу значений с поиском по УникальныйИдентификатор. Эти методы позволяют выборочно восстановить утерянную информацию, не вникая в сложные схемы XDTO-сериализации.