При переходе с конфигурации 1С:Управление торговлей (УТ) на 1С:ERP Управление предприятием часто возникает задача переноса больших объемов данных. Один из частых вопросов — как выгрузить данные справочника не целиком, а частями, например, по 10-15 тысяч записей, чтобы избежать перегрузки системы и ошибок. Рассмотрим различные подходы к решению этой проблемы, а также особенности переноса специфических справочников и контактной информации. Для выбора конкретного сценария миграции можно изучить раздел с готовыми решениями для переноса данных в ERP.
Прежде чем приступать к переносу данных, нам следует четко определить стратегию. Вы планируете разовый перенос данных в связи с переходом на новую систему, или же вам необходим постоянный обмен информацией между базами? От этого выбора будет зависеть оптимальный метод реализации.
УниверсальныйОбменДаннымиВФорматеXML) или JSON, а также планы обмена для регистрации изменений.Один из наиболее распространенных и управляемых способов порционной выгрузки данных в 1С — это использование планов обмена. Этот механизм позволяет нам гибко управлять тем, какие данные и в каком объеме будут выгружены. Рассмотрим, как мы можем применить планы обмена для наших задач:
Для программной регистрации изменений в плане обмена мы можем использовать методы объекта ПланыОбменаМенеджер.<ИмяПланаОбмена>.ЗарегистрироватьИзменения() или работать непосредственно с таблицами регистрации изменений, если требуется более тонкий контроль.
Автор вопроса упоминает, что просят использовать именно "Конвертацию данных" (КД2). Это мощный инструмент для описания правил конвертации между различными конфигурациями, но порционная выгрузка через него требует определенных усилий. В чистом виде "Конвертация данных" не имеет встроенного механизма "выгрузить 10000 записей, потом следующие 10000". Однако мы можем реализовать это, используя несколько подходов:
ПередВыгрузкой или ПриВыгрузке. Мы можем добавить в правила выгрузки параметры, которые будут ограничивать выборку данных. Например, мы можем передавать параметры "НачальныйИндекс" и "КоличествоЗаписей", чтобы получить данные порциями.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ &КоличествоЗаписей
| Справочник.ЕдиницыИзмерения.Ссылка
|ИЗ
| Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
|ГДЕ
| ЕдиницыИзмерения.Ссылка > &ПоследняяВыгруженнаяСсылка
|УПОРЯДОЧИТЬ ПО
| ЕдиницыИзмерения.Ссылка";
Запрос.УстановитьПараметр("КоличествоЗаписей", ПараметрыВыгрузки.КоличествоЗаписей);
Запрос.УстановитьПараметр("ПоследняяВыгруженнаяСсылка", ПараметрыВыгрузки.ПоследняяВыгруженнаяСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Добавляем запись в список выгружаемых объектов
ВыгрузитьОбъект(Выборка.Ссылка);
КонецЦикла;
ПоследняяВыгруженнаяСсылка между итерациями выгрузки.Важный момент: Мы должны обеспечить, чтобы при частичной выгрузке соблюдалась последовательность: сначала объекты, не являющиеся документами (справочники, планы видов характеристик) в полном объеме или большими порциями, затем данные, по которым не получено подтверждение загрузки, и только потом остальные объекты (документы). Однако, если мы строго порционно выгружаем справочники, нам потребуется механизм для отслеживания уже выгруженных порций.
Автор упоминает конкретные справочники: "Единицы измерения" и "УпаковкиИЕдиницыИзмерения", а также проблему их объединения. Это одна из наиболее "болезненных" областей при конвертации:
Один из участников дискуссии предлагает не пользоваться "обычной конвертацией" и использовать JSON. Этот подход считается более современным и гибким, особенно для оперативных обменов или когда требуется высокая производительность и минимальный объем передаваемых данных. Рассмотрим его подробнее:
ЧтениеJSON, ЗаписьJSON), что делает его удобным для программной обработки.Мы можем разработать внешнюю обработку или HTTP-сервис в базе-источнике (УТ), который будет выгружать данные справочника порциями в формате JSON. Примерный алгоритм:
// Пример функции для получения порции данных справочника
Функция ПолучитьПорциюСправочника(ПоследнийИД, Количество)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ &КоличествоЗаписей
| Справочник.ЕдиницыИзмерения.Ссылка КАК Ссылка,
| Справочник.ЕдиницыИзмерения.Наименование КАК Наименование,
| Справочник.ЕдиницыИзмерения.Код КАК Код
|ИЗ
| Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
|ГДЕ
| Справочник.ЕдиницыИзмерения.Ссылка > &ПоследнийИД
|УПОРЯДОЧИТЬ ПО
| Справочник.ЕдиницыИзмерения.Ссылка";
Запрос.УстановитьПараметр("КоличествоЗаписей", Количество);
Запрос.УстановитьПараметр("ПоследнийИД", ПоследнийИД);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
МассивДанных = Новый Массив;
Пока Выборка.Следующий() Цикл
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Ссылка", Строка(Выборка.Ссылка.УникальныйИдентификатор()));
СтруктураДанных.Вставить("Наименование", Выборка.Наименование);
СтруктураДанных.Вставить("Код", Выборка.Код);
// Добавляем другие реквизиты
МассивДанных.Добавить(СтруктураДанных);
ПоследнийИД = Выборка.Ссылка;
КонецЦикла;
Результат = Новый Структура;
Результат.Вставить("Данные", МассивДанных);
Результат.Вставить("ПоследнийИД", ПоследнийИД);
Возврат Результат;
КонецФункции
// Пример использования для записи в JSON
ПоследнийИД = Неопределено; // Начальное значение
Пока Истина Цикл
Порция = ПолучитьПорциюСправочника(ПоследнийИД, 10000);
Если Порция.Данные.Количество() = 0 Тогда
Прервать;
КонецЕсли;
// Запись порции в файл или отправка через HTTP
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Порция.Данные);
ТекстJSON = ЗаписьJSON.Закрыть();
// Сохраняем ТекстJSON в файл или отправляем на HTTP-сервис ERP
// ...
ПоследнийИД = Порция.ПоследнийИД;
КонецЦикла;
Мы разрабатываем HTTP-сервис или внешнюю обработку, которая будет принимать JSON-данные, десериализовать их (ПрочитатьJSON()) и загружать в соответствующие справочники ERP. Здесь также можно реализовать логику сопоставления и консолидации, аналогичную той, что используется для "Единиц измерения" и "Упаковок".
// Пример функции для загрузки данных из JSON
Функция ЗагрузитьДанныеИзJSON(ТекстJSON)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстJSON);
МассивДанных = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Для Каждого ДанныеЗаписи Из МассивДанных Цикл
СсылкаИзERP = Справочники.ЕдиницыИзмерения.НайтиПоКоду(ДанныеЗаписи.Код); // Или по другому уникальному реквизиту
Если СсылкаИзERP = Неопределено Тогда
НовыйЭлемент = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
НовыйЭлемент.Код = ДанныеЗаписи.Код;
НовыйЭлемент.Наименование = ДанныеЗаписи.Наименование;
// Заполняем другие реквизиты
НовыйЭлемент.Записать();
Иначе
// Обновляем существующий элемент, если требуется
СсылкаИзERP.Наименование = ДанныеЗаписи.Наименование;
// Обновляем другие реквизиты
СсылкаИзERP.Записать();
КонецЕсли;
КонецЦикла;
КонецФункции
ВыгрузкаЗагрузкаJSON_1.2.2.epf или аналогичные решения на Infostart. Мы можем использовать их как основу, дорабатывая под наши специфические требования.Важно: Несмотря на свою гибкость, JSON-обмен требует более глубокого понимания программной разработки и может быть сложнее в реализации для тех, кто привык к декларативным правилам КД.
Автор также упоминает проблемы с переносом контактной информации. Это распространенная задача, требующая внимательного подхода:
КонтактнаяИнформация), который связан с различными объектами (справочники "Организации", "Контрагенты", "ФизическиеЛица" и т.д.) через уникальный идентификатор владельца.Независимо от выбранного метода, мы должны учитывать несколько общих рекомендаций:
Выбор метода (планы обмена, КД2 или JSON) будет зависеть от сложности задачи, объема данных, квалификации разработчиков и требований к оперативности обмена. Важно провести тщательный анализ и тестовые испытания перед началом рабочего переноса.