• Архив

    «   Сентябрь 2018   »
    Пн Вт Ср Чт Пт Сб Вс
              1 2
    3 4 5 6 7 8 9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29 30
                 

Не упусти выгоду! С 1го по 31е августа можно приобрести лицензии 1С-Битрикс и тарифы технической поддержки со скидкой!

d3cc25fddfd05fd28446fc9f0523b332.jpg

В период с 1-31 августа 2016г компания 1С-Битрикс проводит распродажу лицензий со скидками от 10 до 30%.

Мы  решили поддержать акцию  скидками на свои тарифы технической поддержки корпоративного портала Битрикс24.

eb6bb7bc4d99f25a579d1bd895bcb5e5.png

Какие проблемы клиентов мы решаем в рамках технической поддержки? Вот примеры:

9347d393091c1a39e21bee12ae831547.png

История настройки одной телефонии в Битрикс24 (коробка)

Обратился к нам недавно один клиент и говорит: "Купили Битрикс24 почти год назад, и с тех пор никто не может настроить нам телефонию". Я подумала, что стоит разобраться с проблемой этого клиента - телефонию мы до этого в коробочной версии Битрикс24 настраивали неоднократно, и я думала, что меня вряд ли можно чем-то удивить по части ее настройки. Однако впереди нас ждали увлекательные открытия.

Зайдя в портал клиента на страницу Телефония - Балланс и статистика, я увидела 2 арендованных номера внутренней Битриксовской телефонии, но ни страница детализации звонков, ни страницы настроек этих телефонных номеров - не открывались. Я предположила, что модуль телефонии поврежден либо на уровне файлов, либо на уровне БД. Мониторинг качества показывал, что файлы модуля телефонии не были модифицированны. А вот в БД отсутствовала таблица b_voximplant_config. Я восстановила таблицы модуля телефонии из одного из старых бекапов портала клиента, к-е, к счастью, снимались у клиента автоматически.

Страницы детализации звонков и настройки телефонных номеров стали открываться, и в статистике даже были кое-какие записи звонков, из которых я заключила, что телефония у клиента уже была настроена, но потом почему-то отвалилась. Однако ни на входишие звонки, ни на исходящие - телефония не работала, а серверный тест Битрикс показывал кучу ошибок, относящихся к работе бизнес-функций портала, модуля Push and Pull

Мы перенесли клиента на Сервера без забот хостинга Русоникс, а так же настроили для портала клиента SSL сертификат и работу по протоколу https, после этого серверный тест Битрикс перестал выявлять проблемы, а исходящие и входящие звонки через телефонию Битрикс стали осуществляться нормально. Я сказала клиентам, что они могут тестировать телефонию, и я видела по журналу в детализации звонков, что они активно ею пользуются.

Однако ИТ отдел клиента начал жаловаться мне, что они "не знают тех людей, чьи записи звонков прослушивают в детализации". Сначала я подумала, что они просто не знают всех сотрудников своей компании, но когда начала сама прослушивать записи звонков в портале, я поняла, что в портал моего клиента сохраняются записи каких-то совершенно "левых" звонков (там в записях сотрудники почти всегда называли название другой компании, представляясь).

Я написала об этой проблеме в ТП Битрикс. Битриксоиды начали прорабатывать проблему по своим каналам, и выяснилось, что предыдущий подрядчик клиента (то ли самый первый, то ли промежуточный - клиент их сменил несколько) как-то умудрился по ошибке ввести лицензионный ключ от портала моего клиента в портале другого клиента, и после этого аккаунты телефоний этих двух клиентов "склеились", и нам падали записи звонков тех других клиентов, а они, в свою очередь, могли слушать у себя в портале записи наших тестовых звонков.

Битриксоиды заменили моему клиенту лицензионный ключ - но это не решило проблему - сами по себе аккаунты телефонии не расклеились. Я продолжала писать сообщения об этом в поддержку Битрикса, и в итоге они сменили моему клиенту и номер аккаунта на стороне информационного посредника voximplant, но, правда, все настройки модуля телефонии пришлось удалить и отвязать арендованные телефоны, ну и деньги на аккаунте клиента сгорели, конечно, но это уже были мелочи в масштабе всех проблем.

Арендовали клиенту новый номер в телефонии Битрикс24 - и на нем все работало как надо. Чужие телефонные звонки мы больше не слушали.

Эпопея на этом не закончилась. У клиента был еще арендован старый телефонный номер у Плюсофона https://plusofon.ru/, и, естественно, клиент не хотел терять этот номер, а хотел привязать его в Битрикс24 через SIP. Поддержка Плюсофона сообщила нам, что их телефоны еще ни разу не удалось подключить к Битрикс24, но я подумала, что SIP - он и в Африке SIP, и решила, что он заработает, если хорошо захотеть и проявить терпение и методичность, общаясь с обеими техподдержками.

Для начала я запросила логины/пароли SIP аккаунтов у Плюсофона, и не стала сразу пробовать подключить их в Битрикс24, а скачала себе на телефон популярный SIP клиент Зойпер, чтобы изолированно проверить, работает ли у них SIP вообще. Подключиться не удавалось. Расследование показало, что те логины/пароли SIP к-е видели админы моего клиента в личном кабинете Плюсофона - были неправильными. Плюсофоновцы уже пофиксили эту проблему.

Далее я ввела логин/пароль одного из SIP пользователей в подключение на стороне Битрикс24. Исходящий звонок не проходил - пользователь SIP светился в сети Плюсофона как оффлайн. Пообщавшись немного с техподдержкой Плюсофона, я натолкнула их на мысль, что у них на серверах IP-адреса, с которых проходит сигнал от Битрикс - в черных списках. Действительно, на Плюсофоне к SIP было разрешено подключаться только с Российских IP-адресов, а так как звонок из Битрикс идет через информационного посредника  voximplant, сигнал приходил на Плюсофон с IP-адресов, относящихся к территории США. Плюсофоновцы разрешили коннекты с этих адресов, и исходящие звонки через SIP стали проходить из портала клиента.

На этом история не закончилась. Я заметила, делая звонки через SIP из портала клиента, что запись звонков не происходит, хотя стоит соответствующая галка, а тестовые минуты для тестирования SIP не списываются (жаль, не провела исследование, сколько так реально можно бесплатно звонить). Написала снова в ТП Битрикс, они сказали мне включить на стороне сервера директиву proxy_ignore_client_abort on; - это решило проблему.

Далее я начала тестировать SIP на входящие звонки в портал. Звонки то проходили, то не проходили. По логам Плюсофона теперь уже сервера voximplant отклоняли их коннекты (не каждый раз). Долго я посылала эти логи в поддержку Битрикса. Они долго отказывались признавать эту проблему, потом я уже не выдержала и написала Рыжикову (спасибо ему, что вник). После этого Битриксоиды что-то подкрутили на стороне voximplant, и звонки через SIP, наконец то, стали проходить стабильно.

В следующем посте, я расскажу, как мы интегрировали с порталом Битрикс24 клиента программную АТС на базе Астриск.

Битрикс24 в локальной сети клиента - что делать, если не приходят письма с портала?

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

Итак, что же делать, если письма из портала Битрикс24, расположенного в локальной сети предприятия не приходят адресату (порой даже не попадают в папку Спам)?

1) Нужно произвести диагностику. Для этого можно воспользоваться специальным сервисом, к примеру: https://www.mail-tester.com Смысл сервиса в том, что вам дается специальный емейл, на который нужно отправить письмо для диагностики. Отправляешь письмо - сервис пишет список проблем, которые не дают данному письму быть доставленным адресатом.

2) Большинство проблем, которые показывает сервис диагностики связаны с неправильной настройкой ДНС домена. Если почта хостится на гугле или на яндексе, или на мейле - эти почтовые службы обычно пишут, какие ДНС должны быть прописаны для домена, чтобы письма корректно отправлялись.

Например:

То есть, необходимо проверить, что в доменной зоне того домена, который привязан к порталу Битрикс24 правильно прописаны MX, SPF и TXT записи с подписью.

3) Если Битрикс24 расположен в локальной сети предприятия, для корректной отправки почты с него необходимо так же позвонить провайдеру (интернет-провайдеру, который предоставляет предприятию статичный IP адрес) и попросить его прописать "обратную зону" для данного IP адреса и привязанного к нему домену.

4) Ну и конечно, нужно убедиться, что правильно настроен Postfix. По этому вопросу естьподробная инструкция в учебных курсах по Битрикс.

