Создание номенклатуры 1С
Всем привет! Столкнулся с проблемой создания номенклатуры в 1С, используя OData и Python. Вот мой код:
import requests
from requests.auth import HTTPBasicAuth
import xml.etree.ElementTree as ET
post_url = 'http://localhost/mc/odata/standard.odata/Catalog_%D0%9D%D0%BE%D0%BC%D0%B5%D0%BD%D0%BA%D0%BB%D0%B0%D1%82%D1%83%D1%80%D0%B0'
data_to_post = {
"Description": "Товар на продажу",
"Code": "1234554321"
}
ns = {
'atom': 'http://www.w3.org/2005/Atom',
'm': 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata',
'd': 'http://schemas.microsoft.com/ado/2007/08/dataservices'
}
root = ET.Element(ET.QName(ns['atom'], 'entry'))
content = ET.SubElement(root, ET.QName(ns['atom'], 'content'), type="application/xml")
properties = ET.SubElement(content, ET.QName(ns['m'], 'properties'))
for key, value in data_to_post.items():
prop = ET.SubElement(properties, ET.QName(ns['d'], key))
prop.text = value
xml_data = ET.tostring(root, encoding="utf-8", method="xml")
headers = {'Content-Type': 'application/xml'}
response = requests.post(post_url, auth=HTTPBasicAuth(username='odata.user', password=''), data=xml_data, headers=headers)
if response.status_code == 201:
print("Data successfully posted.")
print("Response:", response.text)
else:
print(f"Failed to post data: {response.status_code}")
print("Response content:", response.text)
В итоге выдает такую ошибку
Failed to post data: 500
Response content: <m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<m:code>-1</m:code>
<m:message>Ошибка при выполнении обработчика - 'ПередЗаписью'</m:message>
</m:error>
Сколько не гуглил, так и не нашел людей, которые сталкивались с этим. Подскажите пожалуйста как эту проблему решить, может добавить какой-либо параметр или проще использовать уже готовую библиотеку
Ответы (1 шт):
Разобрался, проблема была просто в правах пользователя, стандартный пользователь odata.user, которого предлагает создать система, умеет только читать данные. Для изменения нужно либо наделить правами этого (не пробовал), либо работать из под другого, который может делать те же самые действия в системе. В пользователях создал нового, название обязательно на английском, иначе система будет ругаться
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-5: ordinal not in range(256)
И под именем этого пользователя делаю запрос