В 2022 модно уметь в Python. Я не гоняюсь за модой, но возникла задача. Клиент хотел обрабатывать XML файл, полученный из «Мой склад» — убрать стартовые нули в тегах КодТов:

Я работал с бухгалтером этого клиента по 1С, ну и клиент попросил меня написать обработку этих файлов. Только не в 1С, даже не в 1С:Деньги.

Я согласился написать скрипт и думал писать его на VBS. Но оказалось, что у клиента Mac, поэтому нужен какой-нибудь кросс-платформенный скриптовый язык. Выбор пал на Python.

Я попросил помощи на Мисте и мне помогли написать PY-скрипт.

Я установил Питон, как написано здесь.

Почитал как запускать скрипт через командную строку здесь.

Запустил Питон и ввел первый код:

Прогнал Hello World:

Ну и далее скопировал скрипт с Мисты в файл upd_xml.py.

Скрипт у меня не заработал, поэтому я запустил его в IDE:

IDE принимает только скрипты в UTF, перекодировал руками — просто скопировал из блокнота текст и вставил в IDE.

Первый код выдал первые непонятные ошибки:

Погуглил использование, нашел пример тут. Посмотрел, что вроде бы у меня тоже так. Тогда проверил XML валидатором и нашел ошибку — ведь я XML корректировал руками, чтобы убрать приватные данные клиента:

После того, как XML стал валидным, стал получать такую ошибку:

Погуглил «cannot use absolute path on element keyerror«, нашел решение проблемы, нужно было просто поставить точку в выражении для findall:

Файл сконвертировался корректно. На Мисте мне подсказали, как вызвать диалог ввода имени файла.

Написание скрипта с коллективной помощью заняло 40 минут.

Однако нужно было еще переименовать исходный файл в файл с приставкой prev_, а в исходный файл записать обработанный XML. На это ушло еще 10 минут.

Итого менее чем за час 1с-ник, который раньше никогда не работал с питоном, смог адаптировать полезный скрипт на Python. Не боги горшки обжигают.

Итоговый скрипт:

#!/usr/bin/python
 
 
import os
import sys
import xml.etree.ElementTree as ET
import ctypes  # An included library with Python install.
def Mbox(title, text, style):
    return ctypes.windll.user32.MessageBoxW(0, text, title, style)
 
from tkinter import filedialog as FD
 
filename = None
 
if len(sys.argv) > 1:
    filename = sys.argv[1]
 
if not filename:
    filename = FD.askopenfilename(filetypes=[("xml files","*.xml")])
 
if not filename:
    exit()
 
tree = ET.parse(filename)
root = tree.getroot()
 
for node in root.findall(".//ДопСведТов[@КодТов]"):
 
    code = node.attrib['КодТов']
    node.attrib['КодТов'] = code.lstrip('0') #здесь меняем код
 
 
filename = os.path.abspath(filename)
 
directory = os.path.dirname(filename)
filename = os.path.basename(filename)
 
os.rename(os.path.join(directory, filename), os.path.join(directory, "src_" + filename))
tree.write(os.path.join(directory, filename), encoding="windows-1251")
 
Mbox('Успешно', 'Обработка XML файла завершена', 1)
 

Осталось только проверить, как это будет работать на Маке.