Расширенная детализация звонков в Битрикс24

Недавно мы внедряли Битрикс24 в компании, которая оказывает своим клиентам техническую поддержку по телефону, используя телефонию Битрикс24. Для этой компании мы решили интересную задачу - формирование расширенной детализации телефонных звонков, произведенных через портал.

Стандартная станица детализации телефонных звонков в Битрикс24 довольно бедна и не предполагает возможности сорировки и поиска по различным полям данных.

Этот недостаток мы исправили в своем кастомном решении для статистики и детализации телефонных звонков в Битрикс 24.

Были реализованы следующие возможности:

1) Фильтр (поиск) таблицы телефонных звонков по различным параметрам: поиск по номеру телефона, фильтр по дате звонка, позволяющий выбрать любой период времени, фильтр по типу и статусу звонка, по наличии записи телефонного разговора, по сотруднику, принявшему вызов, а так же по компании/контакту, от которых поступил данный телефонный звонок:


2) Сортировка как отфильтрованной, так и неотфильтрованной выборки звонков по любой из колонок детализации:


3) Возможность создать контакт в CRM Битрикс24 с данным телефонным номером прямо из контекстного меню в детализации звонков:


4) Возможность сгруппировать детализацию звонков по компании (контакту) и отсортировать детализацию в режиме группировки. Это позволяет, к примеру, наглядно видеть, от какого клиента поступает больше всего звонков, что очень важно, если клиентам оказывается телефонная техническая поддержка:



Сгруппированную выборку так же возможно фильтровать по любому из вышеперечисленных полей.

Статусы продуктов (товаров/услуг) в составе сделки Битрикс24

В очередной раз реализовали наш старый кейс>> со статусами товаров для новых клиентов.
Был немного улучшен интерфейс установки статуса товара.



Как и прежде, на событие перехода товара/услуги в конкретный статус в составе сделки в Битрикс24 можно повесить запуск отдельного бизнес-процесса.

Кейс достаточно востребован - планируем обернуть его под Маркетплейс, хотя вряд ли будем публиковать решение в общем каталоге, потому что его внедрение каждый раз требует учета специфики работы конкретной организации - клиента.

Бизнес-процессы в Битрикс 24: сложности внедрения

Казалось бы, дизайнер бизнес-процессов в Битрикс 24 - мощнейший механизм, позволяющий автоматизировать все, что угодно. Никакого программирования - вытаскивай кубики-активити - и любой воркфлоу спроектирован за 2 часа.

Однако же потребности реальных пользователей, их ожидания, порой серьезно расходятся с реализованными в Битрикс 24 возможностями, и процесс внедрения Битрикс 24 либо превращается, как в том анекдоте про экскурсовода - в обучение пользователей обходиться без того, что они считают естественным, либо растягивается на месяцы работы.

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

Дано: трехэтапное утверждение больничного листа:

Сначала Больничный лист утверждает начальник отдела Business Manager, потом ответственный из отдела кадров HR, а уже потом ответственный за начисление заработной платы Payroll.

Какие сложности могут возникнуть при проектировании такого простого бизнес-процесса?

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

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

Естественно, для этого переменная, хранящая пользователей-тестеров, должна быть добавлена во все необходимые активити.

Сложность №2: когда пользователь должен что-то проаппрувить, у него появляется соответсвующее задание в бизнес-процессах (не путать с задачами). Клиенты хотят, чтобы пользователь получал емейл в тот момент, когда от него ожидается одобрение, емейл, содержащий ссылку не на весь раздел с заданиями БП, а на конкретную страничку задания.

Для решения этой проблемы шаблон БП для входа в состояние "Approve from HR" из нашего примера превращается вот в такую громоздкую конструкцию:

Прикол в том, что пока в активити аппрува не произошел этот самый аппрув, стандартными средствами БП мы не можем узнать ИД таска, поэтому его приходится доставать, используя php-код:

CModule::IncludeModule("bizproc");
$arSelectFields = array("ID", "WORKFLOW_ID", "ACTIVITY", "ACTIVITY_NAME", "MODIFIED", "OVERDUE_DATE", "NAME", "DESCRIPTION", "PARAMETERS", "STATUS","USER_STATUS");
$dbRecordsList = CBPTaskService::GetList(
  array("ID" => "DESC"),
  array('WORKFLOW_ID'=>'{=Workflow:ID}'),
  false,
  false,
  $arSelectFields
 );
$arRecord = $dbRecordsList->getNext();
$rootActivity = $this->GetRootActivity();
$rootActivity->SetVariable("TaskLink", 'http://адреспортала/company/personal/bizproc/'.$arRecord['ID'].'/'); 

Этот код выбирает все таски данного БП, в порядке от последнего, к первому, нам как раз нужен последний.

Сложность №3: электронного прогона по всем инстанциям недостаточно компании, где исторически использовался бумажный документооборот, и на этапе, когда больничный лист из примера попадает к Payroll (к бухгалтеру), бухгалтер должен помимо всего прочего иметь возможность распечатать себе бумажку "для отчетности". Поэтому наш бизнес-процесс должен еще формировать PDF-файл и сохранять ее в соответствующем разделе библиотеки документов.
Сформировать PDF файл для данного примера можно следующей php-вставкой (спасибо, что в Битрикс 24 есть класс CSalePdf для работы с PDF):
CModule::IncludeModule("sale");
use Bitrix\Main\Type\DateTime;
$date = new DateTime('{=Document:DATE_CREATE}');
$date=$date->format("d-m-Y");
if (!CSalePdf::isPdfAvailable()) die();
$ID={=Document:ID};
$IBLOCK_ID={=Document:IBLOCK_ID};
$PROPS=array();
$db_props = CIBlockElement::GetProperty($IBLOCK_ID, $ID);
while($ar_props = $db_props->Fetch())
{
$PROPS[$ar_props['ID']]=$ar_props;
}
$pdf = new CSalePdf('P', 'pt', 'A4');
$pageWidth  = $pdf->GetPageWidth();
$pageHeight = $pdf->GetPageHeight();
$pdf->AddFont('Font', '', 'pt_sans-regular.ttf', true);
$pdf->AddFont('Font', 'B', 'pt_sans-bold.ttf', true);
$fontFamily = 'Font';
$fontSize   = 10.5;
$margin = array(
 'top' => 15 * 72/25.4,
 'right' => 15 * 72/25.4,
 'bottom' => 15 * 72/25.4,
 'left' => 15 * 72/25.4
);
$width = $pageWidth - $margin['left'] - $margin['right'];
$pdf->SetDisplayMode(100, 'continuous');
$pdf->SetMargins($margin['left'], $margin['top'], $margin['right']);
$pdf->SetAutoPageBreak(true, $margin['bottom']);
$pdf->AddPage();
$pdf->SetFont($fontFamily, 'B', $fontSize*2);
$pdf->Cell(0, 30, $pdf->prepareToPdf('{=Document:NAME}`s personal leave '.$date), 0, 0, 'C');
$pdf->Ln();
$pdf->Ln();
$pdf->Ln();
$pdf->Ln();
$pdf->SetFont($fontFamily, '', $fontSize);
$pdf->Cell(0, 15, $pdf->prepareToPdf('Request content:'), 0, 0, 'L');
$pdf->Ln();
$pdf->Ln();
 $ROW1=150;
$Y=15;
$pdf->Cell($ROW1, $Y, $pdf->prepareToPdf('Employee Name:'), 0, 0, 'L');
$pdf->MultiCell(0, $Y, $pdf->prepareToPdf('{=Document:NAME}'), 0, 'L');
$pdf->Cell($ROW1, $Y, $pdf->prepareToPdf('First day of leave:'), 0, 0, 'L');
$pdf->MultiCell(0, $Y, $pdf->prepareToPdf('{=Document:PROPERTY_225}'), 0, 'L');
$pdf->Cell($ROW1, $Y, $pdf->prepareToPdf('Last day of leave:'), 0, 0, 'L');
$pdf->MultiCell(0, $Y, $pdf->prepareToPdf('{=Document:PROPERTY_226}'), 0, 'L');
$pdf->Cell($ROW1, $Y, $pdf->prepareToPdf('Type of leave:'), 0, 0, 'L');
$pdf->MultiCell(0, $Y, $pdf->prepareToPdf('{=Document:PROPERTY_227}'), 0, 'L');

