Стартуем из 1С в Python
В 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)
Осталось только проверить, как это будет работать на Маке.
>Осталось только проверить, как это будет работать на Маке
>ctypes.windll.user32
>encoding=»windows-1251″
хорошо будет работать
ага, я уже заменил этот код.