Перенос данных между устаревшей платформой 1С:Предприятие 7.7 и современными конфигурациями на платформе 1С:Предприятие 8.3 — классическая задача при модернизации учетных систем. При переносе нетиповых документов через конфигурацию Конвертация данных 2.1 разработчики часто сталкиваются с ситуацией, когда документы переносятся пустыми, дублируются элементы справочников или возникают ошибки несоответствия типов данных (ИмяТипа). Рассмотрим причины этих проблем и разберем пошаговые способы их решения.
Разберем основные архитектурные различия между платформами, которые вызывают сбои при стандартной настройке правил обмена:
0 и 1), тогда как в 1С 8.3 используется строгий тип Булево. Номера документов в 7.7 могут иметь числовой тип или содержать префиксы, требующие явного приведения к строке.Источник.ПометкаУдаления(), а не прямое свойство объекта, как в 8.3. Попытка прочитать его напрямую без обработчика приводит к пустому значению.Рассмотрим, как правильно настроить конвертацию свойств документа, чтобы исключить ошибки типов данных и обеспечить перенос реквизитов.
Для всех сопутствующих справочников (Контрагенты, ДоговорыКонтрагентов, Номенклатура) в их ПКО необходимо включить флаги поиска по ключевым реквизитам (например, ИНН + КПП или Код + Наименование).
Чтобы исключить перезапись уже существующей в 8.3 нормативно-справочной информации, на закладке Настройки в ПКО справочников взведите флаг Не замещать существующие объекты в приемнике (только создавать новые).
Для реквизитов с несовпадающими типами данных перейдите в Правила конвертации свойств документа и настройте обработчики событий Перед выгрузкой.
Для номера документа приведите значение к строке:
Значение = СокрЛП(Источник.НомерДок);
Для пометки удаления вызовите соответствующий метод 7.7 с преобразованием результата:
Значение = ?(Источник.ПометкаУдаления() = 1, 1, 0);
Для булевых реквизитов (флагов проведения или признаков учета):
Значение = ?(Источник.УчитыватьНДС = 1, 1, 0);
Если структура табличной части в источнике 7.7 отличается от приемника 8.3, в ПКС табличной части документа в обработчике Перед выгрузкой сформируйте и передайте таблицу данных:
КоллекцияОбъектов = СоздатьОбъект("ТаблицаЗначений");
КоллекцияОбъектов.НоваяКолонка("Номенклатура");
КоллекцияОбъектов.НоваяКолонка("Количество");
КоллекцияОбъектов.НоваяКолонка("Цена");
КоллекцияОбъектов.НоваяКолонка("Сумма");
Источник.ВыбратьСтроки();
Пока Источник.ПолучитьСтроку() = 1 Цикл
КоллекцияОбъектов.НоваяСтрока();
КоллекцияОбъектов.Номенклатура = Источник.Услуга;
КоллекцияОбъектов.Количество = Источник.Количество;
КоллекцияОбъектов.Цена = Источник.Цена;
КоллекцияОбъектов.Сумма = Источник.Сумма;
КонецЦикла;
Если стандартная выборка выгружает 0 объектов, переключите способ выборки в ПВД на Произвольный алгоритм и выполните явный обход документов:
Док = СоздатьОбъект("Документ.ОказаниеУслуг");
Док.ВыбратьДокументы(ДатаНачала, ДатаКонца);
Пока Док.ПолучитьДокумент() = 1 Цикл
ВыгрузитьПоПравилу(Док, , , , "ОказаниеУслуг_Приемник");
КонецЦикла;
Если перенос является разовым и разработка сложных XML-правил в Конвертации данных нецелесообразна, эффективным решением будет прямая загрузка данных из базы 7.7 с помощью внешней обработки в 1С 8.3 через объект COMОбъект.
Рассмотрим пример кода внешней обработки для 1С 8.3, которая подключается к информационной базе 7.7 и создает документы РеализацияТоваровУслуг (вид операции Услуги):
// Инициализация COM-соединения с базой 1С 7.7
База77 = Новый COMОбъект("V77.Application"); // Для SQL-версии: "V77S.Application"
КаталогИБ = "C:\Bases\Accounting77\";
ПараметрыПодключения = "/D""" + КаталогИБ + """ /N""Администратор"" /P""Пароль""";
Если Не База77.Initialize(База77.RMTrade, ПараметрыПодключения, "NO_SPLASH_SHOW") Тогда
ВызватьИсключение "Не удалось подключиться к базе 1С:Предприятия 7.7";
КонецЕсли;
Док77 = База77.CreateObject("Документ.ОказаниеУслуг");
Док77.ВыбратьДокументы(ПериодС, ПериодПо);
Пока Док77.ПолучитьДокумент() = 1 Цикл
// Создаем новый документ в приемнике 1С 8.3
НовыйДок83 = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДок83.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваровУслуг.Услуги;
НовыйДок83.Дата = Док77.ДатаДок;
НовыйДок83.Номер = СокрЛП(Док77.НомерДок);
// Поиск контрагента по ИНН/КПП или наименованию
ИНН_77 = СокрЛП(Док77.Клиент.ИНН);
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН_77);
Если ЗначениеЗаполнено(НайденныйКонтрагент) Тогда
НовыйДок83.Контрагент = НайденныйКонтрагент;
НовыйДок83.ДоговорКонтрагента = НайденныйКонтрагент.ОсновнойДоговорКонтрагента;
КонецЕсли;
// Заполнение табличной части Услуги
Док77.ВыбратьСтроки();
Пока Док77.ПолучитьСтроку() = 1 Цикл
СтрокаТЧ = НовыйДок83.Услуги.Добавить();
НаименованиеУслуги = СокрЛП(Док77.Услуга.Наименование);
СтрокаТЧ.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(НаименованиеУслуги);
СтрокаТЧ.Количество = Док77.Количество;
СтрокаТЧ.Цена = Док77.Цена;
СтрокаТЧ.Сумма = Док77.Сумма;
КонецЦикла;
Попытка
НовыйДок83.Записать(РежимЗаписиДокумента.Запись);
Исключение
Сообщить("Ошибка при записи документа: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Если обработка выгрузки V77Exp.ert перестает загружать обновленный файл правил обмена:
ЗначениеЗаполнено(), Новый Структура, СтрШаблон()).Windows-1251 без спецсимволов и управляющих последовательностей.