$myfile='temp.pdf';
$pdf->Output($myfile, 'F');
if (!copy($myfile,$_SERVER['DOCUMENT_ROOT'].'/docs/appforms/forms/personal_leave_requests/request_'.$ID.'.pdf'))
{  }else{  unlink($myfile);  } 
Можно ли реализовать бизнес-процесс обработки больничного листа в облачной версии Битрикс24? Можно, но ущербно - отказавшись от перечисленных в пунктах 2 и 3 примочек, возможных, только в коробочной версии.

Битрикс 24 - опыт расширения функционала модуля "Техподдержка"

В сентябре у нас было несколько интересных внедрений коробочной версии Битрикс24. Об одном из них расскажу в данном посте. Клиент хотел расширить функционал модуля технической поддержки.

В стандартном модуле Битрикс24 нормативное время ответа на обращение в техподдержку зависит только от уровня поддержки (SLA). Критичность обращения и категория обращения не влияют на формирование крайнего срока реакции на обращение.

Нужно было сделать, чтобы подсчет времени для ответа на обращение вычислялся исходя из:

• уровня поддержки
• критичности обращения
• категории обращения

Кроме того, в стандартном функционале «1С-Битрикс24: Корпоративный портал» сущности «Обращения в техподдержку» и «Задачи» никак не связаны. Необходимо было в интерфейсе обработки обращения техподдержки (в административной части) добавить кнопку «Создать задачу», при нажатии на которую должна была автоматически создаваться задача на проведение работ на основании данного обращения с возможностью включения данной задачи в отчеты и возможностью учета времени по данной задаче.

Так как весь оставшийся функционал модуля технической поддержки должен был работать так же, как и раньше, а так же должна была оставаться возможность обновлять модуль и получать с обновлениями новый функционал модуля, кастомизировать поведение модуля было решено через перехват событий:

OnAfterTicketAdd - это событие возникает при добавлении нового обращения в ТП;
OnAfterTicketUpdate - это событие возникает при изменении обращения (в том числе при добавлении сообщения в обращение);

Апи модуля технической поддержки Битрикс 24 не отличается подробной документацией, поэтому исследовать то, как работает стандартный модуль ТП, вычисляя дедлайн для ответа на обращение было достаточно сложно. Анализируя то, как хранится обращение в БД модуля, я заметила, что дедлайн по обращению, к счастью, нигде не вычисляется динамически, а хранится в одной таблице с информацией о самом обращении и пересчитывается при апдейте обращения. Именно этот факт и позволили использовать обработчики событий OnAfterTicketAdd и OnAfterTicketUpdate для решения первой части задачи.

Для хранения расширенной таблицы настроек модуля технической поддержки мы завели в Битрикс 24 отдельный хайлоадблок, хранящий соответствия сочетания уровня/критичности/категории и времени реакции на обращение.




Благодаря тому, что в админке Битрикс24 реализован механизм фильтрации хайлоадблока по значениям полей, пользоваться данной настроечной таблицей - достаточно удобно.

Далее встал вопрос о том, как сделать, чтобы настройки времени реакции в составе настроек уровня техподдержки игнорировались. Оказалось - достаточно просто создавать в стандартном функционале уровни поддержки без ограничения времени реакции на обращение. Время реакции мы потом задаем кастомным механизмом, при этом если для обращения задан дедлайн - уведомления о том, что пора отвечать - отрабатывают как надо.

Соответсвенно, задача свелась к тому, чтобы в вышеуказанных обработчиках получать из хайлоадблока нормативное время на основании данных о критичности/уровне/категории по данным обращения, затем вычислять новый дедлайн ответа на обращение с учетом расписания работы технической поддержки, а затем записывать найденный дедлайн в обращение.

Не обошлось без небольших курьезов: оказалось, что в обработчик события OnAfterTicketAdd не передаются данные SLA_ID для обращения, при том, что на самом деле в этот момент обращение уже записано и SLA_ID - известен - пришлось доставать его дополнительно.

Со второй частью задачи не возникло особых проблем - мы кастомизировали в папке local админские страницы редактирования обращения в техподдержку и списка обращений в техподдержку и добавили функционал создания задачи на основании обращения:

Можно создать задачи сразу для нескольких обращений, а можно только для одного.

Задачи содержат ссылку на обращение непосредственно в своем описании:


Реализация данного кейса заняла около 20 человеко-часов, и это один из тех кейсов, который невозможен в облачной версии Битрикс24. Покупая коробочную версию Битрикс 24 - клиенты получают и более широкий функционал и возможность серьезно сэкономить на дальнейшем расширении функционала.  

Если несколько узлов обмена 1С УТ импортируют товары в Битрикс одновременно

Когда-то давно я уже писала пост http://dev.1c-bitrix.ru/community/web...blog/6859/ о том, как на стороне сайта разделить одновременные импорты каталога по разным временным таблицам и разным папкам для присылаемых от 1С файлов. В том посте речь шла об импорте данных из разных баз. На одном из проектов вновь пришлось столкнуться с той же самой задачей, но с другого бока: серверная 1С УТ должна была по расписанию вести импорт по нескольким узлам обмена одновременно.

Соответсвенно, встала задача сделать так, чтобы разные узлы обмена передавали скрипту обмена на стороне сайта свой уникальный идентификатор, который и будет служить потом параметром IB_ID (это был не ид инфоблока, а ид информационной базы) кастомизированного компонента из вышеуказанного поста.

Задача решается кастомизацией функции ПолучитьДанныеССервера из битриксовского модуля обмена. Находим место, где посылается http запрос и ожидается ответ и пишем так:

HTTPОтвет = Соединение.Получить(СокрЛП(ПараметрыЗапроса)+"&KodUzla="+формат(Число(ПараметрыОбмена.ссылка.код),"ЧГ=0";), ИмяФайлаОтвета, СокрЛП(Заголовки));

Аналогичное изменение нужно внести и в функцию ПолучитьРезультатОтправкиФайлаНаСервер

Битрикс24 - опыт расширения функционала за счет бизнес-процессов (коробочная версия)

Битрикс24 - в коробке - это просто потрясающий продукт, от которого я в полном восторге. В восторге от того, как легко на базе этого продукта можно автоматизировать абсолютно любой документооборот, абсолютно любые бизнес-процессы компании, как легко расширять функционал и кастомизировать его.

В этом июне мне посчастливилось реализовать на базе Битрикс24 один очень интересный кейс, о котором я хочу рассказать в этом посте.

Я думаю, большинству читателей моего блога известно, что такое сделки в Битрикс24, что такое статусы сделок и как можно повесить выполнение определенного бизнес-процесса на переход сделки в определенный статус. Это достаточно тривиальная задача. Мои же клиенты захотели, чтобы каждый продукт в сделке так же обладал своим собственным статусом (состоянием готовности), чтобы набор возможных статусов настраивался отдельно для каждого продукта и чтобы на переход каждого продукта в каждый статус можно было настроить отдельный бизнес-процесс. Все это удалось реализовать за очень короткий срок, не отступая от "золотых правил" разработки под Битрикс.

Стандартными средствами Битрикс24 продукту было добавлено множественное свойство "Возможные статусы":



После этого я кастомизировала компонент формы редактирования продукта в каталоге, для того, чтобы каждому продукту можно было задавать свой набор статусов и ставить каждому статусу в соответсвие бизнес-процесс из раздела Сервисы - Бизнес-процессы:



Для хранения привязки бизнес-процесса к статусу товара использовано служебное поле Описания значения свойства инфоблока:



Далее был кастомизирован шаблон компонента отображения продуктов сделки - был добавлен вывод статуса для каждого продукта сделки в виде статус-бара.



С этой частью пришлось повозиться больше всего.

Для хранения привязки стейджа к продукту и владельцу (а владельцем может быть не только сделка) был заведен отдельный хайлоадблок:



При нажатии на любой стейдж (статус) в статус-баре продукт данной сделки во-первых переводится в соответствующий статус, во вторых запускается соответствующий статусу бизнесс-процесс. Для этого был написан скрипт, который запускается по аяксу по клику на стейдж, в-третьих между процессами передаются некоторые переменные. Не буду приводить его целиком - покажу только интересные моменты

Первым делом получаем список доступных стейджей для продукта (по ID продукта) и текущий стейдж в хайлоадблоке состояний продуктов, если стейдж уже и так последний - ничего не делаем//если стейдж не последний - находим тот, в который нам нужно перевести продукт. Сохранение стейджа продукта - это апдейт или добавление элемента в хайлоадблок состояний. Интересное начнается при запуске соответсвуюещего БП
CModule::IncludeModule('bizproc');