Комментарии (55)


  1. dodgev
    17.11.2022 17:34
    +10

    О чем и к чему статья?

    P.S.

    sed -i 's/КодТов=\"00/КодТов=\"/' filename


    1. fixin Автор
      17.11.2022 19:41
      -4

      это пользователь должен набирать? ггг...
      true программисты забывают про гуй.


      1. hazg
        18.11.2022 14:54

        Уговорили.

        #!/bin/bash

        for filename in ./*.xml; do
        sed -i 's/КодТов="00/КодТов="/' {$filename}

        done
        osascript -e 'display notification "All done" with title "From GUI"'

        не проверял. макоси нет.



        1. fixin Автор
          18.11.2022 16:17

          а где тут выбор файла? опять гуем не пахнет даже.


    1. unnamsa
      20.11.2022 09:01

      вы серьезно ищите смысл в статьях fixin?


      1. fixin Автор
        20.11.2022 09:11

        вам не мешало бы научиться видеть содержание, а не форму.


  1. Jury_78
    17.11.2022 18:06

    Какая то пошаговая стратегия.


    1. fixin Автор
      17.11.2022 19:41
      +1

      Мне было интересно попробовать новый язык в практических целях


  1. Tinkz
    17.11.2022 18:35
    +2

    Здрасти, рискну предположить что вот это на маке не сработает
    def Mbox(title, text, style):
    return ctypes.windll.user32.MessageBoxW(0, text, title, style)


    1. fixin Автор
      17.11.2022 19:37
      +1

      Да, все верно, мне уже об этом доложили. Поправленные код выглядит так:

      from tkinter import messagebox as MB
      MB.showinfo('Успешно', 'Обработка XML файла завершена')


  1. Knightt
    17.11.2022 18:38
    +3

    вот, а питонисты за 1 час не смогут сделать тоже самое в 1с /s

    толи питонисты не те, толи 1с напрочь отбитый :)


    1. fixin Автор
      17.11.2022 19:40
      -2

      нет, просто 20 лет программистского стажа за плечами и БГУИР finished.


      1. SergeiMinaev
        18.11.2022 05:45
        +4

        Рискую показаться грубияном, но статья на 20 лет не тянет даже с учётом 1С :)


        1. fixin Автор
          18.11.2022 10:00
          -2

          вы иеете право на имхо. Но на мой взгляд, у вас задето самолюбие.


  1. kale
    17.11.2022 18:39
    +3

    Здравствуй дорогой дневничок..


  1. iredun
    17.11.2022 18:40

    А чем tkinter.messagebox не устроил? Не говоря уже о том зачем это все :)


    1. fixin Автор
      17.11.2022 19:41

      тем, что я про него ничего не знал. я вообще питон в первый раз в жизни вижу. Я об этом написал в статье


  1. skymal4ik
    17.11.2022 18:51
    +7

    причём здесь стартуем из 1с если вы просто парсите обыкновенный xml-файл и меняете его содержимое?

    Ну и в целом - ничего нового для ресурса уровня Хабра, к сожалению, статья не несет. А уж шаги вроде копирования текста чтобы сконвертировать текст в utf8 и вовсе неинтересны и вызывают грустную улыбку.

    Переносите на дзен, там это будет полезнее. И возвращаетесь когда будете решать действительно интересные и сложные кейсы :)


    1. fixin Автор
      17.11.2022 19:42
      +1

      я программист 1С, поэтому стартанул из 1С в Питон.

      Хотел показать, что это несложно. И программисты 1С могут легко применять скрипты на питоне вместо CMD, VBS. К тому же кроссплатформенно.


    1. Mirzapch
      18.11.2022 09:46

      Сконвертировать? Есть метод.

      Hidden text


  1. ladle
    17.11.2022 19:21

    Клиент хотел обрабатывать XML файл, полученный из «Мой склад» — убрать стартовые нули в тегах КодТов:

    Итого менее чем за час 1с-ник, который раньше никогда не работал с питоном, смог адаптировать полезный скрипт на Python. Не боги горшки обжигают.

    Да уж, не боги нули убирают ...


    1. fixin Автор
      17.11.2022 19:43
      -1

      ну не совсем сам, но адаптировать готовое смог. Код на Питоне читается легко тем, кто программировал на VB-подобном встроенном языке 1С


      1. red_dragon
        18.11.2022 10:12

        Код на питоне читается в принципе легко, даже если не программировал ни на чём. В этом одна из фишек этого ЯП.


        1. fixin Автор
          18.11.2022 11:56
          -1

          Выпускника БГУИР 1997 года сложно чем-то удивить в языке программирования. В IT кризис, ничего принципиально нового.


          1. kai3341
            20.11.2022 05:29
            +1

            Если этот уровень -- весь ваш прогресс с 1997 года -- вы впали в анабиоз?

            Мимо выпускник БГУИР. Кстати, шарага шарагой, бездарно потерянное время.

            Мало того, что технический уровень -- просто испанский стыд (для первача норм), так отдельный испанский стыд, что это всё, чего вы достигли с 1997 года


  1. Naf2000
    17.11.2022 19:41

    Разве в самой 1С нет средств обработки XML? Есть

    Разве для мака нет платформы 1С? Есть


    1. fixin Автор
      18.11.2022 09:30
      -3

      ты плохо читал статью, там написано что клиента тошнит от 1С, поэтому он и сидит на Мой склад.

      Да и из пушки по воробьям это. Один скрипт проще скопировать, чем покупать и ставить 1с:Деньги


      1. Naf2000
        18.11.2022 09:52

        Я работал с бухгалтером этого клиента по 1С

        То есть 1С у потребителя файлов все таки стоит?


        1. fixin Автор
          18.11.2022 10:22

          у бухгалтера стоит. Потребитель сидит на складе, УПД выгружает из Мой-склад напрямую. А бухню свозит раз в месяц, выгружая из Мой склад в 1С бух 3.


  1. refringerator
    17.11.2022 19:43
    +1

    sed 's/КодТов="0\+\([[:digit:]]\+\)/КодТов="\1/g' input.xml


    1. fixin Автор
      17.11.2022 19:44
      -1

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


  1. Naf2000
    17.11.2022 20:16

    А причём тут тег 1с? Впрочем к питону теже вопросы


    1. fixin Автор
      18.11.2022 08:49

      1С - потому что я рассказываю свой первый опыт в Питоне с позиции 1сника. Чтобы стало понятно, что это не так сложно, как кажется.
      Питон - потому что речь про Питон, ваш КЭП.


      1. Naf2000
        18.11.2022 09:16
        +2

        Статья не отражает никак факт того, что вы 1Сник, кроме того вашего представления публике. С таким же успехом можно было представиться сантехником

        По поводу Питона тоже тема абсолютно не раскрыта. Более того, складывается впечатление из прочитанного, что вы получили код, потом нашли необходимые правки в интернете. Всё. Вы хоть полученный код поняли, я надеюсь?


        1. fixin Автор
          18.11.2022 10:15
          -2

          ну раз не отражает, то можно уточнить в комментариях, я вот вам уточнил.
          к тому же там написано: "Я работал с бухгалтером этого клиента по 1С". Имеющий глаза да увидит.

          ну если бы я код не понял, я бы не смог его адаптировать. Логично?

          на картинках степ-бай-степ отражен процесс понимания кода.

          В БГУИР я изучил 11 языков, так что Питон не стал для меня "откровением".


          1. itrader
            20.11.2022 09:00

            Вы думаете кому-то интересен ваш процесс понимания элементарных вещей? Может достаточно было похвастаться друзьям или жене. И не писать абосолютно бесполезную статью на хабре?


            1. fixin Автор
              20.11.2022 09:05

              помогаю программистам 1с преодолевать сложную учебную курву питона. им это интересно. вы слишком о многом судите по себе.


              1. Shpirtwoman
                20.11.2022 15:20

                Опыт джуна Леонтьева покоя не даёт? В ВКшных чатах инфы полезной больше что для Питонистов, что для 1Сников, чем ваши Франкенштейны из готовых решений ваших проблем с Мисты и Хабра. Ведь и этот пост написан с одной целью — получить в комменты: "Сударь, Вы, право, бесноваты, это верно делается так-с: [решение]". Решение мы копируем, а про бесноватость просто пропускаем.


  1. Barmaglot
    17.11.2022 22:05

    А я как-то наоборот — на 1С парсер сайтов писал. ツ


    1. fixin Автор
      18.11.2022 09:52
      -1

      ну я на 1С писал даже робота для общения с телочками на мамбе, было дело

      потом IE перестал быть управляемым, ковырял немного Selenium, но уже не для мамбы, а по работе.


      1. Barmaglot
        18.11.2022 16:48

        Мне от Эксплорера только адресная строка была нужна. Всё остальное средствами 1С делалось. Полностью дерево разбирал и анализировал. И результаты сразу в 1С-ную базу заносил. В карточки товара. Попутно анализируя, "перелопачивая" описания товаров и формируя html для последующей выгрузки на другой сайт.

        Там вообще было наворочено такого, что я сейчас наверное сам не разберусь. Даже маленький ИИ, для автоматической классификации по свойствам объектов. ツ


        1. fixin Автор
          20.11.2022 11:18

          да, 1с - сила!


          1. Barmaglot
            20.11.2022 11:24

            В умелых руках. ツ

            Правда, "настоящие программисты", 1С-ников не уважают. Но это как с лириками. Они тоже читать книжки физиков не могут, а физики их книжки — запросто. Так и тут. 1С-ник и на C# напишет. А вот сишник на 1С-ке — навряд ли. ツ

            PS Если что, я вообще не программер. Но писать приходилось даже на Прологе.


        1. VVizard
          20.11.2022 13:25

          Все что вы описали phyton специалист сделает быстрее и лучше за счёт отличных библиотек по работе с xml и паркингу html. Код будет понятнее.

          У меня есть опыт написания html парсера и генератора на 1c и это по уровню где то 99й год, собираем текст из строк и шаблонов, и так же парсер, да что говорить даже регулярок нет.

          С питоном: pip install beautifulsoup, pip install requests, pip install pandas

          И у тебя удобные структуры данных для работы, и главное простой и понятный код.

          В итоге как показала практика, на долгой дистанции выгоднее сделать на питоне парсер и отдавать результаты в 1с через мни http сервер чем реализовывать и что намного более важно сопровождать и развивать парсер на 1с.

          Питон как язык можно выучить за 3 дня. Дальше уже библиотеки и ООП, и этому можно учиться всю жизнь.


          1. Barmaglot
            20.11.2022 13:50

            Современная 1С-ка прекрасно работает с DOM и его структурой. Понятное дело, что питон будет проще, но у меня не стояла цель упрощения. Зато всё крутится внутри одного сервера.

            К тому же, мне было просто интересно ツ


    1. Kvason
      20.11.2022 09:02

      Стесняюсь спросить, а зачем?)


      1. Barmaglot
        20.11.2022 10:21

        Ответ банален. Надо было. ツ

        Это была часть системы по управлению интернет-магазином. Полностью вся была написана на 1С. От автоматического "втягивания" разноформатных прайсов поставщиков с распознаванием по-разному написанных товаров, автоматического формирования цен по "кривой" (с учётом товарной группы, цен конкурентов, поставщика и его скидок и много чего ещё, около десятка параметров), до автоматического заполнения товарных карточек с формированием (по настроенному шаблону) описаний, характеристик, фотографий и прочего. Причём, всё это парсилось с нескольких разных сайтов, распознавалось и приводилось к общему виду. А потом автоматически же выгружалось на сайт ИМ.

        Вот и нужно было всё это упихать в 1С, сервер которой молотил эту лабуду круглосуточно. ツ


  1. tm1218
    17.11.2022 23:59

    Если питон рассматриваете, как кроссплатформенную среду, к чему тогда сомнения про Мак?


    1. HemulGM
      18.11.2022 08:59

      Код может быть платформозависимым (что собсна уже есть)

      def Mbox(title, text, style):
          return ctypes.windll.user32.MessageBoxW(0, text, title, style)

      Мак не оценит WinApi


      1. fixin Автор
        18.11.2022 12:13

        про это уже писали.


    1. fixin Автор
      18.11.2022 09:38

      ну лично я его кроссплатформенность не проверял. Поэтому и сомнения.


  1. Polaris99
    18.11.2022 15:17

    Рубрика "Я познаю мир" с нашим постоянным автором Фиксиным


  1. fixin Автор
    18.11.2022 15:52

    гм, на Маке скрипт работает только в IDLEесли щелкнуть и запустить в Python Launcher, просто мигает экран и все.если запускать в терминале, то иногда запускается иногда пишет Segmentation Fault 11Попробую переставить питон (там уже стоял). если не поможет, то пусть запускают в IDLE, это выше моих сил


  1. Shpirtwoman
    20.11.2022 08:59
    +1

    Ничего нового: терпилы с Мисты решают задачки первокурсника технаря по уровню, поступающие им от БГУИР финишд с 20-летним стажем. Копипастить много ума не надо, да и кода слишком мало, чтобы наговнить, но и тут Гений1С и Кулибин от IT умудрился запихать windll, работая под Мас.


    1. fixin Автор
      20.11.2022 09:00

      вы слишком мрачно всё видите.