В 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)
Осталось только проверить, как это будет работать на Маке.