8.х ОБМЕН Из txt в базу данных

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем )Vano(, 15 июл 2009.

  1. TopicStarter Overlay
    )Vano(
    Offline

    )Vano(

    Регистрация:
    15 июл 2009
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте.
    Мне необходимо написать обработку текстового документа с целью занесения его в базу данных в иерархический справочник. Вот часть этого документа:
    РАЗДЕЛ C ДОБЫЧА ПОЛЕЗНЫХ ИСКОПАЕМЫХ

    Подраздел CA ДОБЫЧА ТОПЛИВНО - ЭНЕРГЕТИЧЕСКИХ ПОЛЕЗНЫХ ИСКОПАЕМЫХ

    10 Добыча каменного угля, бурого угля и торфа

    10.1 Добыча, обогащение и агломерация каменного угля
    10.10 Добыча, обогащение и агломерация каменного угля
    10.10.1 Добыча каменного угля
    10.10.11 Добыча каменного угля открытым способом
    10.10.12 Добыча каменного угля подземным способом
    10.10.2 Обогащение и агломерация каменного угля
    10.10.21 Обогащение каменного угля
    10.10.22 Агломерация каменного угля
    10.2 Добыча, обогащение и агломерация бурого угля
    10.20 Добыча, обогащение и агломерация бурого угля
    10.20.1 Добыча бурого угля (лигнита)
    10.20.11 Добыча бурого угля открытым способом
    10.20.12 Добыча бурого угля подземным способом
    10.20.2 Обогащение и агломерация бурого угля
    10.20.21 Обогащение бурого угля
    10.20.22 Агломерация бурого угля
    10.3 Добыча и агломерация торфа
    10.30 Добыча и агломерация торфа
    10.30.1 Добыча торфа
    10.30.2 Агломерация торфа

    11 Добыча сырой нефти и природного газа; предоставление
    услуг в этих областях

    11.1 Добыча сырой нефти и природного газа
    11.10 Добыча сырой нефти и природного газа
    11.10.1 Добыча сырой нефти и нефтяного (попутного) газа;
    извлечение фракций из нефтяного (попутного) газа
    11.10.11 Добыча сырой нефти и нефтяного (попутного) газа
    11.10.12 Разделение и извлечение фракций из нефтяного (попутного)
    газа
    Я знаю как текстовый документ загнать в базу а вот в иерархический справочник дело обстоит сложнее тут мне кажется должны понадобиться двумерные массивы.
    Заранее спасибо
  2. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Ориентируйся на точки и числа в их пределах. задача простая.

    Если определяешь наличие числа справа, тогда это элемент подчиненный элементу с кодом до точки и минимальным значением после это точки.

    Это так, навскидку сильно не размышляя.
  3. TopicStarter Overlay
    )Vano(
    Offline

    )Vano(

    Регистрация:
    15 июл 2009
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    Я просто новичек в 1С, ток учусь и мало знаю как это делается. Можно пожалуйста описать поподробнее как сделать и какие операторы использовать.
  4. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    А коды от наименований ты уже отделил?
  5. TopicStarter Overlay
    )Vano(
    Offline

    )Vano(

    Регистрация:
    15 июл 2009
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    Я уже получаю строку разбиваю на реквизиты, записываю справочник,т.е весь документ могу перегнать в справочник но только прочтой. А определение какой группе какой элемент принадлежит не получается.
  6. tirk
    Offline

    tirk Опытный в 1С

    Регистрация:
    1 сен 2008
    Сообщения:
    1.142
    Симпатии:
    0
    Баллы:
    26
    Наверное самое простое сравнивать по длине код...текущего с ниже стоящим.. записывать в базу этот код и потом по нему искать когда у тебя будет другая группа вхождения..

    подумай может тебе будет проще записать сначала все папки первого уровня.. руководствуясь проверкой....
    но опять же у тебя может в папке подуровня просто лежать номенклатура и рядом папка.. какой код у них тогда...
    тут нет четкого разграничения что папка что товар...((
  7. TopicStarter Overlay
    )Vano(
    Offline

    )Vano(

    Регистрация:
    15 июл 2009
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    Я знаю как по уровням распределить, но не знаю как это реализовать в программе.
    У меня как бы получился вот такой алгоритм:
    1)Считываем строку, разбираем на элементы(текущее)
    2)Если пустая, то пункт 1
    3)Если код пустой, то дописываем название в конец предыдущего
    3.1)Иначе
    3.1.1)Определяем предидущий группа или элемент(!)
    3.1.2)Записываем пред. элемент/группу, если группа то повышаем уровень, записываем ссылку в массив
    3.1.3)Если раздел, то уровень = 0. Конец
    3.1.4)Если подраздел, то уровень = 1. Родителя дляэлемента берем из пред. уровня. Конец
    3.1.5) Сохраняем текущее как предыдущее.

    (!)
    1)Если код пред. элемента является подстрокой(Найти (ТекКод,ПредКод) т.е = 1) кода те элемента, или код пред. элемента начинается с буквы, то пред. элемент - группа - записываем, увеличиваем уровень, сохраняем ссылку в массив. Конец
    2)Иначе пред. элемент - элемент - записываем.
    3)Ищем родителя тек. элемента
    3.0)Тек. родитель - пустой
    3.1)Если код ссылки из массива на тек. уровне является подстрокой тек. кода( = 1), или начинается с буквы, то эта ссылка является родителем тек. элемента. Конец
    3.2)Иначе уменьшаем уровень, пока не равен( - 1).
    Вот как то так.
  8. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Код:
        Для каждого Стр Из Словарь Цикл
    Если Найти(Стр.Код, ".")=0 Тогда
    //Элемент первого уровня
    Об = Справочники[ИмяСправочника].СоздатьЭлемент();
    Об.Код = Стр.Код;
    Об.Наименование = Стр.Наименование;
    Об.Записать();
    Иначе
    //разбираем
    Если СтрДлина(СокрЛП(Стр.Код)) < 6 Тогда //элемент второго уровня
    Об = Справочники[ИмяСправочника].СоздатьЭлемент();
    Об.Код = Стр.Код;
    Об.Наименование = Стр.Наименование;
    Если Не (Справочники[ИмяСправочника].НайтиПоКоду(Лев(Стр.Код,2)).Пустая()) Тогда
    Об.Родитель = Справочники[ИмяСправочника].НайтиПоКоду(Лев(Стр.Код,2));
    Иначе
    Прервать;
    КонецЕсли;
    Об.Записать();
    ИначеЕсли СтрДлина(СокрЛП(Стр.Код)) < 9 Тогда //элемент третьего уровня// чем дальше, тем на тройку больше..
    Об = Справочники[ИмяСправочника].СоздатьЭлемент();
    Об.Код = Стр.Код;
    Об.Наименование = Стр.Наименование;
    Если Не (Справочники[ИмяСправочника].НайтиПоКоду(Лев(Стр.Код,5)).Пустая()) Тогда
    Об.Родитель = Справочники[ИмяСправочника].НайтиПоКоду(Лев(Стр.Код,5));
    Иначе
    Прервать;
    КонецЕсли;
    Об.Записать();
    КонецЕсли;
    КонецЕсли;        
    КонецЦикла;
    
    
    Словарь - это ТЗ, в которой 3 колонки. номер строки(дефолтовая колонка, тебе не нужна), код и наименование. выглядит так:
    при этом справочник должен представлять собой иерархию элементов.
  9. TopicStarter Overlay
    )Vano(
    Offline

    )Vano(

    Регистрация:
    15 июл 2009
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    При выполнении вылазит ошибка:

    Значение не является значением объектного типа (Код)
    Если Найти (Стр.Код, ".") = 0 Тогда

    Вроде все правильно и в справочнике такой реквизит есть.

    Что делать, или может реквизит заменить на другой?
  10. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Стр - это строка таблицы значений, в которую я загружал твой файл. Справочник здесь вообще не причем. Ты в тз колонку добавил такую?
  11. TopicStarter Overlay
    )Vano(
    Offline

    )Vano(

    Регистрация:
    15 июл 2009
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    Т.е сначала загрузить текстовый документ в ТЗ а потом уже оттуда разбирать, а не из текстового документа сразу.
  12. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Я так реализовал.

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