//В $UF_STAGE у нас порядковый номер текущего стейджа (порядковый в разрезе продукта)
$BP_ID = $arStagesProperty['DESCRIPTION'][$UF_STAGE]; 
$STAGE_NAME = $arStagesProperty['VALUE'][$UF_STAGE];
$STAGE_ID=$arStagesProperty['PROPERTY_VALUE_ID'][$UF_STAGE]; 
//В $arIB заранее собрана привязка информационных блоков БП и темплейтов БП (эти ID разные, и разработчики часто их путают)
$IB_ID=$arIB[$BP_ID];

//Далее мы собираем виртуальный документ, над которым будет запущен потом экземпляр БП
//Через свойства этого виртуального документа можно передать все, что нам понадобится на этапе выполнения БП
//эти свойства доступны в свойствах документа при настройке различных активити в дизайнере БП

$documentId = CBPVirtualDocument::CreateDocument(0,array( "IBLOCK_ID" => $IB_ID, "NAME" => "Create Notification", "CREATED_BY" => "user_1",  "PROPERTY_STAGE_ID"=>$STAGE_ID, "PROPERTY_STAGE_NAME"=>$STAGE_NAME, "PROPERTY_DEAL_ID"=>$UF_OWNER, "PROPERTY_PRODUCT_ID"=>$UF_PRODUCT, "PROPERTY_PRODUCT_NAME"=>$UF_PRODUCT_NAME, "PROPERTY_HEAD_TASK_ID"=>$HEAD_TASK_ID,      )     );

 $arErrorsTmp = array();
//Запаскаем нужный БП 
CBPDocument::StartWorkflow($BP_ID,   array("bizproc","CBPVirtualDocument",$documentId),  array(), $arErrorsTmp);
Естественно, для запуска данных БП описанным способом предварительно в админке необходимо добавлять соответсвующие свойства соответсвующему данному бизнес-процессу инфоблоку.




Далее возникла сложность с режимом редактирования списка товаров сделки. Нужно было, чтобы сразу после добавления товара в сделку отображался кликабельный стейдж-бар именно для этого товара. Для этого я написала еще один скрипт для вызова аяксом, который отрисовывает стейдж-бар для определенного продукта.


Некоторые статусы продуктов предполагают, что оператор переводит продукт в данный статус вручную, а в некоторые продукт переходит автоматически по завершении бизнес-процесса другого статуса. То есть по завершении предыдущего БП в таких случаях должен не только запуститься следующий, но и соответсвующий продукт в соответсвующей сделке должен сменить статус. Это было реализовано php-вставкой на уровне соответсвующего БП.



Тут закономерно возникает вопрос (который я задавала и заказчику на этапе внедрения): а почему бы не реализовать это одним большим и сложным БП, к-й переводит продукт от одного статуса к другому. С таким сложным БП ИТ-специалисту заказчика, к-й будет поддерживать проект было бы тяжело работать. А с выбранной реализацией для того, чтобы изменить поведение системы при переводе конкретного продукта в конкретный статус, ИТ-специалисту заказчика нужно сделать простые и понятные действия на уровне дизайнера бизнес-процессов в очень простых и маленьких БП.

php-вставка для перевода продукта из одного стейджа в другой и запуска соответсвующего БП выглядела примерно так же, как и скрипт перевода продукта из одного стейджа в другой, за исключением того, что переменные приходили не из POST-запроса, а из переменных БП и из свойств виртуального документа:
$product_id='{=Document:PROPERTY_PRODUCT_ID}';
$owner_id='{=Document:PROPERTY_DEAL_ID}';
$head_task_id='{=Variable:HEADTASKID_printable}';
Кстати реализация подобного кейса не возможна в облачной версии Битрикс24. Поэтому своим клиентам я рекомендую покупать именно коробочную версию. Ведь в коробке Битрикс24 можно реализовать любые хотелки, и облачная версия в контексте подобных задач - просто ущербна.

Интеграция корпортала Битрикс24 (коробка) с AD: о подводных камнях и о том, как я их обходила

С детства я очень везучий человек - это передо мной не открываются автоматические двери, это я всегда вытягиваю число 13 при любой жеребьевке и это я сажусь на единственный сломанный стул из множества. Поэтому, когда я внедряю какой-либо программный продукт, обстоятельства обязательно складываются так, что всплывают, если не все его "баги" и "фичи", то добрые 90%. Я уже привыкла к этому - и это делает мою жизнь похожей на фильм.

Мое сказочное везение не подвело меня и на моем недавнем внедрении коробки Битрикс24. Внедряла в строительной компании средней величины. Пользователей AD (Active Directory) около 400 человек, и 105 из них являются так же пользователями корпортала, остальным корпортал для работы не нужен.

Как известно, корпортал коробка лицензируется по количеству активных пользователей, поэтому импортировать в портал лишних пользователей было нельзя. Это обстоятельство в корпортативном портале Битрикс24, слава богу, предусмотрено - в настройках AD/LDAP интеграции можно исключить определенные группы пользователей AD из импорта. Исключили, пользователи синхронизировались отлично, однако структура компании построилась не правильно:




Присутствовали пустые департаменты, у пользователей - тесок - перемешались подчиненные, а один отдел был создан 2 раза.

Стала разбираться, вставлять отладочные скрипты, писать в техническую поддержку и даже Юрию Волошину (спасибо ему за оперативные ответы).

Оказалось, что с тесками - известный баг, а у меня - первый такой реальный случай в истории. (Хотя это странно. Полные тески на руководящих должностях - далеко не редкость, особенно, когда они - отец и сын. Когда я работала в одном из подразделений РЖД, у нас там чуть ли не у каждого крупного начальника был сын, названный в честь отца, работающий начальником помельче. Мы обычно называли их между собой "старший" и "младший", но ведь в документах так писать не будешь, поэтому программное обеспечение должно предусматривать такие случаи).

С тесками мы расправились, добавив пробел к имени одного из них на стороне AD.

Дальше - интереснее. Стала я отлаживать скрипт импорта пользователей из AD, и поняла, от куда появляются пустые департаменты. Это департаменты, в которых работают пользователи, которые входят в те группы AD, которые в настройках интеграции записаны в исключения.

Дело в том, что до импорта каждого пользователя под него создается раздел в структуре компании, и только потом, когда пользователь уже непосредственно импортируется происходит проверка на его вхождение в группы - исключения. Этот момент я кастомизировала.

Скопировала скрипт /bitrix/modules/main/admin/user_import.php, переименовала его в user_customimport.php, в скрипте /bitrix/admin/user_import.php подключила свой скрипт вместо стандартного. Глубоко переписывать алгоритм не стала - просто вставила после импорта всех пользователей удаление пустых департаментов:
$arUsersDeps=array();
$rsDepUsers = CUser::GetList(); 
  
while ($arDepUser = $rsDepUsers->Fetch()) 
 {
  $arUsersDeps[]=$arDepUser['WORK_DEPARTMENT'];     
 }
       
$arDepFilter = Array('IBLOCK_ID'=>$ib_id);
$db_Deplist = CIBlockSection::GetList(Array($by=>$order), $arDepFilter, true);
     
$id_section_fd=array();
while($arDepSection = $db_Deplist->Fetch())
 {  
 if (!in_array($arDepSection['NAME'],$arUsersDeps) && $arDepSection['ID']!=773){ 
 $id_section_fd[]=$arDepSection['ID']; 
 }
   
}
    
foreach($id_section_fd as $dep_id){ 
     
 $DB->StartTransaction();
 if(!CIBlockSection::Delete($dep_id))
 {
  $strWarning .= 'Error.';
  $DB->Rollback();
 }
 else
 $DB->Commit();
}
 
Вместо одного отдела ITC упорно создавались 2, сколько мы ни перепроверяли на стороне AD заполненность менеджеров и департаментов для каждого пользователя по всей иерархии. Да. на каком-то этапе мы с админом нашли множество ошибок на стороне AD, но их исправление так и не повлияло на импорт структуры.

Тогда в своем скрипте импорта пользователей я завела класс-наследник

class CLDAPCustom extends CLDAP     {...}
И переопределила функцию GetDepartmentIdForADUser
функция бешеная - нечитабельная, а кроме того - рекурсивная, легче умереть, чем ее отладить, поэтому я просто изменила механизм проверки перед вставкой нового департамента. В оригинале поиск совпадения департамента велся только в определенном поддереве (а искало, как показала отладка, не в том поддереве, почему - так и осталось не ясно). Так как в моей компании все подразделения названы уникальными именами, сделала, чтобы искало совпадение по всей структуре.

