8.х Как можно решить такую задачку в 1С 8.2 ?

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

  1. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте!


    Есть два файла Пример.xls и пример.xml. Необходимо прочитать файл в формате XLS и сформировать ФАЙЛ в XML. Как это можно реализовать в 1с 8.2 ?

    Вложения:

    • Primer.zip
      Размер файла:
      8 КБ
      Просмотров:
      8
  2. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    прочитать из Excel через COMОбъект и записать через ЗаписьXML

    с чем конкретно проблема?
  3. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    Разобрался, один вопрос остался.

    Разобрался, есть код где ST я вручную прописываю строчку которую необх-мо, но почему то она вся с адресом email не заполняется [​IMG]. (файл приложен). Как можно это исправить ?

    // Создать колонки табличного документа
    ТаблицаДокумента.Колонки.Добавить("Номер",ОписаниеТиповС,"Номер",5);
    ТаблицаДокумента.Колонки.Добавить("CN",ОписаниеТиповС,"Рег.№",15);
    ТаблицаДокумента.Колонки.Добавить("Title",ОписаниеТиповС,"Должность",10);
    ТаблицаДокумента.Колонки.Добавить("O",ОписаниеТиповС,"Организация",70);
    ТаблицаДокумента.Колонки.Добавить("StreetAddress",ОписаниеТиповС,"Улица",25);
    ТаблицаДокумента.Колонки.Добавить("ST",ОписаниеТиповС,"Город",50);
    ТаблицаДокумента.Колонки.Добавить("INN",ОписаниеТиповС,"ИНН",14);
    ТаблицаДокумента.Колонки.Добавить("SN",ОписаниеТиповС,"Фамилия",15);
    ТаблицаДокумента.Колонки.Добавить("OGRN",ОписаниеТиповС,"ОГРН",14);


    // Последовательное чтение строк с выбранного листа
    Для Строка = 1 По ExcelПоследняяСтрока Цикл

    // Обработка нажатия Ctrl + Break
    ОбработкаПрерыванияПользователя();

    // Добавить данные в табличную часть экранной формы
    Стр=ТаблицаДокумента.Добавить();
    Стр.Номер = Строка;
    Попытка
    Стр.CN = ExcelЛист.Cells(Строка, 1).Value;
    Стр.Title = ExcelЛист.Cells(Строка, 2).Value;
    Стр.O = ExcelЛист.Cells(Строка, 3).Value;
    Стр.StreetAddress = ExcelЛист.Cells(Строка, 4).Value;
    Стр.ST = "ST=10 Москва, L=Москва, C=RU, Email=ivanov@mail.ru";
    Стр.INN = ExcelЛист.Cells(Строка, 5).Value;
    Стр.SN = ExcelЛист.Cells(Строка, 6).Value;
    Стр.OGRN = ExcelЛист.Cells(Строка, 7).Value;

    Вложения:

    • email.jpg
      email.jpg
      Размер файла:
      98,9 КБ
      Просмотров:
      6
  4. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    ОписаниеТиповС как определено? там длины строки не хватает явно, уберите длину из инициализации
  5. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    Убрал, тоже самое
    ТаблицаДокумента.Колонки.Добавить("ST",ОписаниеТиповС,"Город");
  6. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    Всё спасибо вопрос закрыт.
  7. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    Чтобы не создавать новую тему пример записи произвольной Табл.значений в XML есть у кого нибудь пример ?
  8. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    например так (структура таблицы ваша, структура xml просто показать разные варианты):
    Код:
    Процедура ЗаписатьТаблицу(ТЗ, ИмяФайла)
    
    Запись = Новый ЗаписьXML;
    Запись.ОткрытьФайл(ИмяФайла, "UTF-8");
    
    Запись.ЗаписатьОбъявлениеXML();
    
    Запись.ЗаписатьНачалоЭлемента("КорневойЭлемент");
    
    Для Каждого СтрокаТаблицы Из ТЗ Цикл
    Запись.ЗаписатьНачалоЭлемента("СтрокаТаблицы");
    Запись.ЗаписатьАтрибут("Номер", СтрокаТаблицы.Номер);
    
    Запись.ЗаписатьНачалоЭлемента("Title");
    Запись.ЗаписатьТекст(СтрокаТаблицы.Title);
    Запись.ЗаписатьКонецЭлемента();
    
    Запись.ЗаписатьНачалоЭлемента("INN");
    Запись.ЗаписатьТекст(СтрокаТаблицы.INN);
    Запись.ЗаписатьКонецЭлемента();
    Запись.ЗаписатьКонецЭлемента();
    КонецЦикла;
    
    Запись.ЗаписатьКонецЭлемента();
    
    Запись.Закрыть();
    
    КонецПроцедуры
  9. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    Спасибо большое.
  10. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    А еще вопрос по ТЗ.
    Как можно организовать выгрузку из ТЗ несколько файлов (1 строка 1 организация 1 файл сформированный.XML) ?
  11. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    если в xml - так же. файл внутри цикла никто не запрещает делать.

    ну и ситнакисис-помощник на предмет методов таблицы значений почитайте. особенно Свернуть, НайтиСтроки
  12. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    Можете небольшой пример кинуть ?
  13. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    ок, будем выгружать различные ИНН в разные файлы

    Код:
    Процедура ЗаписатьТаблицу(ТЗ, Путь)
    // сначала делаем таблицу с различными ИНН
    ТаблицаИНН = ТЗ.Скопировать();
    ТаблицаИНН.Свернуть("INN"); //после этого у нас в таблице останется одна колонка INN будут все различные ИНН по одному разу
    
    // теперь обойдем все ИНН и выгрузим в отдельный файл для каждого ИНН строки основной таблицы
    Для Каждого СтрокаИНН Из ТаблицаИНН Цикл
    Запись = Новый ЗаписьXML;
    Запись.ОткрытьФайл(Путь+СтрокаИНН.INN+".xml", "UTF-8");
    Запись.ЗаписатьОбъявлениеXML();
    Запись.ЗаписатьНачалоЭлемента("КорневойЭлемент");
    
    // теперь отберем из основной таблицы строки, содержащие текущий ИНН
    // для этого делаем структуту, в которой будут поля, имеющие те же имена, что и колонки, по которым будем отбирать
    // и значения этих полей - те значения, которые мы будем отбирать. то есть это будет наш фильтр
    СтруктураОтбора = Новый Структура;
    СтруктураОтбора.Вставить("INN", СтрокаИНН.INN);
    
    // получаем массив со строками основной таблицы, соответствующими нашему отбору
    СтрокиТаблицы = ТЗ.НайтиСтроки(СтруктураОтбора);
    
    // и выгружаем их
    Для Каждого СтрокаТаблицы Из СтрокиТаблицы Цикл
    
    Запись.ЗаписатьНачалоЭлемента("СтрокаТаблицы");
    Запись.ЗаписатьАтрибут("Номер", СтрокаТаблицы.Номер);
    
    Запись.ЗаписатьНачалоЭлемента("Title");
    Запись.ЗаписатьТекст(СтрокаТаблицы.Title);
    Запись.ЗаписатьКонецЭлемента();
    
    Запись.ЗаписатьНачалоЭлемента("INN");
    Запись.ЗаписатьТекст(СтрокаТаблицы.INN);
    Запись.ЗаписатьКонецЭлемента();
    
    Запись.ЗаписатьКонецЭлемента();
    
    КонецЦикла;
    
    Запись.ЗаписатьКонецЭлемента();
    Запись.Закрыть();
    
    КонецЦикла;
    
    КонецПроцедуры
    
  14. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    Выдает ошибку :
    {Отчет.ИмпортДанныхXLS.Форма.Форма.Форма(4,37)}: Переменная не определена (Путь)
    ЗаписатьТаблицу(ТаблицаДокумента, <<?>>Путь)
  15. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    ну так переменную то вы не определили. можно не переменную передавать, просто строку с путем на диске куда файлы писать
  16. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    Ясно. Поле CN идет с цифрами 1234567776. А как можно при выгрузке (поле CN) получить с дефисом цифры например:
    123-456-7776 ?
  17. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    При выводе получается с кавычки данные и как выводить без кавычек "" цифры 123-456-7776
  18. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    чтобы разбить CN используйте функции Лев, Сред и Прав
    Лев(CN, 3)+"-"+Сред(CN,4,3)+"-"+Прав(CN,4)

    CN выводите в элемент или в атрибут? если в атрибут - никак, это каноническая форма в xml, если в элемент - показывайте код
  19. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    Собственно что хочу получить в Primer.zip (Пример.XML - окончательный вариант).
    САМ КОД:

    Процедура ЗаписатьТаблицу(ТаблицаДокумента)

    // сначала делаем таблицу с различными ИНН
    ТаблицаИНН = ТаблицаДокумента.Скопировать();
    ТаблицаИНН.Свернуть("INN"); //после этого у нас в таблице останется одна колонка INN будут все различные ИНН по одному разу

    // теперь обойдем все ИНН и выгрузим в отдельный файл для каждого ИНН строки основной таблицы
    Для Каждого СтрокаИНН Из ТаблицаИНН Цикл
    Запись = Новый ЗаписьXML;
    Запись.ОткрытьФайл("C:\Cert\"+СтрокаИНН.INN+".xml", "windows-1251");
    Запись.ЗаписатьОбъявлениеXML();
    Запись.ЗаписатьНачалоЭлемента("pkiUser");

    // теперь отберем из основной таблицы строки, содержащие текущий ИНН
    // для этого делаем структуту, в которой будут поля, имеющие те же имена, что и колонки, по которым будем отбирать
    // и значения этих полей - те значения, которые мы будем отбирать. то есть это будет наш фильтр
    СтруктураОтбора = Новый Структура;
    СтруктураОтбора.Вставить("INN", СтрокаИНН.INN);

    // получаем массив со строками основной таблицы, соответствующими нашему отбору
    СтрокиТаблицы = ТаблицаДокумента.НайтиСтроки(СтруктураОтбора);

    // и выгружаем их
    Для Каждого СтрокаТаблицы Из СтрокиТаблицы Цикл

    Запись.ЗаписатьНачалоЭлемента("subject");
    Запись.ЗаписатьАтрибут("CN", СтрокаТаблицы.CN);

    Запись.ЗаписатьАтрибут("title", СтрокаТаблицы.Title);
    Запись.ЗаписатьКонецЭлемента();

    КонецЦикла;

    Запись.ЗаписатьКонецЭлемента();
    Запись.Закрыть();

    КонецЦикла;

    КонецПроцедуры
  20. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    получается, но очень медленно :(

    <?xml version="1.0" encoding="windows-1251"?>
    <pkiUser>
    <subject CN="01 456 000 052" title="РУКОВОДИТЕЛЬ"/>
    </pkiUser>

    Как в коде (представленной выше) после subject добавить ">" и РУКОВОДИТЕЛЬ добавить запятую ?

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