показать полностью
Пользователь 72017  -> Всем
2 Октябрь, 2019 18:19
Компонент. Предупреждение о файлах cookie на сайте
С мая 2018 года действуют общие правила по защите персональных данных The EU General Data Protection Regulation (GDPR). Цель GDPR — обеспечить безопасность персональных данных граждан ЕС, вне зависимости от их физического месторасположения.
С введением GDPR ужесточается ответственность за нарушение правил обработки персональных данных: штрафы достигают 20 миллионов евро или 4% годового глобального дохода компании.

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

Clip2net_191002181121.png


Подключить компонент лучше в подвале вашего шаблона. Код подключения:  
$APPLICATION->IncludeComponent(
"cookie.notification",
".default",
array(
"COOKIE_NAME" => "COOKIE_ARGEE",
"COMPONENT_TEMPLATE" => ".default",
"COOKIE_TEXT" => "Продолжая работу с site.ru, вы подтверждаете использование сайтом cookies вашего браузера с целью улучшить предложения и сервис на основе ваших предпочтений и интересов.",
"COOKIE_AGREE_LINK" => "/company/cookie_notification/"
),
false
);
COOKIE_NAME - Имя переменной в которой хранится флаг согласия.
COOKIE_TEXT - Текст баннера
COOKIE_AGREE_LINK - Ссылка на соглашение, если оставить пустым, на баннере  не будет выводиться кнопка "Узнать больше".



Как подключить?

1. Распаковать архив.
2. Расположить папку cookie.notification  в разделе   local/components/   (Почему Local?)
3. Подключить компонент в шаблоне сайта, предварительно изменив текст.
4. Поставить лайк автору статьи  ;)



cookie.notification.zip (5.68 КБ)
Долгополов Игорь
Удобно, но есть несколько пожеланий/замечаний, поскольку пришлось немного доработать под себя.

1. Не вижу смысла текст соглашения выносить в параметры компонента. Лучше в lang файлы шаблона. Поскольку на разных языковых версиях формулировки могут меняться
2. Аналогично в lang файлы вынести и остальные фразы
3. Убрать js из шаблона в script.js
4. А вот время жизни куки - как раз было бы неплохо вынести в параметры компонента

А так идея простая и удобная!
1 Ещё
Волков Андрей
Спасибо, маленький косячок - F5 после нажатия "понятно" опять открывается модальное окно (для незалогиненного пользователя), второй F5 и исчезает, как поправить?
0 Ещё
показать полностью
Пользователь 72017  -> Всем
4 Июль, 2018 23:02
Расширенный обмен с 1С-Битрикс или "ленивая" выгрузка любых реквизитов заказа на сайт

Столкнулся с проблемой выгрузки реквизитов из заказа. Перечитал подобные обращения на форуме, но универсального механизма так и не нашел. Вариантов выгрузки масса: начиная от создания произвольного плана обмена в 1с, регистрации изменений и выгрузке данных в формате csv на сайт, заканчивая полной переработкой обмена.

risovach.ru _2_.jpg

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


Вот тут и пришла идея, а что если модулю обмена в 1С, подсунуть документ и сказать, что это не документ, а справочник, и тогда система сама все сделает. В итоге получилось расширение для 1С (для справки, это внешняя доработка, которая не требует обновления базы, а подключается как внешнее дополнение к модулю обмена от Битрикс). Модуль добавляет в список выбора  документы, для которых включена регистрация в плане обмена.
Список документов:

  • Заказ клиента

  • Реализация товаров и услуг

  • Приходный кассовый ордер

  • Операция по платежной карте

  • Поступление безналичных денежных средств

В рабочей  базе это выглядит так:

VygruzkaDokumenta.png

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

SpisokZakazovVHLBloke.png  

Но связать выгруженный заказ из 1С с заказом на сайте оказалось не просто, общий реквизит Б_Идентификатор несет в себе ID заказа, но не является прямым реквизитом объекта и потому не доступен для выбора. В расширении добавил возможность выгружать общие реквизиты как для документов, так и для справочников.

SpisokObshchikhRekvizitovObekta.png

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

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

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

ProizvolnyyRekvizit.png  

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

// Параметр, возвращающий результат [Результат]
//
// Параметр на данные    [СсылкаНаОбъект]