В итоге структура департаментов из AD все же импортировалась в том виде, как должна была быть.




На самом деле получилось все равно не так, как было задумано. В компании есть департаменты, в которых нет начальника, а все сотрудники - равноправны и подчиняются напрямую сотруднику другого отдела. Система же в таких случаях "назначает" департаменту случайного руководителя. С этим решили смириться, техподдержка Битрикс пообещала учесть это как пожелание при будущих обновлениях продукта.

Интеграция 1С-Битрикс и 1С Предприятия УТ – о фильтрации импорта по сегментам номенклатуры

Недавно столкнулась с интересным и необычным вариантом организации номенклатурного учета в 1С Предприятии УТ. Необычным, но допустимым в системе и абсолютно корректным.

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



Импортировать же товар в интернет-магазин было решено именно в разрезе коллекций. На стороне 1С Предприятия коллекции были реализованы, как сегменты номенклатуры. Сегмент номенклатуры в 1С УТ – это по сути результат работы отбора по номенклатуре, который возможен, как по реквизитам номенклатуры, так и по реквизитам характеристик. На рисунке ниже - пример содержимого сегмента, сформированного с отбором по реквизиту характеристики.



Модуль же обмена УТ, как стандартный, так и из битриксовского дополнения оказался не приспособленным к импорту в интернет-магазин товара, учтенного таким способом.



Фильтрация выгрузки по сегментам – предусмотрена в модуле импорта, но не учитывает того, что у сегмента бывает отбор по реквизиту характеристики. В оригинальном варианте модуля импорта (Управление торговлей, редакция 11.1 (11.1.9.70), версия модуля 4.0.5.2) при фильтрации по такому сегменту выбиралась та номенклатура, которая нужна, но выгружались все ее характеристики, а не только те, реквизиты которых соответствовали настройкам отбора сегмента.

Поэтому я решила кастомизировать битриксовский модуль обмена на стороне 1С.

Очевидным и самым простым вариантом решения данной задачи было бы исправление запроса на выборку номенклатуры с характеристиками в функции СформироватьВременныеТаблицыПоИнформацииОТоварахПакет. Но я посмотрела-посмотрела на этот километровый запрос, и поняла, что вклиниваться в него боюсь, тем более, что данный запрос битриксоиды видоизменяют с выходом новых обновлений версий УТ и модуля обмена, и поддерживать каждый раз его модификацию было бы для меня слишком трудоемко. (А вот если бы сами битриксоиды допилили его – было бы круто).

Поэтому я решила реализовать менее оптимальный, но простой в поддержке способ решения поставленной задачи - вклиниться в процедуру ВыгрузитьПредложения, в то место, где уже сформирована ТаблицаЗначений с предложениями, предназначенными для импорта на сайт и непосредственно перед импортом профильтровать эту таблицу по характеристикам сегмента.
Для начала я снова вычленила, по какому сегменту происходит фильтрация в настройках обмена.

ИспользуетсяОтборПоСегментуНоменклатуры = Ложь;
Отбор = КомпоновщикНастроек.Настройки.Отбор;
ПолеСегмент = Новый ПолеКомпоновкиДанных("СегментНоменклатуры" );

Для Каждого ЭлементОтбора Из Отбор.Элементы Цикл
Если ЭлементОтбора.ЛевоеЗначение = ПолеСегмент Тогда
Если ЭлементОтбора.Использование Тогда
СсылкаСегмент=ЭлементОтбора.ПравоеЗначение.Ссылка;
КодСегмента=ЭлементОтбора.ПравоеЗначение.Код;
НаименованиеСегмента=ЭлементОтбора.ПравоеЗначение.Наименование;
ИспользуетсяОтборПоСегментуНоменклатуры = Истина;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;

Затем я выбрала номенклатуру и характеристики сегмента во вспомогательную таблицу значений, воспользовавшись функцией из ядра УТ.

ТнзСегмента=СегментыСервер.ТаблицаЗначений(СсылкаСегмент);

После этого я нашла пересечение этих двух таблиц, воспользовавшись функцией от сюда>>

Спасибо 1С-нику Кириллову Роману (его можно найти на 1clancer.ru, и он там, кстати, №1) за консультацию по этому вопросу.

ТнзСегмента=СегментыСервер.ТаблицаЗначений(СсылкаСегмент);
КолонкиДляСравнения= Новый ТаблицаЗначений;
КолонкиДляСравнения.Колонки.Добавить("Колонки1" );
КолонкиДляСравнения.Колонки.Добавить("Колонки2" );
Стр=КолонкиДляСравнения.Добавить();
Стр.Колонки1="Номенклатура";
Стр.Колонки2="Номенклатура";
Стр=КолонкиДляСравнения.Добавить();
Стр.Колонки1="Характеристика";
Стр.Колонки2="Характеристика";
ТзнПредложений=СравнитьДанные(ТзнПредложений,ТнзСегмента,КолонкиДляСравнения,Ложь);
И импорт заработал так, как нужно было на данном проекте, кстати, он в такой модификации – абсолютно универсален для фильтрации по какому угодно сегменту.


Как сделать, чтобы импорт каталога из 1С Предприятия в Битрикс шел «туда» (в нужный инфоблок)

Тема стара, как обмен между 1С Предприятие и 1С-Битрикс, но продолжает будоражить умы. Расскажу по шагам, как это делаю я.
Мы провели выгрузку каталога из 1С и видим, что наряду со старым товарным инфоблоком в админке сайта создался новый. Что делать?



1) Идем в настройки – Настройки модулей – Информационные блоки и включаем галочку
«Показывать код загрузки из внешних источников»



2) Далее идем в Магазин – Интеграция с 1С
На самой первой вкладке если тип инфоблока не выбран, выбираем тип инфоблока catalog



3) Удаляем новый инфоблок и новый тип инфоблока и запускаем импорт из 1С по-новой.



4) Теперь мы видим, что инфоблок создался уже в нужном нам типе инфоблоков.
Идем дальше
Открываем новый инфоблок на редактирование, копируем его внешний код
Открываем в соседней вкладке старый инфоблок на редактирование – вставляем туда внешний код



5) Открываем вкладку Свойства обоих инфоблоков в соседних вкладках
Аккуратно ищем в новом инфоблоке свойства, которые есть в старом – по коду, и если такие совпадающие свойства есть – копируем для них внешний код из нового блока в старый. А если они разных типов – то в простом варианте просто удаляем такое свойство из старого инфоблока. В сложном – там надо думать о кастомизации импорта.



Осталось разобраться с ценой. Если это малый бизнес, то открываем файл обмена сохраненный в логах, ищем там внешний код цены и вписываем его во внешний код единственной цены в битриксе.

6) Снова удаляем новый инфоблок, запускаем импорт заново – наслаждаемся попаданием импорта «туда»



7) После этого в настройках каталога в публичной части сайта нужно вывести нужные свойства, перевыбрать тип цены, настроить, какие свойства должны отображаться в умном фильтре а какие – на детальной странице.

P/S: в редких случаях, если не применяются типовые решения из маркетплейс или если публичка сайта еще не разработана и инфоблок товаров - по сути пустой и вам все равно, какое свойство, куда попадает, можно направить выгрузку сразу в нужный инфоблок (и если из 1С импортируется только 1 каталог в 1 инфоблок) (для реальных и серьезных проектов я это делать не рекомендую, но все же):

В поле внешнего кода нужного инфоблока пишем FUTURE-1C-CATALOG и при первой же выгрузке из 1С все товары попадут в него.
В ИБ товарных предложений в поле внешнего кода пишем FUTURE-1C-OFFERS и товарные предложения - пойдут в него.

Еще раз про импорт каталога из 1С-Битрикс в 1С Предприятие и обратно

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

Итак,
1) В ситуации, когда источником данных о номенклатуре являлся сайт мы оказывались не единожды, и ни разу не было такого, чтобы у товаров на сайте не было каких-то XML_ID Обычно клиенты забивают товары на сайт не вручную, а пользуясь различными импортами, в следствии которых XML_ID - рождается. Так вот, прежде чем импортировать каталог в 1С необходимо убедиться, что все XML_ID товаров и разделов на сайте - уникальны. То есть, если есть раздел с XML_ID, к примеру, "121", то товара с XML_ID "121" уже быть не должно, потому что, когда они придут на сторону 1С - они будут записываться в справочник, а элемент справочника отличается от группы справочника только флажком, и вот такая неуникальность среди кодов разделов и товаров потом приводит к куче скрытых багов - обмен может не ругнуться, если у товара с неуникальным кодом нет картинки.

