Универсальная выгрузка/загрузка данных для отличающихся конфигураций (JSON, Такси+ОФ)
Администрирование - Распределенная БД (УРИБ, УРБД)
перенос данных обмен синхронизация JSON
Универсальная выгрузка любых объектов 1С в текстовый файл и загрузка в любую другую базу 1С. Либо просто перенос через буфер обмена.
Переносит данные между любыми ИБ на любых конфигурациях, интерфейсах и платформах 8.2, 8.3 (в том числе в режиме совместимости с 8.1). Не требует никаких настроек.
На скриншотах пример переноса документов и справочников из ERP Такси 8.3 в БП1.6 ОФ 8.2.
При переносе данных поля, которые совпадают, заполняются, поля, которые не совпадают, игнорируются. Табличные части очищаются и переносятся заново. Существующие объекты обновляются. Новые записываются с УИДом базы-источника.
Синхронизация ссылок по УИД. Обработка ничего не проверяет, просто переносит объекты в режиме обмена данными. Движения не переносит.
Порядок работы:
Порядок работы аналогичен типовой обработке "Выгрузка/загрузка XML"
1. Запускаем обработку в исходной базе.
2. Добавляем в ТЧ объекты, которые хотим перенести. Либо поштучно, либо запросом. Для формирования запроса можно использовать конструктор запросов.
3. Нажимаем "Объекты -> JSON". Текст отображается в правом поле.
4. Нажимаем "Сохранить в файл" или копируем сформированный текст в буфер обмена - Ctrl+С
5. Открываем вторую базу.
6. Нажимаем "Загрузить из файла" или вставляем текст из буфера Ctrl + V
7. Нажимаем кнопку "JSON -> Объекты"
8. Проверяем результат
Перенос в отличающиеся объекты метаданных (например документы поступления в документы реализации) стандартно не предусмотрен. Но можно нажать Ctrl+H и заменить имена объектов в тексте перед загрузкой.
Аналогично можно заменить перед загрузкой имена полей, если в справочниках двух баз отличаются имена реквизитов.
Рекоммендуемый режим работы УФ Такси. Также есть дополнительная обычная форма.
Для преобразования объектов в текст используется эта библиотека в1.2. Дополнительно она доработана для автоматического формирования перечня метаданных, обработки возникающих из-за расхождения перечня метаданных ошибок и добавлен удобный интерфейс выбора объектов и запись объектов сразу после переноса.
upd. Добавлена версия 1.2.1. Доработан управляемый интерфейс аналогично типовой обработке "Выгрузка/загрузка XML". Упрощен выбор объектов для переноса, добавлена возможность добавления объектов запросом для массовой выгрузки. С 8.3.5.1068 доступен конструктор запроса.
Проверялась на: БП3.0, БП1.6, УПП 1.3, ERP 2.0, УТ11.1, УТ10.3, Розница 2.1 - теоретически должна корректно переносить данные между любыми конфигурациями 8.2-8.3 (в том числе в режиме совместимости с 8.1).
Если на какой-то не работает, пишите в комментариях.
Также рекоммендую из других универсальных разработок:
- [Расширение] Проверка ввода данных и события форм без изменения конфигурации (для БП, УТ, ЗУП, Розницы, ERP)
- [Расширение] Контроль отрицательных остатков по регистру бухгалтерии при проведении
- Комплексная проверка ведения учета в УТ10, УТ11, КА, УПП, ERP - простой отчет для проверки корректности ведения учета по всем разделам учета.
Скачать файлы
Наименование | Файл | Версия | Размер | |||
---|---|---|---|---|---|---|
ПереносОбъектов1С_JSON_1_2.epf (устарело)
.epf 19,77Kb
26.08.16
394
|
.epf | 1.2.0 | 19,77Kb | 394 | Скачать | |
ВыгрузкаЗагрузкаJSON82_1.2.1.epf (8.2+)
.epf 26,88Kb
26.08.16
931
|
.epf | 1.2.1 | 26,88Kb | 931 | Скачать | |
ВыгрузкаЗагрузкаJSON_1.2.1.epf (8.3+)
.epf 26,89Kb
26.08.16
2576
|
.epf | 1.2.1 | 26,89Kb | 2576 | Скачать |
См. также
Специальные предложения
Запустила на демобазе "Розница, редакция 2.1 (2.1.4.9)" на полной поддержке.
Платформа "1С:Предприятие 8.3 (8.3.5.1119)"
Абсолютно корректно формируется запрос, выгружаются все контрагенты и загружаются обратно.
Выложите куда-нибудь на файлообменник свою копию, попробую проверить.
Или можете свою обновить до актуальной. Данные от этого не изменятся.
то есть выбрать скажем все значения справочника уже не могу(((
платформа 8.3.5.1146, конфа Бух3.0
Пока не могу понять причину. Возможно, ошибка платформы, позже поправят.
Корректно работает в файловом варианте или в тонком клиенте для серверной базы.
В крайнем случае тест запроса можно вручную написать или сформировать в конфигураторе и скопировать.
Существует ли возможность подбора не вручную позиций справочников Номенклатура и Контрагенты?
У меня не получилось. Огромная база номенклатуры, очень неудобно выбирать каждую позицию вручную для формирования Текста JSON.
Использовал ВыгрузкаЗагрузкаJSON_1.2.1.epf
Выгружаю из УТ (10.3.27.2), 1С:Предприятие 8.2 (8.2.19.90), планирую загрузить в Комплексная автоматизация, редакция 1.1 (1.1.55.1), 1С:Предприятие 8.3 (8.3.5.1068)
Такая возможность есть только в управляемой форме. Соответственно нужно запустить конфигурацию в управляемом режиме. Насколько я помню, УТ 10.3 вполне запускается в тонком клиенте.
Скачала 8.2+ ,кнопки Добавить запросом и выгрузить в файл- нет.
{Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(93)}: Ошибка при вызове метода контекста (ОткрытьФорму)
ОткрытьФорму("Справочник.Партнеры." + ИмяФормыДляОткрытия, Новый Структура("Ключ", Объект.Партнер), );
по причине:
Объект не найден
Такая ошибка возможна, если у вас установлена опция "Использовать партнеров как контрагентов" и вы перенесли только элемент справочника "Контрагенты". и пытаетесь его открыть. Для работы УТ11 обязателен перенос связанных элементов справочника "Партнеры" и "Контрагенты" одновременно. Один без другого не имеет смысла.
Технически добавить перенос связанных несложно.
Вопрос в том, что переносить.
Если переносить все подряд, то можно из-за одного элемента перенести пол-базы. Не факт, что пользователю это действительно нужно. Можно случайно перетереть корректные данные текущей базы данными другой базы, которые пользователь не выбирал.
Предложите варианты, как должен работать перенос связанных элементов с точки зрения логики.
Я подумаю.
Смысл в том, что должно быть универсально для любых баз без привязки к конфигурациям.
Я так и не добралась доработать обычный режим до текущего состояния управляемой формы.
Пусть тут пока в бесплатном варианте висит, я не против.
Позже объединю с обоими вариантами.
Все равно скорее всего отдельно буду добавлять вариант под 8.3.6. На ней гораздо быстрее будет работать на встроенном JSON.
У 1С с 8.3.6 есть встроенная в платформу работа с JSON.
На текущий момент я ее не использую, т.е. никакой разницы в скорости нет.
Переделаю обработку на использование встроенного JSON уже в 8.3.7, когда появится полноценная сериализация объектов.
Поэтому, ваш вариант даже предпочтительней - он понятно, что делает, и можно подстроить/отследить ход процесса.
Вручную можно было бы перенести за час. :(
Пока не могу решить, что делать в случаях:
1. Разной структуры, из-за которой в другой базе получаются дубли по ключам.
2. Как их удобно отбирать пользователю (сейчас пользователь просто выбирает ссылку). Как должен выглядеть выбор записей из разных регистров не знаю.
Зависимые регистры, на мой взгляд, логичнее переносить документами и формировать заново от регистратора.
по необходимости была добавлена выборка объектов из журнала регистрации.
код моей обработки
&НаСервере
Процедура ВыбратьОбъектыИзЖРНаСервере(ДатаНачала,ДатаОкончания)
отбор = новый структура("ДатаНачала,ДатаОкончания",ДатаНачала,ДатаОкончания);
массивСобытий = новый массив;
массивСобытий.Добавить("_$Data$_.New");
массивСобытий.Добавить("_$Data$_.Post");
массивСобытий.Добавить("_$Data$_.Unpost");
массивСобытий.Добавить("_$Data$_.Update");
Отбор.Вставить("Событие",массивСобытий);
Список1 = новый таблицаЗначений;
ВыгрузитьЖурналРегистрации(Список1, отбор, "Данные");
Список1.Свернуть("Данные","");
зн1=Список1.Количество();
пока зн1>0 Цикл
зн1=зн1-1;
зн=Список1[зн1];
Если не ЗначениеЗаполнено(зн.Данные) Тогда
Список1.Удалить(зн1);
КонецЕсли;
КонецЦикла;
Список1.Колонки.Найти("Данные").Имя="СсылкаНаОбъект";
объект.ПереносимыеОбъекты.Загрузить(Список1);
КонецПроцедуры
&НаКлиенте
Процедура ВыбратьОбъектыИзЖР(Команда)
Если 0=1 Тогда // тут нельзя полдня выбрать :(
ПеременнаяТипаСтандартныйПериод = Новый СтандартныйПериод;
Диалог = Новый ДиалогРедактированияСтандартногоПериода();
Диалог.Период = ПеременнаяТипаСтандартныйПериод;
Диалог.Период.Вариант=ВариантСтандартногоПериода.ПроизвольныйПериод;
Если Диалог.Редактировать() Тогда
ПеременнаяТипаСтандартныйПериод = Диалог.Период;
ВыбратьОбъектыИзЖРНаСервере(ПеременнаяТипаСтандартныйПериод.ДатаНачала,ПеременнаяТипаСтандартныйПериод.ДатаОкончания);
КонецЕсли;
иначеесли 1=1 тогда
ДатаНачала=ТекущаяДата();
ВвестиДату(ДатаНачала,"ВВедите Дату Начала",ЧастиДаты.ДатаВремя);
ДатаОкончания=ТекущаяДата();
ВвестиДату(ДатаОкончания,"ВВедите Дату Окончания",ЧастиДаты.ДатаВремя);
Если ЗначениеЗаполнено(ДатаНачала) Тогда
ВыбратьОбъектыИзЖРНаСервере(ДатаНачала,ДатаОкончания);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показатья думаю что в обработку можно добавить дополнительные отборы (пользователь, тип приложения, виды объектов).
Ещё хотелось бы в будущем увидеть возможность переноса документов вместе с движениями.
(44) Да смысл именно в том чтобы перенести наработку пользователей, за период. Перенос движений наверное делать так-же, что совпало по наименованиям, переносим, нет ну и ладно.
В этом релизе появится сериализация объектов в JSON через XDTO, полностью аналогичная имеющейся сериализации в XML.
Соответсвенно, можно использовать тот же подход, что сейчас в обычном обмене по правилам.
Начать с того, что проанализировать типовую обработку, на каких этапах выполняется запись и чтение данных в файл.
Сериализация одна и единственная - объекты 1С - в текстовое представление (по формату XDTO или JSON - не важно, все они XML).
Будем жать 8.3.7 и новой версии под новые возможности.
Предложения:
1. После нажатия "Объекты -> JSON" переходить на страницу "Текст JSON".
- Просто удобно :)
2. После чтения через "JSON -> Объекты" сообщения об успешной записи объекта выводить через параметр "Выводить уведомления".
- Объектов может быть много :)
А так обработка крутая! :) Спасибо.
Если вцелом про работу с запросами, то табличные части отлично выбираются наравне с обычными реквизитами. Просто переносите их в конструкторе в правое поле "Поля". Есть два варианта: либо выбирать из общей таблицы, тогда в результате запроса они будут в виде отдельных выборок, либо изначально выбирать данные именно из табличных частей как основных таблиц, тогда в результате будет обычная выборка с данными табличных частей.
P.s. В БП 8.2 при запуске обработки не конструтора запросов. Есть только поля для выбора элементов. В 8.3 УНФ есть возможность формировать запросы. Нужно из БП в УНФ.
Для работы с конвертацией нужен программист, который умеет ей пользоваться.
Рядовой бухгалтер не настроит. Хотя, конечно, конвертация более универсальна.
Эта обработка не требует никаких настроек.
Открыл в первой базе - выгрузил.
Открыл во второй - загрузил.
Наиболее удобно для близких по структуре конфигураций, у которых схожий набор полей.
Однако, возможно, в конфигурации ошибка в каком-то обработчике, для которого нужны предварительно перенесенные связанные данные.
Уточните, на каком именно этапе ошибка.
Нужен полный текст, чтобы было видно, в каком именно модуле.
Напишите в личку. Возможно, смогу что-то подсказать.
Вот поэтому не надо людям голову морочить. Таких "нельзя" - тысячи.
Надо, чтобы пользователь понимал, что волшебной кнопки не существует.
Даже при переносе между идентичными конфигурациями есть существенные ограничения в силу
"связанности" объектов, а для различным конфигураций и вовсе непригодно.
Кроме различий в структуре базы данных, есть еще различия в алгоритмах (методиках).
Об этом вообще почему-то никто не думает.
Простой пример. В УПП (КА) "внутри" документа как правило нет счетов учета, хотя реквизиты такие есть. Но счета учета определяются в момент проведения и в базе не хранятся. А например в БП заполнение аналогичных реквизитов обязательно. Ну и как Вы собираетесь решать эту проблему при "универсальном, не требующем никаких настроек" переносе?
Пару ошибок - пол и вид образования не совпадали названия объектов, исправил.. но так же пусто
Как именно проверяли, есть ли элементы?
Если просто через форму списка, то скорее всего какие-то фильтры включены при просмотре.
Попробуйте просто отобрать данные консолью запросов без никаких условий отбора.
.
Спасибо.
Почитать тут можно
Но что-то вся проблема упирается в то, что в 1С до сих пор просто не оптимизированы функции чтения/записи из/в обычного текстового файла.
Но зато постоянно предлагаются видимость "быстрой альтернативы"...
При загрузке Контрагентов (в ДО Корреспондентов выводятся сообщения
1) не найден тип данных. СправочникСсылка.Корреспонденты
2) не найден тип данных. ПеречислениеСсылка. ЮридическоеФизическоеЛицо )
Проверьте названия справочников и их структуру. Если структура близка и отличаются наименования, то можете попробовать нажать в выгруженном файле Ctrl+H и заменить "СправочникСсылка.Корреспонденты" на "СправочникСсылка.Контрагенты"
Для ускорения выгрузки в предлагаю конкатенацию строк JSON'а попробовать реализовать через:
ТекстПостроитель = Новый ЗаписьXML;
ТекстПостроитель.УстановитьСтроку();
ТекстПостроитель.ЗаписатьБезОбработки(БазоваяСтрокаПС);
Спасибо.
Поставил на загрузку. Сейчас 16:26
Закончилась загрузка: 08.09.2015 16:53:06
ОбъектОбработка.JSONВОбъекты();
по причине:
Превышен максимальный расход памяти сервера за один вызов
В БД приемнике установлен лимит :( В источнике его нет поэтому выгрузилось без ошибки.
з.ы.: Из 4х документов 2 загрузилось.
з.з.ы.: остальные загрузились без ошибки: 08.09.2015 17:08:27 (минут за 10).
суть в следующем :
1. Получаем записи регистра :
Функция ПолучитьПакетСсылокРегистраСведений(УзелОбмена,РазмерПакета,ПолноеИмяМетаданных)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 *
|ИЗ
| РегистрСведений.Изменения КАК РегистрСведенийИзменения
|ГДЕ
| РегистрСведенийИзменения.Узел = &Узел";
Запрос.Текст = СтрЗаменить(Запрос.Текст,"1",Формат(Число(РазмерПакета),"ЧГ="));
Запрос.Текст = СтрЗаменить(Запрос.Текст,"РегистрСведений.",ПолноеИмяМетаданных);
Запрос.УстановитьПараметр("Узел",УзелОбмена);
Пакет = Запрос.Выполнить().Выгрузить();
Возврат Пакет;
КонецФункции
Показатьв моем случае я получаю изменения, в обработке запрос будет в соответствии с отборами по самому регистру.
2. Создаю структуру с измерениями, ресурсами и пр. для регистра
Функция СоздатьСтруктуруМетаданныхРегистраСведений(ПолноеИмяМетаданных,МетаданныеРегистра = Неопределено)
Если МетаданныеРегистра = Неопределено Тогда
МетаданныеРегистра = Метаданные.РегистрыСведений[СтрЗаменить(ПолноеИмяМетаданных,"РегистрСведений.","")];
КонецЕсли;
СтруктураДанных = Новый Структура;
Для Каждого ТекОбъектМетаданных Из МетаданныеРегистра.Измерения Цикл
СтруктураДанных.Вставить(ТекОбъектМетаданных.Имя);
КонецЦикла;
Для Каждого ТекОбъектМетаданных Из МетаданныеРегистра.Ресурсы Цикл
СтруктураДанных.Вставить(ТекОбъектМетаданных.Имя);
КонецЦикла;
Для Каждого ТекОбъектМетаданных Из МетаданныеРегистра.Реквизиты Цикл
СтруктураДанных.Вставить(ТекОбъектМетаданных.Имя);
КонецЦикла;
Для Каждого ТекОбъектМетаданных Из МетаданныеРегистра.СтандартныеРеквизиты Цикл
СтруктураДанных.Вставить(ТекОбъектМетаданных.Имя);
КонецЦикла;
ФиксированнаяСтруктураДанных = Новый ФиксированнаяСтруктура(СтруктураДанных);
Возврат ФиксированнаяСтруктураДанных;
КонецФункции
Показать3. Дальше все пишу в массив, все ссылочные типы переделываю в json
ВыгрузкаЗагрузкаJSON = ОБработки.ВыгрузкаЗагрузкаJSON.Создать();
МассивСсылок = Новый Массив;
РегистрСведений = РегистрыСведений[СтрЗаменить(ПолноеИмяМетаданных,"РегистрСведений.","")];
НаборЗаписей = РегистрСведений.СоздатьНаборЗаписей();
МетаданныеРегистра = Метаданные.РегистрыСведений[СтрЗаменить(ПолноеИмяМетаданных,"РегистрСведений.","")];
ФиксированнаяСтруктураДанных = СоздатьСтруктуруМетаданныхРегистраСведений(ПолноеИмяМетаданных,МетаданныеРегистра);
Для Каждого ТекЗаписьРегистра Из ПакетСсылок Цикл
Попытка
СтруктураДанных = Новый Структура(ФиксированнаяСтруктураДанных);
НаборЗаписей.Очистить();
Для Каждого ТекОбъектМетаданных Из МетаданныеРегистра.Измерения Цикл
НаборЗаписей.Отбор[ТекОбъектМетаданных.Имя].Установить(ТекЗаписьРегистра[ТекОбъектМетаданных.Имя]);
КонецЦикла;
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
ЗаполнитьЗначенияСвойств(СтруктураДанных,НаборЗаписей[0]);
Для Каждого ТекЭлементСтруктуры Из СтруктураДанных Цикл
ТекТипЗнч = ТипЗнч(ТекЭлементСтруктуры.Значение);
Если ТекТипЗнч <> Тип("Строка") И
ТекТипЗнч <> Тип("Дата") И
ТекТипЗнч <> Тип("Число") И
ТекТипЗнч <> Тип("Булево") Тогда
ВыгрузкаЗагрузкаJSON.ПереносимыеОбъекты.Очистить();
НовСтрока = ВыгрузкаЗагрузкаJSON.ПереносимыеОбъекты.Добавить();
НовСтрока.СсылкаНаОбъект = ТекЭлементСтруктуры.Значение;
ВыгрузкаЗагрузкаJSON.ОбъектыВJSON();
СтруктураДанных.Вставить(ТекЭлементСтруктуры.Ключ, ВыгрузкаЗагрузкаJSON.ТекстJSON);
КонецЕсли;
КонецЦикла;
МассивСсылок.Добавить(СтруктураДанных);
КонецЕсли;
Исключение
Продолжить;
КонецПопытки;
КонецЦикла;
// для идентификации при разборе можно первым элементом вставить имя самого регистра
//МассивСсылок.Вставить(0,ПолноеИмяМетаданных);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивСсылок);
СтрокаJsonОбмен = ЗаписьJSON.Закрыть();
Возврат СтрокаJsonОбмен;
Показать{Форма.ВыборИзЗапроса.Форма(90)}: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить();
по причине:
{(7589, 60)}: Неоднозначное поле "ИнвентаризацияТоваровНаСкладе.Ссылка"
ПО ОприходованиеТоваров.ИнвентаризацияТоваровНаСкладе = <<?>>ИнвентаризацияТоваровНаСкладе.Ссылка
Если "Подробнее" это реквизит элемента справочника, то перенесется. Если что-то стороннее (подчиненный справочник, регистр), то нет.
Контактная информация должна переноситься. Возможно, отличаются виды контактной информации. Нужно еще их перенести.
Выгрузите один объект в текст и посмотрите визуально, какие поля выгрузились.

Просмотры 170237
Загрузки 2692
Комментарии 170
Создание 22.10.14 12:50
Обновление 19.10.16 10:44
№ Публикации 308563
Рубрики
Перенос данных из 1C8 в 1C8,
Универсальные обработки,
Распределенная БД (УРИБ, УРБД)
Кому Программист
Тип файла Внешняя обработка (ert,epf)
Платформа Платформа 1С v8.x (все механизмы)
Конфигурация Конфигурации 1cv8
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Раздел учета Не имеет значения
Доступ к файлу Абонемент ($m)
Код открыт Не указано
Свёртка по НДС, перенос себестоимости, фильтрация по кассам, складам и доп. реквизитам, сопоставления и многое другое
|