//ПРОСТЕНЬКИЙ ПРИМЕР.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказКлиентаТовары.Ссылка КАК Ссылка,
| СУММА(1) КАК КоличествоСтрок
|ПОМЕСТИТЬ втКоличествоСтрокЗаказа
|ИЗ
| Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
|ГДЕ
| ЗаказКлиентаТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ЗаказКлиентаТовары.Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗаказКлиентаТовары.Ссылка КАК Ссылка,
| СУММА(1) КАК КоличествоОтмененныхСтрок,
| МАКСИМУМ(ЗаказКлиентаТовары.ПричинаОтмены) КАК ПричинаОтмены
|ПОМЕСТИТЬ втОтмененныеСтроки
|ИЗ
| Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
|ГДЕ
| ЗаказКлиентаТовары.Ссылка = &Ссылка
| И ЗаказКлиентаТовары.Отменено = ИСТИНА
|
|СГРУППИРОВАТЬ ПО
| ЗаказКлиентаТовары.Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втКоличествоСтрокЗаказа.Ссылка КАК Ссылка,
| ВЫБОР
| КОГДА ЕСТЬNULL(втКоличествоСтрокЗаказа.КоличествоСтрок, 0) <> 0
| И ЕСТЬNULL(втКоличествоСтрокЗаказа.КоличествоСтрок, 0) = ЕСТЬNULL(втОтмененныеСтроки.КоличествоОтмененныхСтрок, 0)
| И ЕСТЬNULL(втОтмененныеСтроки.КоличествоОтмененныхСтрок, 0) <> 0
| ТОГДА втОтмененныеСтроки.ПричинаОтмены
| КОНЕЦ КАК ПричинаОтмены
|ИЗ
| втКоличествоСтрокЗаказа КАК втКоличествоСтрокЗаказа
| ЛЕВОЕ СОЕДИНЕНИЕ втОтмененныеСтроки КАК втОтмененныеСтроки
| ПО втКоличествоСтрокЗаказа.Ссылка = втОтмененныеСтроки.Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|УНИЧТОЖИТЬ втКоличествоСтрокЗаказа
|;
|
|////////////////////////////////////////////////////////////////////////////////
|УНИЧТОЖИТЬ втОтмененныеСтроки";

Запрос.УстановитьПараметр("Ссылка", [СсылкаНаОбъект]);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
[Результат] = ВыборкаДетальныеЗаписи.ПричинаОтмены;
КонецЦикла;

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

  1. Выгружать документы в HL блоки

  2. Импортировать общие реквизиты

  3. Передавать  динамические (собирательные) реквизиты с произвольным алгоритмом

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

P.S. Тестировал на конфигурации Управление торговлей, редакция 11 (11.4.2.109) Платформа:  1С:Предприятие 8.3 (8.3.10.2650)



РасширениеВыгрузкаДокументовБитрикс_1.2.1.cfe (36.39 КБ)
Фролов Алексей
А можно ли выгрузить адрес сайта перевозчика, указанного в заказе клиента в разделе "доставка"?
0 Ещё
Фролов Алексей
Вот бы ещё алгоритм для него. А то я до этого обращался в две компании по доработкам и обе не смогли помочь с алгоритмом выгрузки номера отправления, который в итоге Вы сделали Михаил, за что Вам огромное спасибо.
0 Ещё
показать полностью
Пользователь 72017  -> Всем
25 Июль, 2013 1:34
Результат в PDF


Здравствуйте! В данной статье мы рассмотрим автоматическую генерацию PDF документа средствами PHP. Реализуем возможность сохранять любую статью на сайте в PDF формате. Данный функционал будем разворачивать на CMS 1c-Bitrix. Чем больше изучаю эту платформу, тем больше убеждаюсь в качестве её разработки.

Итак, общий алгоритм будет следующим: при сохранении, ипдейте элемента в инф. блоке, создается/обновляется PDF документ. Что бы ни изобретать велосипед, для создания PDF файла, будем использовать библиотеку mPDF (http://mpdf1.com/) . На момент написания статьи, последний актуальный релиз mPDF v5.7. Качаем архив, разархивируем и заливаем на сервер (в корень сайта).

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

Функция генерации файла (обработчик события):
function IBlockAfterSave($arFields)
{
   require($_SERVER["DOCUMENT_ROOT"]."/MPDF57/mpdf.php");
   if(!CModule::IncludeModule("iblock"))
   return;

   $res = CIBlockElement::GetByID($arFields['ID']);

   if($ar_res = $res->GetNext()){
      $HTML = "
      <div class=\"post-pdf\">
         <h1>$ar_res[NAME]</h1>
         <div class=\"post-pdf-text\">$ar_res[DETAIL_TEXT]</div>
      </div>";

      $HTML = iconv('cp1251', 'utf-8', $HTML);
      $PDF_NAME = $arFields['ID'].".PDF";
      $BE_DIR = $_SERVER["DOCUMENT_ROOT"]."/".COption::GetOptionString("main", "upload_dir")."/pdf/";
      $mpdf=new mPDF();
      $mpdf->SetHeader($ar_res["DATE_CREATE"].'|{PAGENO}|Блог WEB программиста');
      $mpdf->SetFooter('|{PAGENO} | http://'.COption::GetOptionString("main", "server_name").$ar_res["DETAIL_PAGE_URL"]);
      $mpdf->WriteHTML($HTML);
      $mpdf->Output($BE_DIR.$PDF_NAME,"F");
   }

}
 

Регистрируем обработчики в файле init.php


<?php
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "IBlockAfterSave");

AddEventHandler("iblock", "OnAfterIBlockElementAdd", "IBlockAfterSave");
?>
 

Теперь при создании или апдейте элемента будет создаваться или обновляться PDF файл с текстом статьи. В данном примере текст документа генерируется из названия и детального описания элемента. Названием файла выступает его уникальный ID.

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


