Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 апр 2024, 07:25

Перенос данных между одинаковыми справочниками

Автор nikolay100x, 26 авг 2011, 15:35

0 Пользователей и 1 гость просматривают эту тему.

nikolay100x

Добрый день.
На днях у меня появилась задача переноса данных из одного справочника в другой. Т.е. при создании в главной базе нового товара он должен рассылаться на все филиалы с учетом структуры групп.
Задачу сделал и хочу поделиться, может кому поможет.
1. В основной базе в Справочнике Товаров добавил реквизит НовыйТовар (число), затем в модуле дописал в процедуре ПриЗаписи() в реквзит НовыйТовар прописывать число 1, ну чтобы его можно было потом отобрать.....

2. Сделал оброботку которая из Справочника выбирает "новый товар" и загоняет его в Таблицу Значений, после чего отправляю при помощи Rom-Mail.dll на нужные мне адреса. Данные отправляются в *.txt (с этим думаю проблем не будет, должно быть понятно как это сделать)

Если Спр.НовыйТовар = 1 тогда
ТЗ.НоваяСтрока();
ТЗ.Код = Спр.Код;
ТЗ.Наименование = Спр.Наименование;
ТЗ.Длина = Спр.Длина;
ТЗ.Ширина = Спр.Ширина;
ТЗ.Себестоимость = Спр.Себестоимость;
ТЗ.ЦенаПродажи = Спр.ЦенаПродажи;   
ТЗ.ПолноеНаименование = Спр.ТекущийЭлемент().ПолноеНаименование();
ТЗ.Едизм = Спр.ЕдИзм.Идентификатор();
ТЗ.Описание = Спр.Описание;
ТЗ.Группа = Спр.ТекущийЭлемент().Родитель();

КонецЕсли;


3. На филиале (база приемник) сделал обработку, которая получает данное письмо, опять же при помощи Rom-Mail.dll.
Вот собственно и код моей обработки:

Процедура НовыйТовар()
Спр = СоздатьОбъект("Справочник.СправочникМатериалов");
Спр1 = СоздатьОбъект("Справочник.СправочникМатериалов");
Попытка
ЗагрузитьВнешнююКомпоненту("ROM-Mail.dll");
Исключение
Сообщить("Не удалось загрузить ROM-Mail.dll");
Возврат;
КонецПопытки;
ВК = СоздатьОбъект("AddIn.AddInMail");
ВК.СерверПриема = "ххххххх";
ВК.ПортПриема = "110";
ВК.Логин = "ххххххх";
ВК.Пароль = "ххххх";
ВК.ОставлятьНаСервере = 0;
ВК.ПоказыватьПредупреждения = 0;

Если ВК.Подключиться("Прием")=0 Тогда
Предупреждение("Не удалось подключиться к серверу!");
Возврат;
КонецЕсли; 

Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Новый_товар");

Для Индекс=1 По ВК.КоличествоСообщений() Цикл

ВК.ПолучитьЗаголовок(Индекс);
ВК.ПолучитьСообщение(Индекс);

Каталог = КаталогИБ();
Файл = "Новый_товар.txt";

Для ф = 1 По ВК.КоличествоФайлов() Цикл           
ВК.СохранитьФайл(ф, Каталог + Файл);                     
КонецЦикла;

ТЗ_Почта = СоздатьОбъект("ТаблицаЗначений");

ЗначениеИЗФайла(Каталог + Файл, ТЗ_Почта, 0);

Если ТЗ_Почта.КоличествоСтрок()>0 тогда

Таб.ВывестиСекцию("Шапка");
Но = 1;

ТЗ_Почта.ВыбратьСтроки();

РС = РазделительСтрок;   

Т = СоздатьОбъект("ТаблицаЗначений");
Т.НоваяКолонка("Группа","Строка");
Т.НоваяКолонка("Ном","Число");

Т1 = СоздатьОбъект("ТаблицаЗначений");
Т1.НоваяКолонка("Группа","Строка");
Т1.НоваяКолонка("Ном","Число");


Пока ТЗ_Почта.ПолучитьСтроку() > 0 цикл 

Т.УдалитьСтроки();


нн = 0;

