Перенос номенклатуры с помощью обработки в любую конфигурацию.
Создается 2 обработки в базе - источнике и базе - приемнике.
Идея в том, что в базе-источнике создается табличный документ, с расширением MXL (файл для табличного документа 1С), и он же на стороне базе-приемника конвертируется в таблицу Значений.
Для этого в шапке документа - создаем названия реквизитов, и добавляем строки со значениями этих реквизитов. Сохраняем в формате mxl.
Путь номенклатуры (папка, в которой лежит номенклатура) делаем вот такой процедурой.
// База-Источник Комплексная автоматизация, 1.1, старая, необновленная.
Функция ПодготовитьТабДок()
Макет = ЭтотОбъект.ПолучитьМакет("ЧекНаОтправку");
шапка=Макет.ПолучитьОбласть("Шапка");
Строчка1 =Макет.ПолучитьОбласть("Строчка1");
ТабДок = Новый ТабличныйДокумент;
ТабДок.Вывести(шапка);
Для Каждого Стр из СсылкаНаОбъект.Товары Цикл
Строчка1.Параметры.Контрагент = СсылкаНаОбъект.Контрагент.Наименование;
Строчка1.Параметры.ИНН = СсылкаНаОбъект.Контрагент.ИНН;
Строчка1.Параметры.Артикул = Стр.Номенклатура.Артикул;
Строчка1.Параметры.Номенклатура = Стр.Номенклатура.Наименование;
Строчка1.Параметры.ШК = ПолучитьШтрихКод(Стр.Номенклатура);
Строчка1.Параметры.Количество = Формат(Стр.Количество,"ЧГ=0");
Строчка1.Параметры.Цена = Формат(Стр.Цена,"ЧГ=0");
Строчка1.Параметры.Сумма = Формат(Стр.Сумма,"ЧГ=0");
Строчка1.Параметры.СтавкаНДС = Стр.СтавкаНДС;
Строчка1.Параметры.СуммаНДС = Формат(Стр.СуммаНДС,"ЧГ=0");
Строчка1.Параметры.НаименованиеПолное = Стр.Номенклатура.НаименованиеПолное;
Строчка1.Параметры.ЕдИзм = Стр.Номенклатура.ЕдиницаХраненияОстатков;
Строчка1.Параметры.Путь = СформироватьПуть(Стр.Номенклатура);
ТабДок.Вывести(Строчка1);
КонецЦикла;
ТабДок.Записать("C:\Базы_1с\перенос\ФайлПереноса.mxl",ТипФайлаТабличногоДокумента.MXL);
КонецФункции
функция СформироватьПуть(Номенклатура)
перем папка;
путь = "";
Уровень = Номенклатура.Уровень();
ТестДоб = "";
Для а=1 по Уровень Цикл
ТестДоб = ТестДоб+ ".Родитель";
Выполнить("папка = Номенклатура"+ТестДоб);
путь = ""+папка+"//##//"+путь;
КонецЦикла;
Возврат Путь;
КонецФункции
где "//##//" - Это разделитель. Он может быть любым, главное задать в обработке приемнике такой же разделитель.
В обработке - приемнике - указываем путь к файлу (у меня он вообще указан в почте, созданной специально для обмена).
Теперь - обработка - приемник:
1. Считываем файл переноса, попутно конвертируя его в таблицу значений.
// данная функция взята из открытого источника на Инфостарте, за давностью лет не помню, где лежит
Функция ЧтениеХМЛ()
Путь = "C:\Базы_1с\перенос\ФайлПереноса.mxl";
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(Путь);
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());//передаем ТЗ
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
ТЗОбщая = ПЗ.Результат.Выгрузить();
Возврат ТЗОбщая;
КонецФункции
В переборе ищем номенклатуру, а если не находим, то создаем.
2. Превращаем строчный путь в путь номенклатуры
Для каждого аСтр из ТЗОбщая Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",аСтр.Артикул);
СЧ = СЧ+1;
Если Номенклатура.Пустая() Тогда
Номенклатура = найтиСоздатьНоменклатуру(аСтр);
Если Номенклатура.Пустая() Тогда
сообщить("не найдена номенклатура с арт. "+ аСтр.Артикул+", в "+СтрЗаменить(Стр.Тема,"Обмен ",""));
Возврат Ложь;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Функция найтиСоздатьНоменклатуру(аСтр) // функция создает номенклатуру в рознице 2.2
ПутьНом = НайтиПуть(аСтр);
ном = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",аСтр.Артикул);
Если Ном.Пустая() Тогда
ном = Справочники.Номенклатура.НайтиПоНаименованию(аСтр.Номенклатура);
КонецЕсли;
Если Ном.Пустая() Тогда
Ном = Справочники.Номенклатура.СоздатьЭлемент();
Ном.Наименование = аСтр.Номенклатура;
Ном.НаименованиеПолное = аСтр.НаименованиеПолное;
Ном.ЕдиницаИзмерения = Справочники.БазовыеЕдиницыИзмерения.НайтиПоНаименованию(аСтр.ЕдИзм);
Ном.Артикул = аСтр.Артикул;
Ном.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("КАНЦТОВАРЫ");
Ном.Родитель=ПутьНом;
Ном.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
Ном.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар;
Ном.Записать();
Ном = Ном.Ссылка;
КонецЕсли;
Возврат Ном;
КонецФункции
Функция НайтиПуть(аСтр);
Разделитель = "//##//";
мПуть = аСтр.Путь;
ПредПутьДляПеремещенных = Справочники.Номенклатура.ПустаяСсылка();
ПутьНоменклатуры = ПредПутьДляПеремещенных;
сч=0;
Пока СтрНайти(мПуть,Разделитель)>0 Цикл
Сч=Сч+1;
числоСимвол = СтрНайти(мПуть,Разделитель);
Если числоСимвол>1 Тогда
названиеПути = Лев(мПуть,числоСимвол-1);
ПутьНоменклатуры = Справочники.Номенклатура.НайтиПоНаименованию(названиеПути,Истина,ПредПутьДляПеремещенных);
Если ПутьНоменклатуры.Пустая() Тогда
ПутьНоменклатуры = Справочники.Номенклатура.СоздатьГруппу();
ПутьНоменклатуры.Наименование = названиеПути;
ПутьНоменклатуры.Родитель = ПредПутьДляПеремещенных;
ПутьНоменклатуры.записать();
ПутьНоменклатуры = ПутьНоменклатуры.Ссылка;
КонецЕсли;
ПредПутьДляПеремещенных = ПутьНоменклатуры;
КонецЕсли;
мПуть = Прав(мПуть,СтрДлина(мПуть)-числоСимвол-СтрДлина(Разделитель)+1);
Если Сч=20 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ПутьНоменклатуры;
КонецФункции
Таким образом получаем номенклатуру, с идентичным путем в базе-источнике. Можно использовать как шаблон.
Конечно, эта обработка и рядом не лежала с конвертацией данных, но огромным ее плюсом является то, что при обновлении ее легко поправить, если изменится тот или иной реквизит.
Я при переносе использовал почту, т.к. часто бывает так, что базы находятся на разных компьютерах.
Код базы-источника:
Процедура ОтправитьПоПочте(Файл)
ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение;
ДвоичныеДанные = Новый ДвоичныеДанные(Файл);
ПочтовоеСообщение.Вложения.Добавить(ДвоичныеДанные, Файл);
ПочтовоеСообщение.ИмяОтправителя = "Рога и копыта";
ПочтовоеСообщение.Отправитель = "PochtaObmena@mail.ru";
ПочтовоеСообщение.Тема = "Обмен "+СсылкаНаОбъект;
КодировкаСообщения = "utf-8";
Получатель = ПочтовоеСообщение.Получатели.Добавить();
Получатель.Адрес = "PochtaObmena@mail.ru";
Получатель.ОтображаемоеИмя = "";
Получатель.Кодировка = КодировкаСообщения;
//ТекстСообщения.Текст = "";
//ТекстСообщения.ТипТекста = "";
УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.НайтиПоКоду("ЦБ0000003");
Профиль = ПолучитьИнтернетПочтовыйПрофиль(УчетнаяЗапись);
ИнтернетПочта = Новый ИнтернетПочта;
Попытка
ИнтернетПочта.Подключиться(Профиль);
Исключение
сообщить("Не удалось отправить");
Возврат;
КонецПопытки;
Попытка
ИнтернетПочта.Послать(ПочтовоеСообщение);
Исключение
сообщить("Не удалось отправить");
КонецПопытки;
КонецПроцедуры
Функция ПолучитьИнтернетПочтовыйПрофиль(УчетнаяЗапись) Экспорт
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераPOP3 = УчетнаяЗапись.POP3Сервер;
Профиль.АдресСервераSMTP = УчетнаяЗапись.SMTPСервер;
Если УчетнаяЗапись.ВремяОжиданияСервера > 0 Тогда
Профиль.ВремяОжидания = УчетнаяЗапись.ВремяОжиданияСервера;
КонецЕсли;
Профиль.Пароль = УчетнаяЗапись.Пароль;
Профиль.Пользователь = УчетнаяЗапись.Логин;
Профиль.ПортPOP3 = УчетнаяЗапись.ПортPOP3;
Профиль.ПортSMTP = УчетнаяЗапись.ПортSMTP;
Если УчетнаяЗапись.ТребуетсяSMTPАутентификация Тогда
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
Профиль.ПарольSMTP = УчетнаяЗапись.ПарольSMTP;
Профиль.ПользовательSMTP = УчетнаяЗапись.ЛогинSMTP;
Иначе
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.БезАутентификации;
Профиль.ПарольSMTP = "";
Профиль.ПользовательSMTP = "";
КонецЕсли;
СистемнаяИнформация = Новый СистемнаяИнформация;
Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.1.0") > 0 Тогда
Профиль.ИспользоватьSSLPOP3 = УчетнаяЗапись.ИспользоватьЗащищенноеСоединениеДляВходящейПочты;
Профиль.ИспользоватьSSLSMTP = УчетнаяЗапись.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты;
КонецЕсли;
Возврат Профиль;
КонецФункции
Код приема почты и удаления отработанных писем:
Функция ПолучитьПрофиль()
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.Пользователь = "PochtaObmena@mail.ru";
Профиль.АдресСервераPOP3 = "pop.mail.ru";
Профиль.Пароль = "23423846";
Профиль.АдресСервераPOP3 = "pop3.mail.ru";
ПРофиль.ПортPOP3 = 995;
Профиль.ПортSMTP = 465;
ПРофиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
Профиль.ПарольSMTP = "S4cKlvc1rQpn9CI8mBvj";
Профиль.ПользовательSMTP = "PochtaObmena@mail.ru";
Профиль.ИспользоватьSSLPOP3 = Истина;
Профиль.ИспользоватьSSLSMTP = Истина;
Возврат Профиль;
КонецФункции
Функция ПолучитьИнтернетПочтовыйПрофиль(УчетнаяЗапись) Экспорт
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераPOP3 = УчетнаяЗапись.СерверВходящейПочты;
Профиль.АдресСервераSMTP = УчетнаяЗапись.СерверИсходящейПочты;
Если УчетнаяЗапись.ВремяОжидания > 0 Тогда
Профиль.ВремяОжидания = УчетнаяЗапись.ВремяОжидания;
КонецЕсли;
Профиль.Пароль = УчетнаяЗапись.Пароль;
Профиль.Пользователь = УчетнаяЗапись.Логин;
Профиль.ПортPOP3 = УчетнаяЗапись.ПортPOP3;
Профиль.ПортSMTP = УчетнаяЗапись.ПортSMTP;
Если УчетнаяЗапись.ТребуетсяSMTPАутентификация Тогда
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
Профиль.ПарольSMTP = УчетнаяЗапись.ПарольSMTP;
Профиль.ПользовательSMTP = УчетнаяЗапись.ЛогинSMTP;
Иначе
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.БезАутентификации;
Профиль.ПарольSMTP = "";
Профиль.ПользовательSMTP = "";
КонецЕсли;
СистемнаяИнформация = Новый СистемнаяИнформация;
Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.1.0") > 0 Тогда
Профиль.ИспользоватьSSLPOP3 = УчетнаяЗапись.ИспользоватьЗащищенноеСоединениеДляВходящейПочты;
Профиль.ИспользоватьSSLSMTP = УчетнаяЗапись.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты;
КонецЕсли;
Возврат Профиль;
КонецФункции
Функция ПроверитьПочту()
Профиль = ПолучитьПрофиль();
//УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты;
//Профиль = ПолучитьИнтернетПочтовыйПрофиль(УчетнаяЗапись);
МассивПисем = Новый массив();
//ПОЛУЧЕНИЕ ПИСЕМ
Попытка
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
МассивПисем = Почта.Выбрать(Ложь);
Исключение
Сообщить("Ошибка получения почты " + ОписаниеОшибки());
КонецПопытки;
Почта.Отключиться();
Возврат МассивПисем;
КонецФункции
ПРоцедура УдалитьПисьма()
МассивПисемДляУдаления.Добавить(ИнтернетПисьмо.Идентификатор[0]);
Почта=Новый ИнтернетПочта();
Попытка
Почта.Подключиться(ПочтовыйПрофиль);
Исключение
Сообщить("Ошибка при подключении к почтовому профилю!",СтатусСообщения.ОченьВажное);
Возврат;
КонецПопытки;
Для каждого Сообщение из МассивСообщений Цикл
Попытка
Если Сообщение.ИдентификаторСообщения=Идентификатор тогда
СообщенияНаУдаление=Новый Массив;
СообщенияНаУдаление.Добавить(Сообщение);
Почта.УдалитьСообщения(СообщенияНаУдаление);
СообщенияНаУдаление.Очистить();
Прервать;
КонецЕсли;
Исключение
Сообщить("Ошибка при получении почты: "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
Отказ=Истина;
КонецПопытки;
КонецЦикла;
Почта.Отключиться();
КонецПроцедуры
Как итог - отправка и приемка обмена работает нажатием одной кнопки в базах 1С.