Ну очень уж не хотелось писать здесь о программировании, но наболело.
Постараюсь не ругаться матом, хоть и очень хочется :)
Примерно лет 20 назад вышло так, что я лично пообщался с разработчиками тогда еще 1С:Бухгалтерии, и из этого общения я сделал для себя вывод, что все, что они могут - это сделать криво работающий большой кусок говна (я не ругаюсь матом :)). Но этот кусок вполне может быть востребован на нашем рынке, так как в то время других кусков особо и не было, а потребность в них была.
Ну а набрав поболее пользователей для подобной системы можно прочно сидеть на пятой точке в рынке, так как бухгалтера довольно консервативный народ - освоив худо-бедно один кусок говна они очень не хотят перебираться на другой кусок даже в том случае, если от него воняет несколько слабее.
Всю свою жизнь я старался держаться от этих запахов подальше, хотя приходилось сталкиваться и с криворукими «программистами 1С», и с их поделками (обработками :)).
Существует городская легенда - «1С хорошая система, но разработчики сторонних конфигураций делают ее кривой и тормозной». Это из разряда городских легенд о том, что геном свиньи ближе к геному человека, чем геном шимпанзе. Кто-то, знающий про тот же инсулин, может и поведется на это, но в действительности эта легенда ложна.
Да, 1С (Предприятие, Управление торговлей и что там еще) изначально кривая и тормозная система, написанная криворукими говнокодерами.
И доказательство тому - CommerceML.
Что это такое? Это типа «стандарт», разработанный криворукими специалистами 1С для обмена коммерческой информацией.
Вот что написано о нем на сайте 1С:
«Первая редакция стандарта CommerceML разработана специалистами фирм "1С" и "Extra.RU" при поддержке технических специалистов представительства Microsoft в России в 2000 году.»
«Вторая редакция стандарта CommerceML разработана с учетом развития отрасли информационных технологий и развития языка XML. XML-схема разработана в соответствии с рекомендациями консорциума W3C, пожеланиями по расширению предыдущей редакции стандарта в части формализации описаний электронных документов и классификации передаваемых данных.
Стандарт принят и введен в действие решением совета директоров Некоммерческого партнерства "Стандарты электронного обмена информацией" 9 декабря 2003 г.»
Сильно?
Я не нашел на сайте Microsoft упоминание об этом «стандарте», поиск сочетания слов CommerceML и Microsoft в гугле не дал ни одной отсылки из первой сотни результатов к доменам, принадлежащим Microsoft.
Ну да ладно. Может сам стандарт хорош? Ага, как бы не так. Большего куска дерьма, который не тянет даже на формат внутреннего обмена, который скрыт от посторонних глаз в виду своей кривости и постоянной изменяемости, придумать сложно. Называть такое стандартом - это нонсенс.
Но давайте разберемся, что же в нем не так.
Первое, что бросается в глаза - название. CommerceML - типа Commerce Markup Language. Назвали по английски, с претензией на международный статус.
Ну назвали бы «ГовноИксЭмЭль для обмена с 1С», я бы и не стал придираться. Это бы полностью соответствовало подходу к программированию в 1С - чисто по русски. И это бы полностью соответствовало содержимому этих ГовноИксЭмЭлев.
Ведь внутри... Внутри тихий ужас - вся схема этих документов русскоязычная.
О каком международном стандарте могла идти речь, если все теги на великом и могучем?
Вот пример открывающего тега - <КоммерческаяИнформация xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="commerceml_2.04.xsd" ВерсияСхемы="2.04" ДатаФормирования="2008-01-09T18:13:34">.
Вопрос - а почему это «стандарт» разработали не на китайском? Было бы еще прикольнее!
Для кого предназначены XML файлы? Вы представляете себе бухгалтеров, который в ручную формируют эти файлы для передачи информации контрагенту? Типа сидят, и пишут теги? Я нет!
XML в подобных системах производят и потребляют программы, которые пишут программисты.
Ну да, говнопрограммисты на 1С привыкли пейсать на великом и могучем, но я не думаю, что им прийдется что-то самим ваять на «ГовноИксЭмЭль для обмена с 1С», так как этот кусок говна производит и потребребляет эти файлы вполне самостоятельно.
С этим форматом будут вынуждены столкнуться другие программисты, которые по тем или иным причинам вынуждены писать код для обмена данными между своими системами и 1С.
И вот тут начинаются разные проблемы.
К примеру, вы пишите на Java.
По счастливой случайности на сайте 1С выложили схему этого ГовноИксЭмЭля. Сейчас там аж две версии - 2.05 и 2.06. К версиям мы еще вернемся, но давайте попробуем взять схему 2.05.
Скачиваем XSD файл схемы, кидаем его в workspace Eclipce, и натравливаем на него JAXB.
И мы благополучно получаем из этой схемы тучу классов, благо(?) Java позволяет использовать русский язык в именовании переменных.
Что бы не ходить далеко, давайте сразу попробуем собрать наш проект.
Если вы, как и я, сидите под Mac OS X, то вас ждет облом. Имея немалый опыт в подобных обломах, я сразу догадался в чем дело.
Вот строчка из файла Свойство.java:
public class Свойство {
Думаете, что все в порядке? Как бы не так!
Вот как слово Свойство выглядит в кодах Unicode в каталоге файловой системы:
\u0421\u0432\u043e\u0438\u0306\u0441\u0442\u0432\u043e
А вот то же слово в нашем файле (то же в схеме XSD):
\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e
Заметили разницу?
О да, русские Й и Ё могут быть записаны двумя способами! Как и теги, их содержащие. Есть рекомендации по нормализации (их аж 4 штуки в Unicode), и две из них предписывают писать одним образом, две другим.
Вы все еще считаете хорошей идеей использовать русский язык в наименованиях тегов и аттрибутов xml?
И что делать? Ладно, выход есть. Пишем Свойство в аннотациях через name = "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e", а для имени класса сделаем рефакториг на Своиство.
То же делаем со всеми остальными именами классов, содержащими Й и радуемся тому, что хотя бы многострадальную Ё говноспецы из 1С не догадались использовать.
Давайте попробуем покодировать, но перед этим заглянем на несколько строк ниже в том же файле:
public void setВариантыЗначений(Своиство.ВариантыЗначений value) {
Вот это засада! Да, наши сеттеры и геттеры, как мы и привыкли, начинаются с set и get. И впереди нас ждет ад с лихорадочным переключением раскладок при кодировании.
Ну да, можно пока еще не поздно, во всех созданных классах сделать глобальную замену «set» на «плюх», а get на «бульк». Но переделать при этом все ключевые слова языка и все библиотечные функции на русский у вас не выйдет, и от постоянных задалбывающих переключений раскладок вам никуда не деться, и пунтосвитчер вас не спасет.
Потерпим? И не такое терпели?
Ну ладно, потерпим. Вернемся к «стандарту».
Как я уже говорил, на сайте 1С в данный момент есть 2 схемы 2-й версии 2.05 и 2.06. 5-ю я загрузил, а вот 6-ю... Просто так не пытайтесь - не выйдет. Конечно, если ручками поправите все ошибки, то может быть и выйдет. Но без этого никак.
Как вам такое (один из примеров)...
В 538 строке определяется
А в 1509 строке
Корневой элемент. Содержит Классификатор, Каталог, ПрайсЛист и Документ.
Но, конечно, вы можете допилить это файл вручную, но оно надо? Думаете версия 2.06 вас спасет? Думаете, что «ГовноИксЭмЭль для обмена с 1С» - это «стандарт»?
Ага, щаз!
Вот выдержки из листа изменений к версии 6 (я опущу нововведения):
6. cml:ИдентфикаторГлобальныйТип исправлено на
cml:ИдентификаторГлобальныйТип
11. Изменена группа РеквизитыЮрЛица: элементу Руководитель вместо типа
Контрагент присвоен тип Руководитель
Как вам такое?
Я всегда думал, что стандарты - это то, что долго и упорно разрабатывается, и на что можно полагаться. Стандарт и реализация - разные вещи. Если вы знаете, что что-то там реализует такой-то стандарт в полной мере, то вы можете полагаться на то, что если вы делаете что-то исключительно в рамках стандарта, то у вас проблем не будет. Если стандарт реализован только в какой-то части, вы, опять же, спокойно можете использовать эту часть.
Сама реализация может содержать дополнительные плюшки, и вы можете использовать их на свой страх и риск. Но стандарт - это стандарт. У него не бывает суффиксов .06 и его при второй версии не меняют таким образом, что «17. Изменена длина атрибута ВерсияСхемы в корневом элементе КоммерческаяИнформация с 4 на 5 символов.» (это что, они собираются выпустить не 99 а 999 исправлений второй версии «стандарта»?).
По сути, если вы собрались обмениваться данными с 8-кой 1С, то вам нужно где-то раздобыть версии схемы 04, 03, 02, 01 и, возможно, 00, для каждой из них написать код, и постоянно следить за выходом новых версий (запас сделали не малый по знакам, а судя по кривости схемы для 2.06 и исправлению грамматических ошибок в наименовании тегов, разработчики «стандарта» не очень утруждают себя его тестированием перед публикацией). Ведь эти версии - это, по сути, отдельные "стандарты". Они не совместимы снизу вверх, как вы могли привыкнуть. У вас не получится просто игнорировать новые теги (и с ними какую-то новую, но пока еще ненужную вам информацию), так как в новых версиях нужная вам информация переезжает в эти новые теги.
И не надейтесь, что вы договоритесь с 1С о версии обмена, при соединении она вас спросит лишь о куке, поддержке зип, и сколько мегабайт вы готовы проглотить.
А потом вам сунет XML той версии, которую сочтет нужной ей. А вы уже крутитесь, как хотите. Ждите, что скоро к вам прийдет 7-я версия «стандарта» и JAXB плюнет вам в рот эксепшеном, получив от 1С теги, которых нет в 6-й «версии» 2-й «редакции» этого «стандарта». Возвращайтесь обратно в DOM или SAX, и пилите, Шура, пилите.
А если вы решили поработать с 7-кой 1С, то вас ждут чудеса на виражах первой версии этого «стандарта», который отличается от второй не только по структуре, но и по принципам обработки информации.
Как это все вяжется с пафосными заявлениями о том, что совместно с Microsoft, что якобы «стандарт» и прочим бла-бла-бла - я не знаю. По мне - так никак. 1С как была, так и остается самым большим куском дерьма на рынке. И будет оставаться.
Хотя в продуктах 1С есть определенный плюс для говнопрограммистов. Написав что-то, что окажется полезным для некоторого числа пользователей этого куска говна, они могут больше ничего нового не делать, а спокойно сидеть на пятой точке, получая пожизненно бабло за допиливание своей поделки под очередное обновление 1С. При этом не нужно даже заботиться о том, что бы как-то улучшить свою поделку, развить. Это другие программисты выпускают новые версии, в которых не только устранены старые ошибки (ну и добавлены новые :)), но и расширяется функционал, улучшается производительность.
Ничего этого не надо, достаточно «адаптировать» под новые «стандарты» 1С.
Но это все не по мне.
ЗЫ: Требую от 1С переименвание "стандарта" CommerceML в "Никак Не Стандартизированный ГовноИксЭмЭль для обмена с 1С", так как его нельзя даже назвать "неудачным стандартом" в виду того, что он в принципе не является стандартом, так как по сути это лишь сильно зависящий от версии (и установленных обновлений 1С) не совместимый даже со своими предыдущими версиями формат обмена данными с 1С.