2) Если мы используем стандартную обработку "Помощник импорта...", нужно помнить, что если не дай бог, в первый раз номенклатура загрузится как-то не так, то нам ее придется помечать на удаление и удалять перед следующим запуском обработки - что может оказаться на большой базе жутким геморроем, Поэтому сначала нужно пробовать на 1м разделе или на небольшом участке (для этого кастомайзим сторону сайта - об этом в моем предыдущем посте есть). Или дописываем сами апдейт полей, которые нужно перезаписать, в функции
НайтиСоздатьНоменклатуру на стороне 1С

Например, так:
Иначе 
Номенклатура=НоменклатураСсылка.ПолучитьОбъект(); 
УстановитьРодителя(Номенклатура, СтрокаТовара.Группы); 
Номенклатура.Записать(); 
КонецЕсли; 
КонецПроцедуры; 

3) Успешно загрузили номенклатуру с сайта в 1С? Радоваться рано. Можно сэмулировать прикольный баг, когда обратный импорт на сайт потрет картинки на сайте. Для этого нужно создать узел полного обмена товарами и сделать полную выгрузку сначала в тестовый инфоблок на сайте, обрадоваться, что все хорошо пришло, скопировать его внешний код во внешний код рабочего инфоблока, снести тестовый и снова выполнить полный обмен. Вуаля - картинок нет. Примерно такая последовательность. А чтобы такого не случилось, при первом импорте в рабочий инфоблок нужно делать принудительную полную выгрузку.

Интеграция 1С Предприятия и 1С-Битрикс на новой версии модуля обмена – из опыта

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

Моя основная проблема с новым модулем интеграции состояла в том, что мне было лень на него переходить – за время существования старого модуля обмена, мы серьезно доразвили его для наших клиентов, допилили функционал на стороне 1С, вынесли все во внешние обработки, на стороне Битрикс запили свой модуль и почивали на лаврах. Когда приходил новый клиент, я просто находила похожий кейс, и мы дорабатывали какие-то неизбежно существующие особенности, будучи уверенными, что все пойдет, как надо.

Когда Битриксоиды выпустили новый модуль, некоторое время я присматривалась к нему, но не хотела внедрять – опасалась.

А потом летом случилось страшное - в какой-то момент мои шустрые сотрудники закончили все проекты и 3 дня сидели без дела. Дело то я им, конечно, нашла – обновили наши модули в маркете, но страх повторения этого апокалипсиса – остался. В тот момент я придумала акцию «интеграция в подарок» за покупку у меня лицензии на Битрикс Бизнес или за заключение со мной договора техподдержки на год. Акцию публиковала в разделе партнерских акций на сайте Битрикса, и она выстрелила – до сих пор слышу эхо.

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

Передо мной встал сложный выбор – интегрировать новых сложных клиентов своим старым способом или внедрять им новый модуль обмена. К слову, новый модуль обмена на 80% покрывает те задачки, к-е раньше мы допиливали клиентам, как нестандартные. Посмотрела я на него и на наши обработки и подумала, что развивать свой модуль на стороне 1с, пытаясь угнаться за Битриксоидами – будет не выгодно. К тому же я вступила во взаимовыгодное партнерство с фирмой, к-я предоставляет 1С Предприятие в качестве «аренды приложения» и я хотела максимально упростить наше взаимодействие и конфигурирование 1с-ки клиентов.
Этот же фактор заставил меня глубже разобраться в коде конфигурации 1С УТ, и я, как обычно, переосмыслила все на новом уровне. (Кстати, у меня в команде теперь есть совершенно отдельный человечек, который занимается исключительно начальными настройками 1С УТ под разные особенности учета и документооборота).

Итак я начала внедрять новый модуль обмена, устанавливая клиентам 1С Предприятие 8.3.5, 1С УТ 11.1.6, накатывала на 1С УТ свежую версию Битриксовского дополнения, и брали свежий на момент начала работ Битрикс. Кстати, версия Битрикс была один из камушков. С него и начну.

1) Соответствие версий обмена на стороне 1С Битрикс и на стороне 1С Предприятия

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

Настройки -> Инструменты - > Команда PHP строка
COption::SetOptionString("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y" ;
COption::SetOptionString("sale", "secure_1c_exchange", "N" ;

И включится поддержка старой версии протокола.

2) Экспорт в 1С большого объема товаров
На одном из проектов мне нужно было выгрузить с сайта в 1С порядка 40 000 номенклатурынх позиций с картинками. Обработка «Помощник импорта» выполняла эту операцию ужасно долго – больше суток, что было непреемлемо для меня, и я переписала в ней некоторые места – вынесла запросы к базе из цикла. Об этом я писала отдельный пост. Битриксоиды обещали оптимизировать обработку в обновлениях.

3) Обратный импорт и дерево групп
На проекте того же самого клиента, когда мы стали делать интеграцию в обратную сторону у нас сложилась очень специфичная ситуация.

Изначально структура каталога была создана на сайте – не на битриксовском сайте, а на другом старом сайте заказчика на OpenCart. Залили каталог в Битрикс. (используя, кстати, наш модуль импорта из yml и модуль экспорта в yml из опенкарт, к-й я написла на базе одного из бесплатных и дарю теперь тем, кто покупает мой модуль импорта из yml в Битрикс и хочет забрать товары из магазина на OpenCart)

Залили каталог в 1С – все получилось просто отлично – группам товаров был присвоен код, к-й соответствовал внешнему коду разделов XML_ID на стороне Битрикс. Договорились с заказчиком, что далее наполняем каталог и редактируем его структуру на стороне 1С. Выполнили обратный импорт каталога, чтобы убедиться, что все ок, настроили обмен ценами и остатками, протестировали. Затем заказчик сказал, что структура каталога на сайте и в 1С – будет разной. В новом модуле обмена – можно настраивать дерево групп – и такая задача теперь вообще не проблема. Однако выяснился интересный факт – это скорее фича, а не баг, но она меня сильно смутила по-началу. Когда я на стороне 1С настроила дерево групп, я думала, что после обмена они – группы, к-е уже были импортированны на сайт до настройки дерева – возьмут и сами в соответствии с этим деревом перестроятся. Однако начали создаваться новые группы с новыми XML_ID. И это пришлось учесть.

4) Мелкие неприятности на стороне 1С
Трем клиентам внедряли 1С УТ с нуля (+ интегрировали с Битрикс конечно же). Кейсы были идентичными, и делали фактически параллельно. Я сделала одному клиенту, протестила и посадила помощницу все сделать точно так же на 2х других проектах. Начинаю тестировать – на 2х других проектах не работают стандартные отчеты. Вылетает ошибка

Индексируемые поля должны присутствовать в списке выборки
<>Сегменты.Номенклатура

Начинаю внутренне закипать и перебирать в уме все известные мне бранные выражения. Вслух молчу – проверяю. Вроде все одинаково. Разница оказалась в версиях платформы. Там, где все работало ок, версия стояла 8.3.5.1068, а там, где вылетала ошибка – стояла версия платформы 8.3.5.1119, конфигурация стояла одна и та же 1С УТ 11.1.6.26 Проблему решило включение режима совместимости с версией 8.3.4 А при установке дополнения я его обычно совсем выключала - а надо было, видимо, ставить 8.3.4 Хотя на более низких версиях платформы - в частности на 8.3.5.1068 все было ок с отключенным режимом совместимости, а я уже думала, что съем кого-нибудь.

5) Соответствия служб доставок и контрагентов – грузоперевозчиков
Эта задача у нас была неплохо и удобно решена на старом модуле, но к новому модулю старое решение не подходило совсем. На новом модуле я решила задачу с минимальной модификацией модуля обмена заказами, а именно процедуры "СоздатьОбновитьЗаказ".

Дописала там, где шло заполнение свойств заказа, возможно, не очень оптимально.
СпособДоставки = ПолучитьЗначениеРеквизитаДокумента(ДокументXML.ЗначенияРеквизитов, "Способ доставки";);
АдресДоставик= ПолучитьЗначениеРеквизитаДокумента(ДокументXML.ЗначенияРеквизитов, "Адрес доставки";);

