Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
17 Дек 2017, 01:37
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Перенос данных между одинаковыми справочниками  (Прочитано 2638 раз)

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

Оффлайн nikolay100x

  • *
  • Сообщений: 3
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-08-26
  • Сайт: 
  • Профессия: Программист 1С
Добрый день.
На днях у меня появилась задача переноса данных из одного справочника в другой. Т.е. при создании в главной базе нового товара он должен рассылаться на все филиалы с учетом структуры групп.
Задачу сделал и хочу поделиться, может кому поможет.
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

  • *
  • Сообщений: 12
  • РЕПУТАЦИЯ: 5
  • КПД: 42%
  • Регистрация: 2011-07-19
  • Сайт: 
  • Профессия: Программист 1С
Для УРБД это плохой вариант.
На выходе получите несколько одинаковых элементов справочника. Т.е. если одна ЦБ и 10 ПБ то получите 11 одинаковых элементов. Справочник будет сильно разрастаться.
Для УРБД надо так.
Создаете в ЦБ резервные элементы справочника. Выполняете обмен из ЦБ на все ПБ, чтобы там появились "резервы".  Потом вместо создания нового элемента переименовываете "Резерв" и выполняете обмен (если переименование выполняется в ЦБ). Если переименование выполняется в ПБ, то можете написать аналогичную Вашей обработку.


Теги:
 


* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
142 Сообщений
ilyay ilyay
63 Сообщений
AIFrame
50 Сообщений
alex0402
50 Сообщений
andron81_81
44 Сообщений
oleg-x
42 Сообщений
BuhRust
32 Сообщений
MuI_I_Ika MuI_I_Ika
31 Сообщений
Golickoff Golickoff
28 Сообщений
Dima Dddd Dima Dddd
24 Сообщений

* Кто онлайн

  • Точка Гостей: 141
  • Точка Скрытых: 0
  • Точка Пользователей: 1
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal