суббота, 2 февраля 2013 г.

Кастомизация экспорта заказов в 1С Предприятие без модификаций ядра 1С Битрикс

Продолжая тему нестандартной интеграции 1С Битрикс и 1С Предприятия, хочу рассказать о том, как я кастомизирую экспорт заказов. Это тоже довольно востребованная и распространённая задача, и, что интересно, практически всегда заказчиков не устраивает экспорт «из коробки», и они просят пусть какие-то мелочи, но переделать.

Например, недавно я столкнулась с такой задачей. Оптовые покупатели интернет-магазина (на 1С Битрикс Бизнес 11й версии ядра) обладают дополнительными свойствами: номерами договоров и датами заключения этих договоров. При оформлении заказа они выбирают один из своих договоров, на основании которого будет происходить сделка. Номер договора и его дата – должны передаваться в 1С предприятие при экспорте заказов.

Формированием xml-файла заказов, который передается в 1С Предприятие, занимается функция из ядра Битрикс ExportOrders2Xml, которая описана в файле bitrix/modules/sale/general/export.php

Конечно, соблазн исправить пару строк в ней прямо там на месте – велик. Это займет 5 минут. НО ядро битрикс станет модифицированным и каждый раз, обновляя ядро, нужно будет помнить об этой модификации и вносить ее снова. Каждый раз. А если проект перейдет на сопровождение другой студии или разработчику (как частенько бывает), и заказчик забудет о том, что ядро его проекта модифицировано, в один прекрасный день это может обернуться серьезными проблемами. Поэтому, я думаю, что лучше сразу потратить 30 минут вместо 5, но кастомизировать экспорт так, чтобы ядро не было затронуто, и чтобы об этой модификации не нужно было помнить.

Как я делаю? Я копирую компонент sale.export.1c  из папки /bitrix/components/bitrix/ в свое пространство имен /bitrix/components/bedrosova/, затем в папке компонента создаю еще 1 файлик /bitrix/components/bedrosova/sale.export.1c/functions.php

В этот файлик я копирую полное описание функции ExportOrders2Xml из файла bitrix/modules/sale/general/export.php  и незамысловато переименовываю ее в ExportOrders2Xml2 (а здесь нужно отметить, что исходная функция ExportOrders2Xml – это статический метод класса, и именно поэтому описываемый мною способ применим. Если бы этот метод не был статическим, то пришлось бы либо копировать весь класс, содержащий его, либо заводить класс – наследующий его. Наследование – это, конечно, спорный механизм, но не в сравнении с модификацией исходного класса) и затем уже в своей скопированной функции вношу все необходимые мне модификации.

После этого я подключаю файл со своей функцией
 /bitrix/components/bedrosova/sale.export.1c/functions.php
 в своем компоненте /bitrix/components/bedrosova/sale.export.1c/components.php 

Затем заменю вызов статического метода класса
CSaleExport::ExportOrders2Xml на вызов свой функции ExportOrders2Xml2

Все, остается только не забыть заменить в файле обмена вызов стандартного компонента sale.export.1c   на вызов кастомизированного.

Кастомизация экспорта заказов описанным методом не слетает даже при переходе с 11й версии ядра на 12ю, в которой стандартный экспорт организован с использованием класса CIBlockCMLExport. О его кастомизации без модификации ядра я напишу как-нибудь в другой раз.

7 комментариев:

Михаил Кварта комментирует...

Юлия здравствуйте,

Подскажите пожалуйста в чем может быть ошибка? Все сделал как вы описали, обозвал функцию по своему, скопировал в functions.php в файле 1c_exchange.php поменял на свой компонент. Но почему то такое ощущение, что данная функция не срабатывает и даже не срабатывает мой компонент в 1c_exchange.php. Подскажите в чем причина?пол дня сегодня убил на это подключение и ничего не получилось.

Юлия комментирует...

Ошибка может быть во невнимательности. Я своих стажеров, к примеру, заставляю, если не могут найти ошибку - делать все с начала - снова и снова. После пятого раза они становятся внимательными, и у них все начинает получаться.

Murad Aliev комментирует...

Замечательная статья, правда не у меня пока не получилось его реализовать, метод в файле functions.php не заработал, вроде все сделала как описано в статье, буду разбираться.
Подскажите пожалуйста такой момент, мне нужно при загрузке заказов, перед выгрузкой контрагентов так же выгрузить контактные лица контрагентов в таблицу пользователей. В какой момент происходит выгрузка контрагентов как пользователей на сайт.
Буду очень благодарен за любую помощь.

Анонимный комментирует...

а разве файл обмена не перезаписывается с обновлением?

Юлия комментирует...

Какой вы имеете в виду?

Анонимный комментирует...

в том файле где идет вызов стандартного компонента sale.export.1c

Айнур Валиев комментирует...

разве стандартные настройки в
Магазин - Настройки - Интеграция с 1С - Профили обмена
не позволяют передавать любые поля?