//Получаем соответсвия доставок из наших доп настроек:
КлючОбъекта = "Бедросова";
КлючНастроек = "ОбменССайтомБедросова";
//ИмяПользователя = ИмяПользователя();
ИмяПользователя = "SHARE";
СтруктураНастроек = Новый Структура();
Попытка
СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта,КлючНастроек,,ИмяПользователя);
Исключение
Сообщить("Нет прав на чтение доп настроек обмена.";);
КонецПопытки;
Если СтруктураНастроек = Неопределено Тогда
Сообщить("Не вышло прочитать доп настройки обмена!";);
Иначе
НайденнаяСтрока = СтруктураНастроек.СоответствиеСпособовДоставки.Найти(СпособДоставки, "НаСайте";);
Если НЕ НайденнаяСтрока = Неопределено Тогда
Заказ.СпособДоставки = НайденнаяСтрока.НаСервере;
Заказ.ПеревозчикПартнер = НайденнаяСтрока.Контрагент;
КонецЕсли;
КонецЕсли
А дополнительные настройки - оставила во внешней обработке - так же, как описывала раньше.




6) Корректная передача валюты в заказах
Делая одному из клиентов обмен заказами, столкнулась с такой проблемой: Обмен сам-по себе - проходит нормально, но затем заказу, пришедшему с сайта не удается изменить статус - выдавало ошибку

"Значение поля Валюта не может быть пустым"

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


Но в заказах, пришедших с сайта валюта была не заполнена.
Оказалось, нужно было указать валюту еще и в настройках интеграции на стороне сайта:

к сожалению, не было возможности протестировать это на мультивалютных магазинах.

7) Отбор номенклатуры по свойству товара

У одного из клиентов стояла 1С УТ 10.3.29.1, накатила на нее соответсвующий модуль обмена. При выгрузке номенклатуры из 1С на сайт нужно было сделать, чтобы выгружались только те товары, у которых определенное пользовательское свойство равно определенному значению. Сначала думала, что для этой цели можно использовать настройки отбора.


Оказалось, что нет.
Этот отбор не для отбора товаров, а общий отбор свойств. Т.е. будут выгружены только те свойства, которые в этом отборе(независимо от доп. настроек свойств).

Но в 1С УТ 10.3 в модуле менеджера объекта плана обмена "Б_ОбменССайтом" есть процедура "НастроитьПостроительТоваров". В ней я и подправила пакет запросов, связанный с выборкой товаров для того, чтобы решить свою задачу.

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

Импорт товаров из 1С-Битрикс в 1С Предприятие УТ 11 - опыт использования стандартного функционала

В прошлый раз, когда я делала клиенту импорт товаров из 1С-Битрикс в 1С Предприятие УТ мы с 1С-программистом делали какую-то жуткую кастомизацию по его инициативе, и от стандартного импорта там остались только рожки да ножки. Сейчас со мной работает другой 1С-программист, и мы стараемся сначала выжать максимум из стандартного функционала, а уж потом, если этого мало — переходим к кастомизации.

Итак передо мной встала задача импортировать 36 000 с хвостом товаров из 1С-Битрикс в 1С УТ 11.1.6. Битрикс обновлен до самой свежей версии, на 1С УТ установлено битриксоидовское дополнение.

Начав настраивать импорт каталога с сайта заказчика в 1С УТ я, как обычно, сделала множество открытий:

1) Уникальность рабочих наименований.
Когда у нас на сайте 36 000 товаров в 300х разделах, их наименования, естественно, не уникальны. В 1С УТ же по-умолчанию включен контроль их уникальности, в следствии чего импорт товаров через помощник импорта товаров с сайта завершается с ошибкой.
Открываем конфигурацию 1С УТ в режиме предприятия, идем в Администрирование — Настройка параметров системы — Номенклатура Снимаем галочку «Контроль уникальности...»


2) Список свойств, которые могут быть импортированы — не описан пока в документации, поэтому пришлось выявить его, почитав код обработки «Помощник импорта товаров». Это:
CML2_ARTICLE — артикул
CML2_BASE_UNIT — базовая единица
Помимо этого в тексте обработки перебираются и записываются в дополнительные сведения о номенклатуре все остальные свойства с префиксом CML2_

Для того, чтобы сайт корректно отдал эти свойства 1С-ке, в настройке свойств инфоблоков свойствам нужно задать соответствующие внешние коды:

3) Меня так же интересовал момент, предусматривает ли обработка апдейт элемента номенклатуры — или только вставку и по какому полю контролируется наличие элемента в справочнике.
Апдейта нет — только вставка.
В качестве уникального идентификатора номенклатуры используется
Номенклатура.Б_Идентификатор = СтрокаТовара.Ид;

В это ИД товара Битрикс вписывает XML_ID товара, если оно задано и обычное ID товара, если XML_ID не задано. У меня XML_ID были заданы, так я изначально наполняла сайт заказчика через свой модуль импорта из YML файлов, предоставленных поставщиком.
Если у вас на сайте не заданы XML_ID — рекомендую их сгенерировать — к примеру, можно сделать их равными ID. Какой смысл? Это решит в дальнейшем проблему обмена в другую сторону и проблему с обменом заказами.

4) Механизм нужно протестировать перед финальной загрузкой, которая даже на очень мощном сервере будет длиться очень долго.

На стороне сайта я тестирую выгрузку так:
- авторизуюсь на сайте
- вбиваю в строку браузера запрос:
http://адрес_сайта/bitrix/admin/1c_exchange.php?type=get_catalog&mode=init
получаю
zip=yes
- вбиваю следующий запрос:
http://адрес_сайта/bitrix/admin/1c_exchange.php?type=get_catalog&mode=query
Сайт отдает кусочек xml-файла. Он не выглядит как xml-файл — это нормально — он не целый и не завершенный. 1С-ка когда прихоит на сайт за каталогом посылает этот запрос до тех пор, пока не заберет весь файл по кусочкам.

Однако, то, как выгружаются товары — мы видим, проверяем, выгружается ли все так, как нужно.

Далее мне необходимо как-то сначала протестировать импорт на стороне 1С Предприятия на маленьком кусочке. Потому что, если все 36 000 товаров загрузятся неправильно, потом можно успеть состариться, пока дождешься их удаления — мы ведь проапдейтить их в следующий проход импорта не сможем. Я хочу протестировать обмен сначала на 100-200х товаров — думаю, этого будет достаточно. Для этого я копирую компонент экспорта каталога catalog.export.1c в свое пространство имен.

В своем кастомном компоненте я нахожу место

