Для использования обработки выбрать пункт меню Файл - Открыть, выбрать скачанную обработку. В открывшемся интерфейсе указать параметры подключения к базе ERP и группу доступа номенклатуры, которую необходимо перенести. По кнопке "Выполнить обмен" будут перенесены все позиции номенклатуры с указанной группой доступа.
Тестирование проводилось на ERP 2.4.6 и ДО 2.1.7
При обмене синхронизация происходит по внутреннему уникальному идентификатору (Guid), что исключает дублирование. Программа рекурсивно выполняет обход каждой позиции номенклатуры и ее иерархии (по папкам). Сначала переносятся папки верхнего уровня, затем вложенные, и т.д. пока не будет достигнут последний уровень вложенности (сам элемент номенклатуры).
&НаКлиенте
Процедура ВыполнитьОбмен(Команда)
ВыполнитьОбменНаСервере();
КонецПроцедуры
&НаСервере
Функция ИнициализироватьСоединение()
ПараметрыПодключения = Новый Структура;
ПараметрыПодключения.Вставить("ВариантРаботыИнформационнойБазы", ВариантРаботыИнформационнойБазы);
ПараметрыПодключения.Вставить("КаталогИнформационнойБазы", КаталогИнформационнойБазы);
ПараметрыПодключения.Вставить("ИмяСервера1СПредприятия", ИмяСервера1СПредприятия);
ПараметрыПодключения.Вставить("ИмяИнформационнойБазыНаСервере1СПредприятия", ИмяИнформационнойБазыНаСервере1СПредприятия);
ПараметрыПодключения.Вставить("АутентификацияОперационнойСистемы", Ложь);
ПараметрыПодключения.Вставить("ИмяПользователя", ИмяПользователя);
ПараметрыПодключения.Вставить("ПарольПользователя", ПарольПользователя);
Возврат ОбщегоНазначенияКлиентСервер.УстановитьВнешнееСоединение(ПараметрыПодключения);
КонецФункции
&НаСервере
Процедура ВыполнитьОбменНаСервере()
Соединение = ИнициализироватьСоединение();
Запрос = Соединение.NewObject("Запрос");
Запрос.УстановитьПараметр("ГруппаДоступа", Соединение.Справочники.ГруппыДоступаНоменклатуры.НайтиПоНаименованию(ГруппаДоступаНоменклатуры));
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ГруппаДоступа = &ГруппаДоступа";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Если Не ЗначениеЗаполнено(Выборка.Ссылка.ВидНоменклатуры.Description) Тогда
Продолжить;
КонецЕсли;
Если Не ЗначениеЗаполнено(Выборка.Ref.Description) Тогда
Продолжить;
КонецЕсли;
Если Не ЗначениеЗаполнено(Выборка.Ref.ЕдиницаИзмерения.Description) Тогда
Продолжить;
КонецЕсли;
ПолучитьРодителя(Выборка.Ref, Соединение);
КонецЦикла;
Соединение = Неопределено;
КонецПроцедуры
&НаСервере
Функция ПолучитьРодителя(ОбъектНом, соединение);
Если ОбъектНом.Ref.Parent.Description ="" Тогда
НовыйОбъект = НайтиОбъектПоГУИДилиСоздать(Соединение, ОбъектНом);
НовыйОбъект.Записать();
Возврат ОбъектНом.Ref.Description;
КонецЕсли;
ПолучитьРодителя(ОбъектНом.Ref.Parent, соединение); //рекурсия
НовыйОбъект = НайтиОбъектПоГУИДилиСоздать(Соединение, ОбъектНом);
НовыйОбъект.Родитель = НайтиОбъектПоГУИДилиСоздать(Соединение, ОбъектНом.Ref.Parent).Ссылка;
НовыйОбъект.Записать();
ЗаписьЖурналаРегистрации("Обработка загрузки номенклатуры из ERP",
УровеньЖурналаРегистрации.Информация,
Метаданные.Справочники.Номенклатура,
НовыйОбъект.Ссылка);
КонецФункции
&НаСервере
Функция НайтиОбъектПоГУИДилиСоздать(Соединение, ОбъектНом)
УИД = Новый УникальныйИдентификатор(Соединение.xmlстрока(ОбъектНом.Uuid()));
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);
Если ОбщегоНазначения.СсылкаСуществует(Ссылка) Тогда
НовыйОбъект = Ссылка.ПолучитьОбъект(); //папка существует
Иначе
Если ОбъектНом.IsFolder = Истина Тогда
НовыйОбъект = Справочники.Номенклатура.СоздатьГруппу();
Иначе
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
КонецЕсли;
НовыйОбъект.УстановитьСсылкуНового(Ссылка); //создаем папку с гуидом
КонецЕсли;
НовыйОбъект.Код = ОбъектНом.Ref.Code;
НовыйОбъект.Наименование = ОбъектНом.Ref.Description;
НовыйОбъект.ПометкаУдаления = ОбъектНом.Ref.DeletionMark;
Если ОбъектНом.IsFolder = Ложь Тогда
НовыйОбъект.Артикул = ОбъектНом.Ref.Артикул;
КонецЕсли;
Возврат НовыйОбъект;
КонецФункции
&НаКлиенте
Процедура ВариантРаботыИнформационнойБазыПриИзменении(Элемент)
НастройкаВидимости();
КонецПроцедуры
&НаКлиенте
Процедура НастройкаВидимости()
Если ВариантРаботыИнформационнойБазы = 0 Тогда
//Файловый
Элементы.ГруппаКаталогИнформационнойБазы.Видимость = Истина;
Элементы.ГруппаКлиентСервернаяБаза.Видимость = Ложь;
Иначе
//Серверный
Элементы.ГруппаКаталогИнформационнойБазы.Видимость = Ложь;
Элементы.ГруппаКлиентСервернаяБаза.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
НастройкаВидимости();
КонецПроцедуры
&НаКлиенте
Процедура ГруппаДоступаНоменклатурыНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
ГруппаДоступаНоменклатурыНачалоВыбораНаСервере();
КонецПроцедуры
&НаСервере
Процедура ГруппаДоступаНоменклатурыНачалоВыбораНаСервере()
Элементы.ГруппаДоступаНоменклатуры.СписокВыбора.Очистить();
Соединение = ИнициализироватьСоединение();
Запрос = Соединение.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ
| ГруппыДоступаНоменклатуры.Ссылка КАК Ссылка
|ИЗ
| Справочник.ГруппыДоступаНоменклатуры КАК ГруппыДоступаНоменклатуры
|ГДЕ
| НЕ ГруппыДоступаНоменклатуры.ПометкаУдаления";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Строка = Элементы.ГруппаДоступаНоменклатуры.СписокВыбора.Добавить();
Строка.Значение = Выборка.Ссылка.Description;
КонецЦикла;
Соединение = Неопределено;
КонецПроцедуры
&НаКлиенте
Процедура ГруппаДоступаНоменклатурыНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ГруппаДоступаНоменклатурыНачалоВыбораНаСервере();
КонецПроцедуры