В 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)
Tinkz
17.11.2022 18:35+2Здрасти, рискну предположить что вот это на маке не сработает
def Mbox(title, text, style):
return ctypes.windll.user32.MessageBoxW(0, text, title, style)fixin Автор
17.11.2022 19:37+1Да, все верно, мне уже об этом доложили. Поправленные код выглядит так:
from tkinter import messagebox as MB
MB.showinfo('Успешно', 'Обработка XML файла завершена')
Knightt
17.11.2022 18:38+3вот, а питонисты за 1 час не смогут сделать тоже самое в 1с /s
толи питонисты не те, толи 1с напрочь отбитый :)
fixin Автор
17.11.2022 19:40-2нет, просто 20 лет программистского стажа за плечами и БГУИР finished.
SergeiMinaev
18.11.2022 05:45+4Рискую показаться грубияном, но статья на 20 лет не тянет даже с учётом 1С :)
skymal4ik
17.11.2022 18:51+7причём здесь стартуем из 1с если вы просто парсите обыкновенный xml-файл и меняете его содержимое?
Ну и в целом - ничего нового для ресурса уровня Хабра, к сожалению, статья не несет. А уж шаги вроде копирования текста чтобы сконвертировать текст в utf8 и вовсе неинтересны и вызывают грустную улыбку.
Переносите на дзен, там это будет полезнее. И возвращаетесь когда будете решать действительно интересные и сложные кейсы :)
fixin Автор
17.11.2022 19:42+1я программист 1С, поэтому стартанул из 1С в Питон.
Хотел показать, что это несложно. И программисты 1С могут легко применять скрипты на питоне вместо CMD, VBS. К тому же кроссплатформенно.
ladle
17.11.2022 19:21Клиент хотел обрабатывать XML файл, полученный из «Мой склад» — убрать стартовые нули в тегах КодТов:
Итого менее чем за час 1с-ник, который раньше никогда не работал с питоном, смог адаптировать полезный скрипт на Python. Не боги горшки обжигают.
Да уж, не боги нули убирают ...
fixin Автор
17.11.2022 19:43-1ну не совсем сам, но адаптировать готовое смог. Код на Питоне читается легко тем, кто программировал на VB-подобном встроенном языке 1С
red_dragon
18.11.2022 10:12Код на питоне читается в принципе легко, даже если не программировал ни на чём. В этом одна из фишек этого ЯП.
fixin Автор
18.11.2022 11:56-1Выпускника БГУИР 1997 года сложно чем-то удивить в языке программирования. В IT кризис, ничего принципиально нового.
kai3341
20.11.2022 05:29+1Если этот уровень -- весь ваш прогресс с 1997 года -- вы впали в анабиоз?
Мимо выпускник БГУИР. Кстати, шарага шарагой, бездарно потерянное время.
Мало того, что технический уровень -- просто испанский стыд (для первача норм), так отдельный испанский стыд, что это всё, чего вы достигли с 1997 года
Naf2000
17.11.2022 19:41Разве в самой 1С нет средств обработки XML? Есть
Разве для мака нет платформы 1С? Есть
fixin Автор
18.11.2022 09:30-3ты плохо читал статью, там написано что клиента тошнит от 1С, поэтому он и сидит на Мой склад.
Да и из пушки по воробьям это. Один скрипт проще скопировать, чем покупать и ставить 1с:Деньги
refringerator
17.11.2022 19:43+1sed 's/КодТов="0\+\([[:digit:]]\+\)/КодТов="\1/g' input.xml
fixin Автор
17.11.2022 19:44-1выше отвечал товарищу, что это скрипт для использования пользователем, а не программистом.
Naf2000
17.11.2022 20:16А причём тут тег 1с? Впрочем к питону теже вопросы
fixin Автор
18.11.2022 08:491С - потому что я рассказываю свой первый опыт в Питоне с позиции 1сника. Чтобы стало понятно, что это не так сложно, как кажется.
Питон - потому что речь про Питон, ваш КЭП.Naf2000
18.11.2022 09:16+2Статья не отражает никак факт того, что вы 1Сник, кроме того вашего представления публике. С таким же успехом можно было представиться сантехником
По поводу Питона тоже тема абсолютно не раскрыта. Более того, складывается впечатление из прочитанного, что вы получили код, потом нашли необходимые правки в интернете. Всё. Вы хоть полученный код поняли, я надеюсь?
fixin Автор
18.11.2022 10:15-2ну раз не отражает, то можно уточнить в комментариях, я вот вам уточнил.
к тому же там написано: "Я работал с бухгалтером этого клиента по 1С". Имеющий глаза да увидит.ну если бы я код не понял, я бы не смог его адаптировать. Логично?
на картинках степ-бай-степ отражен процесс понимания кода.
В БГУИР я изучил 11 языков, так что Питон не стал для меня "откровением".
itrader
20.11.2022 09:00Вы думаете кому-то интересен ваш процесс понимания элементарных вещей? Может достаточно было похвастаться друзьям или жене. И не писать абосолютно бесполезную статью на хабре?
fixin Автор
20.11.2022 09:05помогаю программистам 1с преодолевать сложную учебную курву питона. им это интересно. вы слишком о многом судите по себе.
Shpirtwoman
20.11.2022 15:20Опыт джуна Леонтьева покоя не даёт? В ВКшных чатах инфы полезной больше что для Питонистов, что для 1Сников, чем ваши Франкенштейны из готовых решений ваших проблем с Мисты и Хабра. Ведь и этот пост написан с одной целью — получить в комменты: "Сударь, Вы, право, бесноваты, это верно делается так-с: [решение]". Решение мы копируем, а про бесноватость просто пропускаем.
Barmaglot
17.11.2022 22:05А я как-то наоборот — на 1С парсер сайтов писал. ツ
fixin Автор
18.11.2022 09:52-1ну я на 1С писал даже робота для общения с телочками на мамбе, было дело
потом IE перестал быть управляемым, ковырял немного Selenium, но уже не для мамбы, а по работе.
Barmaglot
18.11.2022 16:48Мне от Эксплорера только адресная строка была нужна. Всё остальное средствами 1С делалось. Полностью дерево разбирал и анализировал. И результаты сразу в 1С-ную базу заносил. В карточки товара. Попутно анализируя, "перелопачивая" описания товаров и формируя html для последующей выгрузки на другой сайт.
Там вообще было наворочено такого, что я сейчас наверное сам не разберусь. Даже маленький ИИ, для автоматической классификации по свойствам объектов. ツ
fixin Автор
20.11.2022 11:18да, 1с - сила!
Barmaglot
20.11.2022 11:24В умелых руках. ツ
Правда, "настоящие программисты", 1С-ников не уважают. Но это как с лириками. Они тоже читать книжки физиков не могут, а физики их книжки — запросто. Так и тут. 1С-ник и на C# напишет. А вот сишник на 1С-ке — навряд ли. ツ
PS Если что, я вообще не программер. Но писать приходилось даже на Прологе.
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 дня. Дальше уже библиотеки и ООП, и этому можно учиться всю жизнь.
Barmaglot
20.11.2022 13:50Современная 1С-ка прекрасно работает с DOM и его структурой. Понятное дело, что питон будет проще, но у меня не стояла цель упрощения. Зато всё крутится внутри одного сервера.
К тому же, мне было просто интересно ツ
Kvason
20.11.2022 09:02Стесняюсь спросить, а зачем?)
Barmaglot
20.11.2022 10:21Ответ банален. Надо было. ツ
Это была часть системы по управлению интернет-магазином. Полностью вся была написана на 1С. От автоматического "втягивания" разноформатных прайсов поставщиков с распознаванием по-разному написанных товаров, автоматического формирования цен по "кривой" (с учётом товарной группы, цен конкурентов, поставщика и его скидок и много чего ещё, около десятка параметров), до автоматического заполнения товарных карточек с формированием (по настроенному шаблону) описаний, характеристик, фотографий и прочего. Причём, всё это парсилось с нескольких разных сайтов, распознавалось и приводилось к общему виду. А потом автоматически же выгружалось на сайт ИМ.
Вот и нужно было всё это упихать в 1С, сервер которой молотил эту лабуду круглосуточно. ツ
tm1218
17.11.2022 23:59Если питон рассматриваете, как кроссплатформенную среду, к чему тогда сомнения про Мак?
fixin Автор
18.11.2022 15:52гм, на Маке скрипт работает только в IDLEесли щелкнуть и запустить в Python Launcher, просто мигает экран и все.если запускать в терминале, то иногда запускается иногда пишет Segmentation Fault 11Попробую переставить питон (там уже стоял). если не поможет, то пусть запускают в IDLE, это выше моих сил
Shpirtwoman
20.11.2022 08:59+1Ничего нового: терпилы с Мисты решают задачки первокурсника технаря по уровню, поступающие им от БГУИР финишд с 20-летним стажем. Копипастить много ума не надо, да и кода слишком мало, чтобы наговнить, но и тут Гений1С и Кулибин от IT умудрился запихать windll, работая под Мас.
dodgev
О чем и к чему статья?
P.S.
fixin Автор
это пользователь должен набирать? ггг...
true программисты забывают про гуй.
hazg
Уговорили.
#!/bin/bash
for filename in ./*.xml; do
sed -i 's/КодТов="00/КодТов="/' {$filename}
done
osascript -e 'display notification "All done" with title "From GUI"'
не проверял. макоси нет.
fixin Автор
а где тут выбор файла? опять гуем не пахнет даже.
unnamsa
вы серьезно ищите смысл в статьях fixin?
fixin Автор
вам не мешало бы научиться видеть содержание, а не форму.