В 2022 модно уметь в Python. Я не гоняюсь за модой, но возникла задача. Клиент хотел обрабатывать XML файл, полученный из «Мой склад» — убрать стартовые нули в тегах КодТов:
![](https://habrastorage.org/getpro/habr/upload_files/e54/205/393/e542053935e054c4c8a75249d72e57bb.png)
Я работал с бухгалтером этого клиента по 1С, ну и клиент попросил меня написать обработку этих файлов. Только не в 1С, даже не в 1С:Деньги.
Я согласился написать скрипт и думал писать его на VBS. Но оказалось, что у клиента Mac, поэтому нужен какой-нибудь кросс-платформенный скриптовый язык. Выбор пал на Python.
Я попросил помощи на Мисте и мне помогли написать PY-скрипт.
Я установил Питон, как написано здесь.
Почитал как запускать скрипт через командную строку здесь.
Запустил Питон и ввел первый код:
![](https://habrastorage.org/getpro/habr/upload_files/a67/774/bbb/a67774bbbfa0aed3f307b75e66e47917.png)
Прогнал Hello World:
![](https://habrastorage.org/getpro/habr/upload_files/e56/6d9/57c/e566d957c20ec1925d3841ca155be615.png)
![](https://habrastorage.org/getpro/habr/upload_files/f68/c37/042/f68c37042774781e5e677210502eb1ca.png)
Ну и далее скопировал скрипт с Мисты в файл upd_xml.py.
Скрипт у меня не заработал, поэтому я запустил его в IDE:
![](https://habrastorage.org/getpro/habr/upload_files/49e/921/b5c/49e921b5c9c4e45a5a78d63a6dd9f7f3.png)
IDE принимает только скрипты в UTF, перекодировал руками — просто скопировал из блокнота текст и вставил в IDE.
Первый код выдал первые непонятные ошибки:
![](https://habrastorage.org/getpro/habr/upload_files/208/43a/e4e/20843ae4e01677b6fe08526e93d1878c.png)
![](https://habrastorage.org/getpro/habr/upload_files/def/b16/cab/defb16cabdb34db0e75d3f74936b4562.png)
Погуглил использование, нашел пример тут. Посмотрел, что вроде бы у меня тоже так. Тогда проверил XML валидатором и нашел ошибку — ведь я XML корректировал руками, чтобы убрать приватные данные клиента:
![](https://habrastorage.org/getpro/habr/upload_files/4a9/78a/71e/4a978a71e9592bec5842b2a8d5319b49.png)
После того, как XML стал валидным, стал получать такую ошибку:
![](https://habrastorage.org/getpro/habr/upload_files/0bd/f7a/d9a/0bdf7ad9a7cf92d1616c743c9a8dbb9f.png)
Погуглил «cannot use absolute path on element keyerror«, нашел решение проблемы, нужно было просто поставить точку в выражении для findall:
![](https://habrastorage.org/getpro/habr/upload_files/113/37f/627/11337f6272987c45a2f89d00eca893f1.png)
Файл сконвертировался корректно. На Мисте мне подсказали, как вызвать диалог ввода имени файла.
Написание скрипта с коллективной помощью заняло 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)
Осталось только проверить, как это будет работать на Маке.
![](https://habrastorage.org/getpro/habr/upload_files/65c/11f/037/65c11f037162cd99e12c15d64748e571.png)