Перенос данных между разными версиями платформы (например, из 8.2 в 8.1) часто вызывает вопросы у начинающих разработчиков. Основная сложность заключается не в самой передаче текста или чисел, а в правильном сопоставлении ссылочных объектов, таких как Номенклатура, СерииНоменклатуры и ЕдиницыИзмерения. Рассмотрим подробно, как решить задачу переноса штрихкодов из конфигурации «Управление торговлей 10.3» (на платформе 8.2) в отраслевое решение на базе 8.1.
Перед нами стоит задача: перенести записи регистра сведений Штрихкоды. Условием сопоставления являются одинаковые наименования позиций номенклатуры и их серий. Мы разберем три основных метода решения этой задачи: прямое подключение через COM-соединение, использование универсальной обработки загрузки из табличного документа и профессиональный подход с применением «1С:Конвертация данных 2.1».
Этот метод позволяет прочитать данные непосредственно из базы-источника (8.2), находясь в базе-приемнике (8.1). Рассмотрим типичную ошибку новичков и правильный вариант реализации. Проанализируем код, в котором данные считываются через запрос к внешней базе.
Ошибочный подход: Часто пытаются напрямую присвоить строковое представление (например, наименование) в поле, которое ожидает ссылку. Это приведет к тому, что поля в базе-приемнике останутся пустыми, так как типы «Строка» и «СправочникСсылка» несовместимы.
Правильный алгоритм действий при COM-соединении:
V82.ComConnector.Штрихкоды в базе-источнике.Рассмотрим пример исправленного кода для переноса:
Комобъект = Новый COMОбъект("V82.ComConnector");
СтрокаСоединения = "File=""C:\Base82"";Usr=""Админ"";";
ВнешняяБаза = Комобъект.Connect(СтрокаСоединения);
ЗапроскГЛ = ВнешняяБаза.NewObject("Запрос");
ЗапроскГЛ.Текст =
"ВЫБРАТЬ
| Штрихкоды.Штрихкод КАК Штрихкод,
| Штрихкоды.Владелец.Наименование КАК НаименованиеНоменклатуры,
| Штрихкоды.СерияНоменклатуры.Наименование КАК НаименованиеСерии,
| Штрихкоды.ТипШтрихкода КАК ТипШтрихкода
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды";
Выборка = ЗапроскГЛ.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Ищем номенклатуру в текущей базе по наименованию
СсылкаНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.НаименованиеНоменклатуры);
Если СсылкаНоменклатура.Пустая() Тогда
Продолжить; // Если номенклатура не найдена, пропускаем запись
КонецЕсли;
// Создаем запись в регистре сведений текущей базы
МенеджерЗаписи = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Штрихкод = Выборка.Штрихкод;
МенеджерЗаписи.Владелец = СсылкаНоменклатура;
// Если нужно учитывать серии
Если ЗначениеЗаполнено(Выборка.НаименованиеСерии) Тогда
МенеджерЗаписи.СерияНоменклатуры = Справочники.СерииНоменклатуры.НайтиПоНаименованию(Выборка.НаименованиеСерии, Истина, , СсылкаНоменклатура);
КонецЕсли;
МенеджерЗаписи.Записать(Истина);
КонецЦикла;
Обратим внимание на важный нюанс: при поиске серии мы используем владельца (найденную номенклатуру), так как серии подчинены номенклатуре и их наименования могут дублироваться у разных товаров.
Если написание кода кажется сложным, воспользуемся стандартным инструментом «Загрузка данных из табличного документа». Этот метод особенно хорош тем, что он визуально понятен и позволяет гибко настроить поля поиска.
Пошаговый план действий:
Штрихкоды.ЗагрузкаДанныхИзТабличногоДокумента.epf.Штрихкоды.Это самый профессиональный и надежный метод. Он незаменим, если данных очень много или структура регистров в 8.1 и 8.2 существенно различается. Выясним, почему этот метод предпочтительнее.
Проанализируем преимущества КД 2.1:
Проанализируем ситуацию, когда перенос может пойти не по плану. Выделим несколько критических моментов:
1. Контроль уникальности штрихкодов. В типовых решениях 1С часто установлена проверка на уникальность штрихкода. Если в базе-источнике по какой-то причине один штрихкод присвоен двум разным товарам, при попытке записи в базу-приемник программа выдаст ошибку «Запись с такими ключевыми полями существует». Перед началом переноса рекомендуется выполнить поиск дублей в исходной базе.
2. Разрядность платформ. При использовании COM-соединения важно учитывать, что если база 8.2 работает на 64-битном сервере, а 8.1 — на 32-битном клиенте, могут возникнуть проблемы с инициализацией ComConnector. В этом случае проще и быстрее использовать метод с Excel или XML-файлом.
3. Непериодические регистры. Помните, что регистр Штрихкоды в УТ 10.3 является независимым и непериодическим. У него нет измерения «Период», но есть ключевые измерения (обычно это сам Штрихкод). Если вы используете НаборЗаписей вместо МенеджерЗаписи, будьте осторожны: метод Записать() без параметров может очистить весь регистр перед записью новых данных. Всегда используйте Записать(Ложь) для добавления или МенеджерЗаписи для точечной работы.
Мы рассмотрели различные подходы к синхронизации штрихкодов. Для разового переноса небольшого объема данных идеально подойдет загрузка из табличного документа. Если же вам требуется автоматизировать процесс или переносить данные регулярно, лучше один раз настроить COM-соединение с корректным поиском ссылок или создать правила в Конвертации данных. Главное — всегда проверять результат поиска ссылок, чтобы штрихкоды не оказались привязанными к «пустым» объектам номенклатуры.