Стартуем из 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)
 

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

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 2

  1. ryadovoi_zidiot:

    >Осталось только проверить, как это будет работать на Маке
    >ctypes.windll.user32
    >encoding=»windows-1251″

    хорошо будет работать

Добавить комментарий для ryadovoi_zidiot Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *