8.х пепренос справочников

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем alexcl, 8 июн 2011.

  1. TopicStarter Overlay
    alexcl
    Offline

    alexcl

    Регистрация:
    2 июн 2011
    Сообщения:
    22
    Симпатии:
    0
    Баллы:
    1
    перенес справочник номенклатуры из дбф в 1с 8.2 базовая.
    проблема в том что при переносе нет разбиения на группы. как решить эту проблему?
  2. kavak
    Offline

    kavak Опытный в 1С

    Регистрация:
    13 май 2010
    Сообщения:
    703
    Симпатии:
    0
    Баллы:
    26
    А в ДБФ файле группы номенклатуры как то выделены?
  3. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Данных "родитель" + "ЭтоГруппа" + "КодЭлемента" + "Наименование" хватит для построения иерархии из "плоского" списка.
  4. kavak
    Offline

    kavak Опытный в 1С

    Регистрация:
    13 май 2010
    Сообщения:
    703
    Симпатии:
    0
    Баллы:
    26
    nomad_irk чего то я сам не понял твой ответ=)
  5. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    1. дбф - это таблица.
    2. справочник в 1С - это таблица.
    3. обе этих таблицы - "плоские" по своей сути.
    4. иерархия строится по комбинации значений полей "родитель" + "этогруппа" + "код".
  6. kavak
    Offline

    kavak Опытный в 1С

    Регистрация:
    13 май 2010
    Сообщения:
    703
    Симпатии:
    0
    Баллы:
    26
    Это я понял=)Твой ответ не исключил мой вопрос=)
  7. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    ну как бы ТС на него может не отвечать "вслух" :)
  8. TopicStarter Overlay
    alexcl
    Offline

    alexcl

    Регистрация:
    2 июн 2011
    Сообщения:
    22
    Симпатии:
    0
    Баллы:
    1
    никак они не выделены. каждому наименованию присвоен номер группы и код.
  9. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    доработайте выгрузку в DBF, чтобы включались нужные поля(см. выше)
  10. TopicStarter Overlay
    alexcl
    Offline

    alexcl

    Регистрация:
    2 июн 2011
    Сообщения:
    22
    Симпатии:
    0
    Баллы:
    1
    с 1с я незнаком. есть обработчик по переносу справочников. вот код:

    Код:
    Перем ПредыдущееЗначениеСписка; // переменная в которую сохраняется установленное значение из списка полей ДБФ
    Перем НомерВСписке;
    
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    СпрВладелец="";
    Если НЕ ВыбранЛиСправочникВладелец() Тогда
    Возврат;
    Иначе
    Если ПустаяСтрока(ЭлементыФормы.ВыборСправочникаВладельца.Значение) Тогда
    СпрВладелец="";
    Иначе
    Попытка
    СпрВладелец = ВыбранныйВладелец;	
    Исключение 
    Предупреждение("Повторите выбор справочника владельца!");
    КонецПопытки; 
    КонецЕсли; 
    КонецЕсли;	
    Если НЕ ЗаполненыЛиСоответствия() Тогда
    Возврат;
    КонецЕсли;
    
    Если НЕ флДобавлять И ПустаяСтрока(СвязатьПо) Тогда
    Предупреждение("Не выбрана связь по элементу! Повторите выбор связать по.");
    Возврат;
    ИначеЕсли Не флДобавлять Тогда
    Если СвязатьПо="Код" И ПустаяСтрока(тпСоответствия[0]["ПолеФайлаДБФ"]) Тогда
    Предупреждение("Выберите соответствие поля из файла коду из справочника!"); 	
    Возврат;
    ИначеЕсли СвязатьПо="Наименование" И ПустаяСтрока(тпСоответствия[1]["ПолеФайлаДБФ"]) Тогда
    Предупреждение("Выберите соответствие поля из файла наименованию из справочника!"); 
    Возврат;
    КонецЕсли; 
    КонецЕсли; 
    // Начинаем перенос данных
    ДБФ = Новый XBase;
    ДБФ.ОткрытьФайл(стрИмяФайла);
    БылиОшибки = Ложь;	
    ЭлементыФормы.ИндикаторПроцесса.Видимость=Истина;
    ЭлементыФормы.СтатусПроцесса.Заголовок = "Идет загрузка данных. Ждите...";
    ЭлементыФормы.ИндикаторПроцесса.МаксимальноеЗначение = ДБФ.КоличествоЗаписей();
    ЭлементыФормы.ИндикаторПроцесса.Значение = 0;
    ЭлементыФормы.ИндикаторПроцесса.ОтображатьПроценты=Истина;
    н=0;	
    Пока НЕ ДБФ.ВКонце() Цикл
    ОбработкаПрерыванияПользователя();
    ЭлементСправочникаВыбран=Ложь;
    Если флДобавлять Тогда
    НовыйЭлемент = Справочники[ЭлементыФормы.ВыборСправочника.Значение.Имя].СоздатьЭлемент();
    Если СпрВладелец<>"" Тогда
    НовыйЭлемент.Владелец = СпрВладелец;
    КонецЕсли;
    ЭлементСправочникаВыбран=Истина;
    Иначе
    Если СвязатьПо = "Код" Тогда
    Если СокрЛП(ДБФ[тпСоответствия[0]["ПолеФайлаДБФ"]])="" Тогда 
    ЭлементСправочникаВыбран=Ложь;
    ЭлементыФормы.ИндикаторПроцесса.Значение = ЭлементыФормы.ИндикаторПроцесса.Значение + 1;
    ДБФ.Следующая();
    Продолжить;
    КонецЕсли;
    НовыйЭлемент = Справочники[ЭлементыФормы.ВыборСправочника.Значение.Имя].НайтиПоКоду(СокрЛП(ДБФ[тпСоответствия[0]["ПолеФайлаДБФ"]]),,,СпрВладелец);
    Иначе
    Если СокрЛП(ДБФ[тпСоответствия[1]["ПолеФайлаДБФ"]])="" Тогда 
    ЭлементСправочникаВыбран=Ложь;
    ЭлементыФормы.ИндикаторПроцесса.Значение = ЭлементыФормы.ИндикаторПроцесса.Значение + 1;
    ДБФ.Следующая();
    Продолжить;
    КонецЕсли;
    НовыйЭлемент = Справочники[ЭлементыФормы.ВыборСправочника.Значение.Имя].НайтиПоНаименованию(СокрЛП(ДБФ[тпСоответствия[1]["ПолеФайлаДБФ"]]),флСовпадение,,СпрВладелец);
    КонецЕсли; 
    ЭлементСправочникаВыбран=Истина;
    Если НовыйЭлемент.Пустая() Тогда
    ЭлементСправочникаВыбран=Ложь;
    ЭлементыФормы.ИндикаторПроцесса.Значение = ЭлементыФормы.ИндикаторПроцесса.Значение + 1;
    ДБФ.Следующая();
    Продолжить;
    Иначе
    НовыйЭлемент = НовыйЭлемент.ПолучитьОбъект();
    КонецЕсли;
    КонецЕсли; 
    
    Для Каждого СтрокаСоответствия из тпСоответствия Цикл
    //Если НЕ ПустаяСтрока(СтрокаСоответствия.ПолеФайлаДБФ) Тогда
    Если флДобавлять И СтрокаСоответствия.РеквизитСправочника = "Код" Тогда
    Если ЭлементыФормы.ВыборСправочника.Значение.КонтрольУникальности Тогда
    НовыйЭлемент.УстановитьНовыйКод();
    Иначе	
    НовыйЭлемент.Код = СокрЛП(ДБФ[СтрокаСоответствия.ПолеФайлаДБФ]);
    КонецЕсли;	
    Иначе	
    Если ПустаяСтрока(СтрокаСоответствия.ПолеФайлаДБФ) Тогда
    НовыйЭлемент[СтрокаСоответствия.РеквизитСправочника] = СтрокаСоответствия.ЗначенияСсылок;
    Иначе
    НовыйЭлемент[СтрокаСоответствия.РеквизитСправочника] = ДБФ[СтрокаСоответствия.ПолеФайлаДБФ];
    КонецЕсли;	
    КонецЕсли;	
    ЭлементСправочникаВыбран=Истина;
    //КонецЕсли; 	
    КонецЦикла;
    Если ЭлементСправочникаВыбран=Истина Тогда
    Попытка
    НовыйЭлемент.Записать();
    н=н+1;
    Исключение	
    Сообщить(ОписаниеОшибки()); 
    БылиОшибки=Истина;
    КонецПопытки;	
    КонецЕсли;
    ЭлементыФормы.ИндикаторПроцесса.Значение = ЭлементыФормы.ИндикаторПроцесса.Значение + 1;
    ДБФ.Следующая();
    КонецЦикла;
    ДБФ.ЗакрытьФайл();
    Если БылиОшибки Тогда
    ЭлементыФормы.СтатусПроцесса.Заголовок = "Загрузка закончилась в процессе были ошибки! Загружено "+н+" элементов.";	
    Иначе
    ЭлементыФормы.СтатусПроцесса.Заголовок = "Загрузка завершена! Загружено "+н+" элементов.";	
    КонецЕсли;	
    ЭлементыФормы.ИндикаторПроцесса.Видимость=Ложь;
    КонецПроцедуры
    
    Функция ПолучитьТипДанных(СтрокаТипа)
    Если НЕ ПустаяСтрока(СтрокаТипа) Тогда
    Если СтрокаТипа = "S" Тогда
    Возврат Тип("Строка");
    ИначеЕсли СтрокаТипа = "N" Тогда
    Возврат Тип("Число");	
    ИначеЕсли СтрокаТипа = "D" Тогда
    Возврат Тип("Дата");	
    ИначеЕсли СтрокаТипа = "L" Тогда
    Возврат Тип("Булево");		
    ИначеЕсли СтрокаТипа = "F" Тогда
    Возврат Тип("Число");		
    Иначе
    Возврат Неопределено;		
    КонецЕсли; 
    Иначе	
    Возврат Неопределено;
    КонецЕсли; 
    КонецФункции // ()
    
    Процедура пвИмяФайлаНачалоВыбора(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    диалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);	
    диалогВыбора.Фильтр = "База данных dBase (*.dbf)|*.dbf";
    диалогВыбора.Каталог = стрКаталог;
    диалогВыбора.Заголовок = "Выберите XLS файл";
    диалогВыбора.МножественныйВыбор = Ложь;
    диалогВыбора.ПроверятьСуществованиеФайла = Истина;
    Если диалогВыбора.Выбрать() Тогда
    стрИмяФайла = диалогВыбора.ПолноеИмяФайла;
    тзПоляДБФ.Очистить();
    ДБФ = Новый XBase;
    ДБФ.ОткрытьФайл(стрИмяФайла);
    Для каждого ПолеДБФ Из ДБФ.поля Цикл
    НоваяСтрока 		 = тзПоляДБФ.Добавить();
    НоваяСтрока.Название = ПолеДБФ.Имя;
    НоваяСтрока.Тип 	 = ПолучитьТипДанных(ПолеДБФ.Тип);
    НоваяСтрока.Длина 	 = ПолеДБФ.Длина;
    НоваяСтрока.Точность = ПолеДБФ.Точность;
    НоваяСтрока.Статус   = 0;
    КонецЦикла;
    ДБФ.ЗакрытьФайл();
    Иначе
    Предупреждение("Файл не выбран!"); 
    КонецЕсли;
    КонецПроцедуры
    
    Процедура кнПолучитьМетаданныеНажатие(Элемент)
    ЭлементыФормы.ВыборСправочника.СписокВыбора.Очистить();
    Для Каждого СправМетаданные из Метаданные.Справочники Цикл
    ИмяСправочника=СправМетаданные.Имя;
    ЭлементыФормы.ВыборСправочника.СписокВыбора.Добавить(СправМетаданные,Строка(СправМетаданные));
    КонецЦикла;
    КонецПроцедуры
    
    Процедура тпСоответствияПолеФайлаДБФНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
    УстановитьСтатусВыбранномуОбъекту(Элемент.Значение,0);
    Элемент.СписокВыбора = ПолучитьСписокДляВыбора(ЭлементыФормы.тпСоответствия.ТекущиеДанные.ТипДанныхРеквизита);
    УстановитьСтатусВыбранномуОбъекту(Элемент.Значение,1);
    КонецПроцедуры
    
    Процедура тпСоответствияПолеФайлаДБФОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    Элемент.Значение = ВыбранноеЗначение;
    УстановитьСтатусВыбранномуОбъекту(ВыбранноеЗначение,1);
    КонецПроцедуры
    
    Процедура УстановитьСтатусВыбранномуОбъекту(ИмяКолонки,УстанавливаемыйСтатус)
    
    Если НЕ ПустаяСтрока(ИмяКолонки) Тогда
    
    тзПоляДБФ.Найти(ИмяКолонки,"Название").Статус=УстанавливаемыйСтатус;
    
    КонецЕсли; 	
    
    КонецПроцедуры
    
    Процедура УстановитьСтатусВсемОбъектамТЗ(УстанавливаемыйСтатус)
    Для Каждого СтрокаТЗ из тзПоляДБФ Цикл
    СтрокаТЗ.Статус = УстанавливаемыйСтатус; 
    КонецЦикла;	
    КонецПроцедуры
    
    
    //Возвращаемое значение:
    //   СписокКолонок   – список значений;
    //
    Функция ПолучитьСписокДляВыбора(ТипРеквизита)
    скПоляДБФ = Новый СписокЗначений;
    скПоляДБФ.Очистить();
    Для каждого СтрокаТЗ Из тзПоляДБФ Цикл
    Если НЕ ПустаяСтрока(ТипРеквизита) Тогда
    Если Найти(ТипРеквизита,"ссылка")<=0 Тогда
    Если СтрокаТЗ.Статус<>1 И СтрокаТЗ.Тип=Тип(ТипРеквизита) Тогда
    скПоляДБФ.Добавить(СтрокаТЗ.Название);	
    КонецЕсли; 
    КонецЕсли;	
    КонецЕсли;	
    КонецЦикла; 
    Возврат скПоляДБФ;
    КонецФункции // ()
    
    Процедура ВыборСправочникаПриИзменении(Элемент)
    тпСоответствия.Очистить();
    Объект = Справочники[ЭлементыФормы.ВыборСправочника.Значение.Имя].ПолучитьСсылку();
    НоваяСтрока = тпСоответствия.Добавить();
    НоваяСтрока.РеквизитСправочника="Код";
    НоваяСтрока.ТипДанныхРеквизита =ТипЗнч(Объект.Код);
    НоваяСтрока = тпСоответствия.Добавить();
    НоваяСтрока.РеквизитСправочника="Наименование";
    НоваяСтрока.ТипДанныхРеквизита =ТипЗнч(Объект.Наименование);
    Для Каждого Реквизит из Объект.Метаданные().Реквизиты Цикл
    ИмяРеквизита=Реквизит.Имя;
    НоваяСтрока = тпСоответствия.Добавить();
    НоваяСтрока.РеквизитСправочника=ИмяРеквизита;
    НоваяСтрока.ТипДанныхРеквизита = Реквизит.Тип;
    КонецЦикла;
    ЭлементыФормы.ВыборСправочникаВладельца.СписокВыбора.Очистить();
    ЭлементыФормы.ВыборСправочникаВладельца.Значение = "";
    Для Каждого Владелец из Объект.Метаданные().Владельцы Цикл
    ЭлементыФормы.ВыборСправочникаВладельца.СписокВыбора.Добавить(Владелец,Строка(Владелец))	
    КонецЦикла;	
    ЭлементыФормы.ВыбранныйВладелец.Доступность=Ложь;
    ВыбранныйВладелец="";
    УстановитьСтатусВсемОбъектамТЗ(0);
    КонецПроцедуры
    
    Процедура тпСоответствияПередНачаломДобавления(Элемент, Отказ, Копирование)
    Отказ=Истина;
    КонецПроцедуры
    
    Функция ВыбранЛиСправочникВладелец()
    Если ЭлементыФормы.ВыборСправочникаВладельца.СписокВыбора.Количество()>0 И ПустаяСтрока(ВыборСправочникаВладельца) И ПустаяСтрока(ВыбранныйВладелец) Тогда
    Предупреждение("Выберите справочник владелец для дальнейшей загрузки!");
    Возврат Ложь;
    КонецЕсли; 
    Возврат Истина;
    КонецФункции
    
    Функция ЗаполненыЛиСоответствия()
    Для каждого СтрокаСоответствий Из тпСоответствия Цикл
    Если НЕ ПустаяСтрока(СтрокаСоответствий.ПолеФайлаДБФ) Тогда
    Возврат Истина;	
    КонецЕсли;
    КонецЦикла;
    Предупреждение("Заполните поля соответсвий для дальнейшей загрузки!");
    Возврат Ложь;
    КонецФункции // ()
    
    Процедура тпСоответствияПолеФайлаДБФОчистка(Элемент, СтандартнаяОбработка)
    УстановитьСтатусВыбранномуОбъекту(Элемент.Значение,0);
    КонецПроцедуры
    
    Процедура ВыборСправочникаВладельцаПриИзменении(Элемент)
    ВыбранныйВладелец = Справочники[Элемент.Значение.Имя].ПустаяСсылка();
    ЭлементыФормы.ВыбранныйВладелец.Доступность=Истина;
    КонецПроцедуры
    
    Процедура флДобавлятьПриИзменении(Элемент)
    Если Элемент.Значение Тогда
    ЭлементыФормы.СвязатьПо.Доступность=Ложь;
    ЭлементыФормы.флСовпадение.Доступность=Ложь;
    Иначе
    ЭлементыФормы.СвязатьПо.Доступность=Истина;
    ЭлементыФормы.флСовпадение.Доступность=Истина;
    КонецЕсли;	
    КонецПроцедуры
    
    Процедура СвязатьПоПриИзменении(Элемент)
    Если СвязатьПо="Код" Тогда
    ЭлементыФормы.флСовпадение.Видимость=Ложь;
    Иначе
    ЭлементыФормы.флСовпадение.Видимость=Истина;
    КонецЕсли; 
    КонецПроцедуры
    
    Процедура тпСоответствияЗначенияСсылокНачалоВыбора(Элемент, СтандартнаяОбработка)
    Массив = Новый Массив(); 
    Массив.Добавить(Тип(СтрЗаменить(СтрЗаменить(ЭлементыФормы.тпСоответствия.ТекущиеДанные.ТипДанныхРеквизита," ",""),":","."))); 
    НашеОписание = Новый ОписаниеТипов(Массив);
    
    Элемент.ОграничениеТипа = НашеОписание;
    Элемент = НашеОписание.ПривестиЗначение(Элемент);
    
    КонецПроцедуры
    
    
    
    тзПоляДБФ = Новый ТаблицаЗначений;
    тзПоляДБФ.Колонки.Добавить("Название"); // Наименовние колонки в файле
    тзПоляДБФ.Колонки.Добавить("Тип"); 		// Тип данных колонки в файле
    тзПоляДБФ.Колонки.Добавить("Длина"); 	// Длина колонки в файле
    тзПоляДБФ.Колонки.Добавить("Точность"); // Точность данных в колонки в файле
    тзПоляДБФ.Колонки.Добавить("Статус");   // Статус колонки 1 - выбрана, 0 - не выбрана
    
    ЭлементыФормы.СвязатьПо.СписокВыбора.Добавить("Код","По коду");
    ЭлементыФормы.СвязатьПо.СписокВыбора.Добавить("Наименование","По наименованию");
    
    если можно то поподробней так чтоб даже идиоту было понятно
  11. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    тут принципиальные изменения нужно вносить, т.к. обработка не совсем корректно обрабатывает иерархию(либо я не шибко внимательно вник в код)
  12. TopicStarter Overlay
    alexcl
    Offline

    alexcl

    Регистрация:
    2 июн 2011
    Сообщения:
    22
    Симпатии:
    0
    Баллы:
    1
    этот обработчик заполнят поля справочнека
  13. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    заполняет, но я не заметил, чтобы где-то был код по созданию группы номенклатуры

    следовательно, данной обработкой нужно переносить каждую группу номенклатуры, т.е. соблюдая иерархию вручную.
  14. TopicStarter Overlay
    alexcl
    Offline

    alexcl

    Регистрация:
    2 июн 2011
    Сообщения:
    22
    Симпатии:
    0
    Баллы:
    1
    так как мне это сделать :angry:
  15. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Боюсь, с вашим уровнем программирования, задача не выполнимая.
    Нужны хотя бы базовые навыки практического программирования в среде 1С.

    Видимо, вам нужно обратится к создателю обработки, чтобы он учел соблюдение иерархии в полном объеме.
  16. TopicStarter Overlay
    alexcl
    Offline

    alexcl

    Регистрация:
    2 июн 2011
    Сообщения:
    22
    Симпатии:
    0
    Баллы:
    1
    может кто скинет ссылкуна внешнюю обработку или саму?
  17. TopicStarter Overlay
    alexcl
    Offline

    alexcl

    Регистрация:
    2 июн 2011
    Сообщения:
    22
    Симпатии:
    0
    Баллы:
    1
    можно ли перенести в чистый справочник данные из файла если в справочнике у реквизита тип справочник ссылка или перечисление ссылка
  18. x_under
    Offline

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    Можно, но при определенной доработке.

Поделиться этой страницей