<?
AddEventHandler("iblock", "OnBeforeIBlockElementDelete", "IBlockBeforeDel");

 
function IBlockBeforeDel($ID)

{

        if(file_exists($_SERVER["DOCUMENT_ROOT"]."/".COption::GetOptionString("main", "upload_dir")."/pdf/".$ID.".PDF"))

                unlink($_SERVER["DOCUMENT_ROOT"]."/".COption::GetOptionString("main", "upload_dir")."/pdf/".$ID.".PDF");

}
?>
 


Далее в шаблон компонента вывода элементов из инф блока можно подключить проверку существования PDF версии и вывод ссылки на файл.


P.S. сильно не пинать, первая статья :)  
Фото:
Груздев Александр
Груздев Александр, Что и требовалось доказать
[Mpdf\MpdfException] E_ERROR Mpdf cannot function properly with mbstring.func_overload enabled (0)
0 Ещё
Резников Артемий
Груздев Александр, Мы решили эту проблему просто. Для директории со скриптом который генерит pdf установили значение mbstring.func_overload=0
А остальной сайт работает с mbstring.func_overload=2
:)))
0 Ещё
Егоров Сергей
а как контролируется размер текста на странице ? размер шрифта ?
0 Ещё
показать полностью
Пользователь 72017  -> Всем
25 Январь, 2016 1:56
Получить данные контрагента по ИНН. Используем SOAP сервис 1С
У 1С есть отличный сервис - получение данных контрагента из базы ЕГРЮЛ, библиотеки для работы с сервисом доступны в БСП. Правда есть одна особенность, доступ к сервису открыт только для тех у кого есть подписка ИТС.
Для тех у кого есть подписка ИТС, возможно пригодится класс для работы с SOAP сервисом от 1С. Состав приложенного архива:
  • getcontregent - компонент (для проверки)
  • its_contragent.php - класс для работы с сервисом
  • get_info_from_its.php - скрипт для ajax запросов
Установка
Скопируйте файл its_contragent.php в папку php_interface и подключите в файле init.php. Для правильной работы компонента расположите файл get_info_from_its.php в папке bitrix/ajax/, предварительно отредактировав файл (на 56 строке  укажите свои данные доступа к users.v8.1c.ru ).

Пример работы класса можно посмотреть на демо странице или на видео:

Contragent.zip (6.38 КБ)
Фатхуллин Рустам
Красава!  
1 Ещё
Щербак Михаил
Спасибо, рад что кому-то пригодилась разработка   :)
1 Ещё
Колосовский Ян
Добрый день. Эта разработка еще актуальна?
А то на вашей демо странице ввел наш инн и в ответ получил: Array Array Array
0 Ещё
показать полностью
Пользователь 72017  -> Всем
19 Сентябрь, 2014 18:45
Создание группы неавторизованные пользователи и использование её в таргетинге рекламного модуля
В сегодняшней заметке  пойдет речь о маленьком хаке для рекламного модуля. Итак, представьте, у Вас на сайте есть баннер и вы хотите его показывать только неавторизованным пользователям. Можно залезть в шаблон баннера и прописать условие вида:

if(!$USER->IsAuthorized()){  
       // показываем баннер 
} 


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

Создаем группу Неавторизованные пользователи, данная группа будет динамической, такой же как группа с ID 2 Все пользователи (в том числе неавторизованные) но состав такой группы мы обозначим сами, через события. После создания группы, заходим в файл init.php и прописываем там следующий код:



AddEventHandler("main", "OnBeforeProlog", "MyOnBeforePrologHandler", 50);

function MyOnBeforePrologHandler()
{
   global $USER;
   if(!$USER->IsAuthorized()){      
      if(!isset($_SESSION["SESS_AUTH"]["GROUPS"][0])){
         $_SESSION["SESS_AUTH"]["GROUPS"][] = 2;
         $_SESSION["SESS_AUTH"]["GROUPS"][] = 116;
      }

   }

} 


Скрипт на событии OnBeforeProlog будет переопределять массив $_SESSION["SESS_AUTH"]["GROUPS"] c которого считываются группы пользователя (116 ID группы Неавторизованные пользователи). Благодаря созданной группе, мы теперь можем задать условие, что баннер будет показываться только неавторизованным пользователям.

Такой баннер будет показан только неавторизованным пользователям. Было бы здорово, если бы разработчики Bitrix добавили события в функцию CAdvBanner::GetRandom($TYPE_SID) Событие позволило мы накладывать дополнительные условия на выборку. К примеру я хочу ввести ограничение: 1 показ баннера одному пользователю в сутки, данный механизм можно реализовать с помощью событий и дополнительной функции, которая будет фиксировать показ баннера в COOKIE браузера.
Зайцев Артемий
А для добавления пользователя в группу "на лету" используйте $USER->SetUserGroupArray(116), менять параметры в сессии жестоко как-то.
1 Ещё
Зайцев Артемий
Точнее:
global $USER; 
$USER->SetUserGroupArray( array(2,116) ); 
2 Ещё
Щербак Михаил
Тоже неплохое решение :)
0 Ещё

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