П = СтрЗаменить(ТЗ_Почта.ПолноеНаименование,"/",РС);    //меняем знак «/», который используется при ПолноеНаименование(), на РС (разделитель строк, переменная определена выше)   

///перебираем в полученной строке поле ПолноеНаименование до первого разделителя строк и полученный результат загоняем в другую Таблицу значений Т1. А полученный результат – это и есть название Группы.

Для пп = 1 по СтрЧислоВхождений(П,РС) цикл 

нн = нн + 1;

Группа = СтрПолучитьСтроку(П,нн);

Т.НоваяСтрока();
Т.Группа = Группа;
Т.Ном = нн;

КонецЦикла;           

Т.ВыбратьСтроки();
о = 0;

Пока Т.ПолучитьСтроку() = 1 цикл

Т1.НоваяСтрока();
Т1.Группа = Т.Группа;
Т1.Ном = Т.Ном;

СтароеЗначение = "";

//ищем в справочнике первую группу, если ее нет тогда создаем
Если Спр.НайтиПоНаименованию(СокрЛП(Т.Группа),0,1) = 0 тогда

Если Т.Ном = 1 тогда  //так мы определяем что это самая первая группа

Спр.НоваяГруппа();
Спр.Наименование = Т.Группа;
Спр.Записать();

ИначеЕсли Т.Ном > 1 тогда  // а вот здесь мы смотрим, если это  уже не первая группа тогда мы узнаем какой же Родитель будет для следующей группы, для этого мы из ТаблицыЗначений получаем  предыдущую группу

СтароеЗначение = Т1.ПолучитьЗначение(Число(Т.Ном - 1),"Группа");

//затем мы ее ищем в нашем справочнике, а она уже в любом случае создана
Спр.НайтиПоНаименованию(СокрЛП(СтароеЗначение),0,1);

// и используем ее в качестве Родителя для нашей следующей группы
Спр.ИспользоватьРодителя(Спр1.ТекущийЭлемент());
Спр.НоваяГруппа();
Спр.Наименование = Т.Группа;
Спр.Записать();

КонецЕсли;


КонецЕсли;


КонецЦикла;


/// Затем мы ищем по наименованию Родителя для нашего элемента, а он уже в любом случае есть, либо был, либо мы его создали выше
Спр1.НайтиПоНаименованию(СокрЛП(ТЗ_Почта.Группа),0,1);

Группа = Спр1.ТекущийЭлемент();

Спр.ИспользоватьРодителя(Группа);

Спр.Новый();

Спр.Код = ТЗ_Почта.Код;
Спр.Наименование = ТЗ_Почта.Наименование;
Спр.Длина = ТЗ_Почта.Длина;
Спр.Ширина = ТЗ_Почта.Ширина;
Спр.Описание = ТЗ_Почта.Описание;
Спр.Себестоимость = ТЗ_Почта.Себестоимость;
Спр.ЦенаПродажи = ТЗ_Почта.ЦенаПродажи;
Спр.КодТ = ТЗ_Почта.Код;
Спр.Записать();

Таб.ВывестиСекцию("СпрМат");
Но = Но + 1;
КонецЦикла; 

Таб.ПараметрыСтраницы(2);
Таб.Опции(0,0,0,0);
Таб.ТолькоПросмотр(1);

Таб.Показать("Новый товар");
КонецЕсли;

КонецЦикла;


Предупреждение("Товары добавлены....", 15);


ВК.Отключиться();

КонецПроцедуры

Может быть конечно есть способ и по проще, но я решил задачу именно так.
Если у кого есть другие варианты пишите, будит интересно узнать. 
За ранее извиняюсь если кого запутал.                           
            
            

AFZ

Для УРБД это плохой вариант.
На выходе получите несколько одинаковых элементов справочника. Т.е. если одна ЦБ и 10 ПБ то получите 11 одинаковых элементов. Справочник будет сильно разрастаться.
Для УРБД надо так.
Создаете в ЦБ резервные элементы справочника. Выполняете обмен из ЦБ на все ПБ, чтобы там появились "резервы".  Потом вместо создания нового элемента переименовываете "Резерв" и выполняете обмен (если переименование выполняется в ЦБ). Если переименование выполняется в ПБ, то можете написать аналогичную Вашей обработку.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск