Кастомизация экспорта заказов в 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. О его кастомизации без модификации ядра я напишу как-нибудь в другой раз.

Об авторе:

Инженер-программист по образованию, web-программист по призванию, Битрикс-программист по любви и 1с-программист по стечению обстоятельств, руководитель команды web-разработчиков, внедренец 1С-Битрикс и Битрикс24, основатель одноименной студии.

bedrosova3

Подпишитесь на рассылку!

Fields marked with an * are required

Комментарии

  1. Ответить

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

  2. Ответить

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

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

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

 

Комментировать

 

Подписаться на рассылку:

Fields marked with an * are required