elseif($_GET["mode"] == "query" )
{
И дописываю:

if ($_SESSION["BX_CML2_EXPORT"]["current"]>100) $_SESSION["BX_CML2_EXPORT"]["step"]=4;
Делаю свой скрипт обмена 1c_exchange2.php, в котором подключаю свой компонент вместо стандартного.

elseif($type=="get_catalog" )
{
$APPLICATION->IncludeComponent("bedrosova:catalog.export.1c", "", Array(
"IBLOCK_ID" => COption::GetOptionString("catalog", "1CE_IBLOCK_ID", "" ),
"INTERVAL" => COption::GetOptionString("catalog", "1CE_INTERVAL", "-" ),
"ELEMENTS_PER_STEP" => COption::GetOptionString("catalog", "1CE_ELEMENTS_PER_STEP", 100),
"GROUP_PERMISSIONS" => explode(",", COption::GetOptionString("catalog", "1CE_GROUP_PERMISSIONS", "1" )),
"USE_ZIP" => COption::GetOptionString("catalog", "1CE_USE_ZIP", "Y" ),
)
);
}
Мой скрипт 1c_exchange2.php будет отдавать 1С-ке только 100+N товаров. N – количество товаров, выгружаемых за 1 шаг. Вписываю в помощнике импорта адрес своего скрипта и запускаю импорт.

После того, как товары загружены — начинается загрузка картинок. На этом этапе может вывалиться ошибка «Реквизит для группы не найден» - она может возникнуть, если есть группа с таким же уникальным айдишником, как товар (на стороне сайта придется дополнительно перепроверять сквозную уникальность XML_ID групп и товаров).

Радуемся - товары успешно загрузились в 1С Предприятие УТ. У них есть наименование, артикул, привзяка к группе, картинка, а так же дополнительные свойства - в дополнительных сведениях. Когда потом с сайта придут заказы - 1С однозначно идентифицирует товары заказа по XML_ID, а складовщик посмотрит на картинку - и не ошибется при отгрузке.

Помощник импорта товаров в 1с с сайта на Битрикс — в целом пригоден для одноразовой загрузки номенклатуры без дополнительной кастомизации. Единственное, плохо, что обработка выполняется очень медленно. Я расстрою тех, кто собирался развернуть 1С УТ на своем ноутбуке.

Но для москвичей это не проблема. Ведь в вашем городе живет и работает мой надежный партнер Вячеслав Мишаков (тел. 8 499 70 77 118) - руководитель компании КМ Системс. Специалисты КМ Системс соберут для вас сервер под 1С Предприятие УТ, идеально подходящий для последующей синхронизации с 1С Битрикс. Ребята сами привезут к вам сервер, настроят его, установят 1С Предприятие, подключат его к локальной сети, разграничат доступ для ваших сотрудников, будут оказывать регулярную техподдержку сервера. Для тех, кто еще не созрел для покупки собственного сервера, КМ Системс предлагает разместить 1С Предприятие в их датацентре. Захожу на их сервера, чтобы интегрировать 1С Предприятие клиентов с 1С-Битрикс и радуюсь - не работа, а удовольствие.

Как я обычно настраиваю Git репозиторий для работы с 1С-Битрикс

В простейшем варианте организации командной работы над проектом нам необходим — один основной сайт на сервере — будем называть его продакшеном, один сайт для тестирования (девелоперский сайт) — на сервере рядом с ним (дев. сайт) + по локальной копии сайта у каждого разработчика. (Девелоперских сайтов на сервере может быть несколько, но по поводу дополнительных дев. сайтов необходимо предварительно консультироваться с технической поддержкой Битрикс по поводу правомерности такой системы с точки зрения лицензионного договора).

Каждый разработчик будет работать над проектом в своей локальной копии сайта, в отдельной ветке Git для каждой решаемой задачи. В конце дня каждый разработчик делает коммит в репозиторий, хранящийся на github.com и только один разработчик — ведущий, проверяет и объединяет ветки сначала на девелоперском сайте на сервере, а потом выкатывает полученный результат на продакшен. (По моему субъективному мнению, двоевластие на интернет-проекте — недопустимо. Даже если слияние веток и тестирование будет отнимать все рабочее время ведущего разработчика проекта — никто кроме него не должен вносить изменения на продакшен — сайт) В начале дня — разработчики обновляют свои репозитории с гитхаба.

В случае, когда необходимо изменение структуры БД, разработчики сначала вносят изменения в своих локальных копиях, пишут список изменений ведущему разработчику, ведущий разработчик вносит их на продакшене, делает бекап БД продакшена, который затем накатывается на дев-сайт и на все локальные дев-сайты. Дополнительно настраивается репликация БД (но это уже тема для другой статьи).

Итак, мы имеем выделенный сервер, два настроенных виртуальных хоста и установленное серверное ПО git — это, как правило, могут сделать для нас сотрудники хостинга, на котором мы покупаем сервер.

В директории основного сайта разворачиваем бекап сайта стандартными средствами Битрикс (или руками), директория девелоперского сайта пока пусть будет пустой.

Регистириуем корпоративный тариф на github.com Для системы, рассмотренной в данной статье, нам хватит тарифа за 25$ в месяц. Заводим приватный репозиторий, добавляем существующих пользователей githab к организации (или заводим новых пользователей) — это все делается очень прозрачно и удобно, поэтому не будем подробно заостряться на этом моменте.

После того, как корпоративный приватный репозиторий заведен, нам нужно сделать первый коммит в него.

Заходим по ssh на наш сервер под пользователем с правами на запись в папки сайтов, переходим в директорию, в которой мы намерены инициировать репозиторий.

Репозиторий можно инициировать непосредственно в папке сайта (тогда важно не забыть потом защитить папку .git в файле .htaccess от скачивания), а можно инициировать его в наддиректории (вариант, когда файлы каждого сайта лежат не сразу в директории www или директории dev, а в подкатологе, к примеру, dev/httpfiles, www/httpfiles А репозитории мы инициируем соответственно в директориях www и dev. Если сервер настраивается с нуля или если админу не лень перепрописать виртуальные хосты— этот вариант предпочтительнее).

Перед тем, как инициировать репозиторий для основного сайта, необходимо определиться, какие папки и файлы необходимо включать в репозиторий, а какие — нет — сформировать файл .gitignore.

Пример (упрощенный) файла .gitignore для 1С-Битрикс для случая, когда репозиторий инициируется в директории сайта:

/bitrix/backup
/bitrix/cache
/bitrix/crontab
/bitrix/managed_cache
/bitrix/managed_flags
/bitrix/modules/*.log
/bitrix/php_interface/crontab
/bitrix/php_interface/dbconn.php
/bitrix/stack_cache
/logs
/upload
/.gitignore
/.htaccess
/urlrewrite.php
/*.log
/*.sql
/*.txt
/*.xml
/*.dt

То есть мы не будем контролировать изменения в папке бекапов (/bitrix/backup), папках кеша (/bitrix/cache, /bitrix/managed_cache, /bitrix/managed_flags, /bitrix/stack_cache), папках с заданиями крону (/bitrix/crontab), папке с логами (/logs), папке с загрузками (/upload).
Папку с загрузками /upload на всех девелоперских копиях сайта, расположенных на одном с ним сервере, имеет смысл делать симлинком на папку /upload продакшен-сайта.

Символическую ссылку в директории /dev/ — корневой директории девелоперского сайта создаем командой

ln -s /path/to/www/upload

К слову о символических ссылках. При конфигурировании многосайтовой системы на одном ядре 1С-Битрикс по 2му типу, папку bitrix мы так же должны будем исключить из основного репозитория. Потому что физически эта директория будет существовать только на одном сайте системы, а на других — будут символические ссылки на нее. Но так как контролировать изменения файлов этой папки все равно нужно, целесообразно будет завести для нее отдельный репозиторий.

Файл /bitrix/php_interface/dbconn.php содержит индивидуальные для каждого виртуального хоста настройки (в частности настройки соединения с БД), поэтому этот файл мы добавляем в исключения git.

Файл /urlrewrite.php — это файл с правилами обработки ЧПУ адресов Битрикс — он может быть перезаписан (сортируется внутри) самим движком, поэтому исключим и его.

Файлы .gitignore и .htaccess тоже должны лежать в исключениях. В исключения так же стоит добавить файлы логов, текстовые файлы, xml-файлы – все то, что не относится непосредственно к программному коду.

После того, как мы определились с содержимым .gitignore и создали файл .gitignore в директории будущего репозитория можно инициировать репозиторий для продакшен-сайта. Для этого нам сначала необходимо позаботиться об авторизации нашего серверного ssh-пользователя на githab — сгенерировать для него ключ.

Выполняем команду

ssh-keygen -t rsa -C "bitrix@имя.сайта"

email можно вписать любой, но с email вида bitrix@имя.сайта легче идентифицировать ключ на гитхабе.

Переходим на github.com/settings/ssh и добавляем новый ключ — данные самого ключа берём из файла /path/to/.ssh/id_rsa.pub

Проверяем подключение:

ssh-T git@github.com

Инициируем репозиторий в директории основного сайта (или в наддиректории):
переходим в /path/to/www/ и выполняем команды:

git add README.md
git commit -m "first commit"
git remote add origin git@github.com:организация/имя_репо.git
git push -u origin master

После того, как репозиторий для основного сайта инициирован, зальем все файлы проекта в репозиторий гитхаб:

git add . git commit -m “second commit” git push

Теперь клонируем репозиторий в директорию девелоперского сайта:

git clone git@github.com:организация/имя_репо.git dev

После этого в директории девелоперского сайта создадим символическую ссылку на папку upload как было описано выше. Затем стандартными средства Битрикс сделаем бекап БД основного сайта, и развернем его на девелоперском — файл, хранящий подключение к БД при этом создастся для дев сайта автоматически.

Теперь аналогичным образом можно создать клоны репозитория на локальных машинах разработчиков. Для этого им необходимо поставить любой комплект ПО git на свою локальную машину (командная Git строка идет в любом комплекте), запустить командную строку, сгенерировать ключ, добавить его на гитхаб, клонировать репозиторий в директорию виртуального хоста на локальной машине, а папку upload просто слить с основного сайта, накатить дамп БД с основного сайта.

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

P/S: с некоторых пор я предпочитаю гитхабу битбукет
Страницы: 1 | 2 | След.