Ситуация, когда долгожданное обновление на новую редакцию (например, переход с УТ 11.2 на УТ 11.3) оборачивается лавиной критических ошибок в первый же рабочий день, увы, не редкость. Работать в системе становится невозможно, а просто откатиться к утренней резервной копии нельзя — менеджеры уже успели ввести сотни документов, выставить счета и провести новые реализации. В этой статье мы подробно разберем, как выйти из этой непростой ситуации, почему не сработает простой даунгрейд конфигурации и какими способами можно вернуть базу на стабильный релиз 11.2 с минимальными потерями данных.
У многих начинающих специалистов возникает соблазн просто взять файл конфигурации 1centerprise.cf предыдущего релиза УТ 11.2, зайти в Конфигуратор обновленной базы УТ 11.3 и выполнить команду «Загрузить конфигурацию из файла». Делать это категорически запрещено!
Проанализируем технические причины, почему такая попытка приведет к краху системы:
Единственным безопасным и работоспособным вариантом отката является следующая последовательность действий:
Рассмотрим подробнее доступные технические инструменты для реализации этой схемы.
Если обе версии конфигураций поддерживают синхронизацию через универсальный формат обмена EnterpriseData (это штатный механизм для современных версий УТ), мы можем использовать его для переноса.
Преимущество этого метода в том, что формат EnterpriseData описывает бизнес-сущности в виде XML-схем, независимых от конкретных изменений в таблицах СУБД. Это позволяет нивелировать разницу в метаданных между 11.3 и 11.2.
Разберем процесс по шагам:
Если документов за день было создано немного, самым надежным и контролируемым решением будет написание небольшой внешней обработки. Она подключится из старой базы к новой по COM и программно создаст нужные объекты.
Выясним, как написать код для такого переноса. Создадим в восстановленной базе 11.2 внешнюю обработку и пропишем в модуле процедуру подключения и переноса:
Процедура ПеренестиДокументыЗаДень()
// Настраиваем COM-соединение с базой УТ 11.3
Connector = Новый COMОбъект("V83.COMConnector");
ПараметрыПодключения = "Srvr=""Server1C"";Ref=""ut11_3_damaged"";Usr=""Администратор"";Pwd=""Password""";
Попытка
База113 = Connector.Connect(ПараметрыПодключения);
Исключение
Сообщить("Не удалось подключиться к базе УТ 11.3: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Выбираем документы определенного типа за рабочую дату
Запрос113 = База113.NewObject("Запрос");
Запрос113.Text =
"ВЫБРАТЬ
| Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Дата МЕЖДУ &НачалоДня И &КонецДня";
Запрос113.SetParameter("НачалоДня", НачалоДня(ТекущаяДата()));
Запрос113.SetParameter("КонецДня", КонецДня(ТекущаяДата()));
Результат = Запрос113.Execute();
Выборка = Результат.Choose();
Пока Выборка.Next() Цикл
// Создаем новый документ в нашей базе УТ 11.2
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = Выборка.Ссылка.Date;
НовыйДокумент.Номер = Выборка.Ссылка.Number;
// Нам нужно найти контрагента в базе 11.2 по ИНН/КПП из базы 11.3
ИННКонтрагента = Выборка.Ссылка.Контрагент.ИНН;
КППКонтрагента = Выборка.Ссылка.Контрагент.КПП;
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИННКонтрагента);
Если Не НайденныйКонтрагент.Пустая() Тогда
НовыйДокумент.Контрагент = НайденныйКонтрагент;
КонецЕсли;
// Заполняем табличную часть товары
Для Каждого СтрокаТовара Из Выборка.Ссылка.Товары Цикл
НоваяСтрока = НовыйДокумент.Товары.Добавить();
// Код номенклатуры используем для поиска соответствия
КодНоменклатуры = СтрокаТовара.Номенклатура.Код;
НайденнаяНоменклатура = Справочники.Номенклатура.НайтиПоКоду(КодНоменклатуры);
Если Не НайденнаяНоменклатура.Пустая() Тогда
НоваяСтрока.Номенклатура = НайденнаяНоменклатура;
КонецЕсли;
НоваяСтрока.Количество = СтрокаТовара.Количество;
НоваяСтрока.Цена = СтрокаТовара.Цена;
НоваяСтрока.Сумма = СтрокаТовара.Сумма;
КонецЦикла;
Попытка
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить("Ошибка при проведении документа: " + НовыйДокумент.Номер + " - " + ОписаниеОшибки());
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
КонецПопытки;
КонецПроцедуры
Этот пример наглядно демонстрирует, как можно точечно перенести ключевые документы через COM. Достоинством метода является полный контроль над процессом поиска дублей и сопоставления реквизитов.
Если объем метаданных велик и вам нужно перенести десятки различных видов документов со всеми связанными новыми элементами справочников, лучше всего воспользоваться специализированным инструментом — конфигурацией «Конвертация данных 2.1».
Посмотрим на алгоритм работы:
MD83Exp.epf.УниверсальныйОбменДаннымиXML.epf, выбираем созданные правила, задаем отбор по дате документов и выгружаем данные.Если у вас нет под рукой «Конвертации данных» и нет навыков COM-программирования, можно воспользоваться полуавтоматическим методом.
В платформе 1С есть отличный встроенный инструмент — обработка «Загрузка данных из табличного документа». С ее помощью можно перенести документы по следующей схеме:
Прежде чем приступать к трудоемкой процедуре отката, взвесьте все риски. Иногда исправление нескольких критических ошибок непосредственно в рабочей базе УТ 11.3 силами программиста занимает меньше времени, чем перенос документов крупного торгового предприятия за целый день. Ведь при переносе могут поехать складские остатки, партионный учет или себестоимость.
Для оперативного исправления багов вендора используйте механизм Расширений конфигурации:
&Вместо, не снимая основную конфигурацию с поддержки.