Восстановление пароля администратора в 1С- Битрикс.

1C

Как быстро восстановить пароль администратора в 1С- Битрикс?
-Создаем в блокноте файл, с произвольным названием, например pass.php со следующим содержанием:

<?
 require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
 global $USER;
 $USER->Authorize(1);
 LocalRedirect(“/bitrix/admin/”);
 ?>

Восстановление пароля администратора в 1С- Битрикс.

-Загружаем этот файл по ftp, в корень сайта.
-Запускаем в интернет браузере, этот скрипт, к примеру http://yoursite.ru/pass.php
-Получаем доступ к панели управления 1С- Битрикс, где меням пароль администратора, на нужный.
-После операции, по смене пароля не забудьте удалить файл сброса пароля bitrix!!!

Второй способ сброса пароля администратора Битрикс.
Можно сбросить пароль администратора битрикс, выполнив запрос к базе mysql:
UPDATE `b_user` SET `PASSWORD` = MD5('новый пароль') WHERE `ID`=1;

Добавлено: 08 Мая 2018 18:06:43 Добавил: Андрей Ковальчук

Простая система комментирования с использованием AJAX

1C

В данном уроке мы создадим простую систему комментариев с использованием AJAX. Система имеет интеграцию с gravatar.com и демонстрирует, как устанавливать эффективное взаимодействие между jQuery и PHP/MySQL с помощью JSON.

Шаг 1 – XHTML

Сначала посмотрим на разметку комментария. Данный код генерируется PHP с классом Comment.
demo.php

 	<div class="comment">
 	<div class="avatar">
 	<a href="http://tutorialzine.com/">
 	<img src="http://www.gravatar.com/avatar/112fdf7a8fe3609e7af2cd3873b5c6bd?size=50&default=http%3A%2F%2Fdemo.tutorialzine.com%2F2010%2F06%2Fsimple-ajax-commenting-system%2Fimg%2Fdefault_avatar.gif">
 	</a>
 	</div>
 	<div class="name"><a href="http://tutorialzine.com/">Имя пользователя</a></div>
 	<div title="Added at 06:40 on 30 Jun 2010" class="date">30 Jun 2010</div>
 	<p>Текст комментария</p>
 	</div>

div avatar содержит ссылку (если пользователь ввел правильный URL при размещении комментария) и изображение аватара, которое мы получаем с gravatar.com. Мы вернемся к формированию разметки на шаге PHP. В завершении следуют div name div time и текст комментария.

Другим важным элементом в XHTML является форма комментария. Она отправляется с помощью POST. Все поля, кроме URL, должны быть заполнены.
demo.php
 	<div id="addCommentContainer">
 	<p>Добавить комментарий</p>
 	<form id="addCommentForm" method="post" action="">
 	<div>
 	<label for="name">Имя</label>
	<input type="text" name="name" id="name" />
 	<label for="email">Email</label>
 	<input type="text" name="email" id="email" />
 	<label for="url">Вебсайт (не обязательно)</label>
 	<input type="text" name="url" id="url" />
 	<label for="body">Содержание комментария</label>
 	<textarea name="body" id="body" cols="20" rows="5"></textarea>
 	<input type="submit" id="submit" value="Отправить" />
 	</div>
 	</form>
 	</div>

Форма отправляется с помощью AJAX. Проверка выполняется в фоновом режиме в submit.php. Каждое поле имеет соответствующий элемент label, с установленным атрибутом for.

Простая система комментариев с использованием AJAX

Простая система комментариев с использованием AJAX
Шаг 2 – PHP

PHP обрабатывает коммуникацию с базой данных MySQL и генерирует разметку для комментария. Он также получает окончание запроса AJAX и вставляет данные комментария в таблицу comments.
demo.php
 	/*
 	/   Выбираем все комментарии и наполняем массив $comments объектами
 	*/
 	 
 	$comments = array();
 	$result = mysql_query("SELECT * FROM comments ORDER BY id ASC");
 	 
 	while($row = mysql_fetch_assoc($result))
 	{
 	    $comments[] = new Comment($row);
 	}

Запрос MySQL выбирает все записи из таблицы и заполняет массив $comments объектами класса comment. Данный массив выводится далее при выполнении скрипта.
demo.php
 	/*
 	/   Вывод комментариев один за другим:
 	*/
 	 
 	foreach($comments as $c){
 	    echo $c->markup();
 	}

Каждый комментарий имеет метод markup(), который генерирует правильный HTML код, готовый для вывода на страницу. Ниже приведены определения класса и метода.

Класс получает строку из базы данных (получаемую с помощью mysql_fetch_assoc() ) и сохраняет ее в переменной $data. Она доступна только методу класса.
comment.class.php – Часть 1
 	class Comment
 	{
 	    private $data = array();
 	     
 	    public function __construct($row)
 	    {
 	        /*
	        /   Конструктор
 	        */
 	         
 	        $this->data = $row;
 	    }
 	     
 	    public function markup()
 	    {
	        /*
 	        /   Данный метод выводит разметку XHTML для комментария
 	        */
 	         
 	        // Устанавливаем псевдоним, чтобы не писать каждый раз $this->data:
 	        $d = &$this->data;
 	         
 	        $link_open = &apos;&apos;;
 	        $link_close = &apos;&apos;;
 	         
 	        if($d[&apos;url&apos;]){
 	             
 	            // Если был введн URL при добавлении комментария,
 	            // определяем открывающий и закрывающий теги ссылки
 	             
 	            $link_open = &apos;<a href="&apos;.$d[&apos;url&apos;].&apos;">&apos;;
	            $link_close =  &apos;</a>&apos;;
 	        }
 	         
 	        // Преобразуем время в формат UNIX:
 	        $d[&apos;dt&apos;] = strtotime($d[&apos;dt&apos;]);
 	         
 	        // Нужно для установки изображения по умолчанию:
 	        $url = &apos;http://&apos;.dirname($_SERVER[&apos;SERVER_NAME&apos;].$_SERVER["REQUEST_URI"]).&apos;/img/default_avatar.gif&apos;;
 	         
 	        return &apos;
 	<div class="comment">
 	<div class="avatar">
 	                    &apos;.$link_open.&apos;
 	<img src="http://www.gravatar.com/avatar/&apos;.md5($d[&apos;email&apos;]).&apos;?size=50&default=&apos;.urlencode($url).&apos;" />
 	                    &apos;.$link_close.&apos;
 	</div>
 	<div class="name">&apos;.$link_open.$d[&apos;name&apos;].$link_close.&apos;</div>
 	<div class="date" title="Added at &apos;.date(&apos;H:i \o\n d M Y&apos;,$d[&apos;dt&apos;]).&apos;">&apos;.date(&apos;d M Y&apos;,$d[&apos;dt&apos;]).&apos;</div>
 	<p>&apos;.$d[&apos;body&apos;].&apos;</p>
 	</div>
 	        &apos;;
 	    }

Скрипт использует gravatar для представления аватара в комментариях. Gravatar - это очень полезный сервис, который устанавливает соответствие аватара с email адресом. Изображение аватара может быть легко получено с помощью передачи кодированного функцией md5() вашего email адреса на gravatar.com.

Скрипт определяет адрес URL, на котором выполняется, и определяет точный адрес изображения default_avatar.gif. Данное изображение передается на параллельно с хэшем md5, и если никакого аватар не было найдено для переданного email адреса, то будет выведено альтернативное изображение.
comment.class.php – Часть 2
 	public static function validate(&$arr)
 	{
 	    /*
 	    /   Данный метод используется для проверки данных отправляемых через AJAX.
 	    /
 	    /   Он возвращает true/false в зависимости от правильности данных, и наполняет
	    /   массив $arr, который преается как параметр либо данными либо сообщением об ошибке.
	    */
 	     
 	    $errors = array();
 	    $data   = array();
 	     
 	    // Используем функцию filter_input, введенную в PHP 5.2.0
 	     
 	    if(!($data[&apos;email&apos;] = filter_input(INPUT_POST,&apos;email&apos;,FILTER_VALIDATE_EMAIL)))
 	    {
 	        $errors[&apos;email&apos;] = &apos;Пожалуйста, введите правильный Email.&apos;;
 	    }
 	     
 	    if(!($data[&apos;url&apos;] = filter_input(INPUT_POST,&apos;url&apos;,FILTER_VALIDATE_URL)))
 	    {
 	        // Если в поле URL был введн неправильный URL,
 	        // действуем так, как будто URL не был введен:
 	         
 	        $url = &apos;&apos;;
 	    }
 	     
 	    // Используем фильтр с возвратной функцией:
 	     
 	    if(!($data[&apos;body&apos;] = filter_input(INPUT_POST,&apos;body&apos;,FILTER_CALLBACK,array(&apos;options&apos;=>&apos;Comment::validate_text&apos;))))
 	    {
 	        $errors[&apos;body&apos;] = &apos;Пожалуйста, введите текст комментария.&apos;;
 	    }
 	     
 	    if(!($data[&apos;name&apos;] = filter_input(INPUT_POST,&apos;name&apos;,FILTER_CALLBACK,array(&apos;options&apos;=>&apos;Comment::validate_text&apos;))))
 	    {
 	        $errors[&apos;name&apos;] = &apos;Пожалуйста, введите имя.&apos;;
 	    }
 	     
 	    if(!empty($errors)){
 	         
 	        // Если есть ошибки, копируем массив $errors в $arr:
 	         
 	        $arr = $errors;
 	        return false;
 	    }
 	     
 	    // Если данные введены правильно, подчищаем данные и копируем их в $arr:
 	     
 	    foreach($data as $k=>$v){
 	        $arr[$k] = mysql_real_escape_string($v);
 	    }
 	     
 	    // email дожен быть в нижнем регистре:
 	     
 	    $arr[&apos;email&apos;] = strtolower(trim($arr[&apos;email&apos;]));
 	     
	    return true;
 	     
 	}

Метод validate() (также часть класса) определен как static. Это означает, что его можно вызвать непосредственно с помощью конструкции Comment::validate(), без создания объекта класса. Данный метод проверяет данные, которые передаются через AJAX.

Метод использует новую функцию фильтра, которая стала доступна в PHP 5.2.0. Таким образом мы можен легко проверить и отфильтровать данные, которые передаются скрипту. Например, filter_input(INPUT_POST,’url’,FILTER_VALIDATE_URL) означает, что мы проверяем, является ли $_POST[&apos;url&apos;] правильным адресом URL. Если это так, то функция возвращает значение переменной, в другом случае она возвращает значение false.

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

Также возможно задать функцию, которая будет проводить дополнительные модификации данных.
comment.class.php – Часть 3
 	private static function validate_text($str)
 	{
 	    /*
 	    /   Данный метод используется как FILTER_CALLBACK
 	    */
 	     
 	    if(mb_strlen($str,&apos;utf8&apos;)<1)
 	        return false;
 	     
 	    // Кодируем все специальные символы html (<, >, ", & .. etc) и преобразуем
 	    // символ новой строки в тег <br>:
 	     
	    $str = nl2br(htmlspecialchars($str));
 	     
 	    // Удаляем все оставщиеся символы новой строки
 	    $str = str_replace(array(chr(10),chr(13)),&apos;&apos;,$str);
 	     
 	    return $str;
 	}

Последний метод validate_text передаётся в качестве возвратной функции в два вызова filter_input. Он преобразует все специальные символы HTML, что эффективно блокирует атаки XSS. Также он заменяет символы новой строки тегами <br />.
submit.php
 	/*
 	/   Данный массив будет наполняться либо данными,
 	/   которые передаются в скрипт,
 	/   либо сообщениями об ошибке.
 	/*/
 	 
 	$arr = array();
 	$validates = Comment::validate($arr);
 	 
 	if($validates)
 	{
 	    /* Все в порядке, вставляем данные в базу: */
 	     
 	    mysql_query("   INSERT INTO comments(name,url,email,body)
 	                    VALUES (
 	                        &apos;".$arr[&apos;name&apos;]."&apos;,
 	                        &apos;".$arr[&apos;url&apos;]."&apos;,
 	                        &apos;".$arr[&apos;email&apos;]."&apos;,
 	                        &apos;".$arr[&apos;body&apos;]."&apos;
 	                    )");
 	     
 	    $arr[&apos;dt&apos;] = date(&apos;r&apos;,time());
 	    $arr[&apos;id&apos;] = mysql_insert_id();
 	     
 	    /*
 	    /   Данные в $arr подготовлены для запроса mysql,
 	    /   но нам нужно делать вывод на экран, поэтому
 	    /   готовим все элементы в массиве:
 	    /*/
 	     
 	    $arr = array_map(&apos;stripslashes&apos;,$arr);
 	     
 	    $insertedComment = new Comment($arr);
 	 
 	    /* Вывод разметки только-что вставленного комментария: */
 	 
 	    echo json_encode(array(&apos;status&apos;=>1,&apos;html&apos;=>$insertedComment->markup()));
 	 
 	}
 	else
 	{
 	    /* Вывод сообщений об ошибке */
 	    echo &apos;{"status":0,"errors":&apos;.json_encode($arr).&apos;}&apos;;
 	}

submit.php получает комментарий из данных через запрос AJAX. Проверяет его и выводит объект JSON, в котором содержится либо разметка XHTML с вставленным комментарием, либо список ошибок. jQuery использует свойство status для определения того, что нужно выводить - либо сообщение об ошибках, либо добавлять разметку комментария к странице.

Ниже приводятся два примера.
Успешный ответ
	{
 	    "status": 1,
 	    "html": "Html Code Of The Comment Comes Here..."
 	}


Свойство html содержит код комментария.
Ответ об ошибке
 	{
 	    "status": 0,
 	    "errors": {
 	        "email": "Please enter a valid Email.",
 	        "body": "Please enter a comment body.",
 	        "name": "Please enter a name."
 	    }
 	}

При наличии ошибки jQuery проходит циклом по объекту ошибок и выводит сообщения рядом с полями, в которых есть ошибки.

Чудесная форма запроса CSS3 & jQuery

Чудесная форма запроса CSS3 & jQuery
Шаг 3 – CSS

Теперь, когда разметка правильно генерируется и отображается на странице, мы можем перейти к заданию стилей.
styles.css – Часть 1
 	.comment,
 	#addCommentContainer{
 	     
 	    /* Стиль для комментариев  */
 	     
 	    padding:12px;
 	    width:400px;
 	    position:relative;
 	    background-color:#fcfcfc;
 	    border:1px solid white;
 	    color:#888;
	    margin-bottom:25px;
 	     
	    /* Скругленные углы и тени CSS3 */
 	     
 	    -moz-border-radius:10px;
 	    -webkit-border-radius:10px;
 	    border-radius:10px;
 	 
 	    -moz-box-shadow:2px 2px 0 #c2c2c2;
 	    -webkit-box-shadow:2px 2px 0 #c2c2c2;
 	    box-shadow:2px 2px 0 #c2c2c2;
 	}
 	 
 	.comment .avatar{
 	 
 	    /*
 	    /   Аватар позиционируется абсолютно.
 	    /   Внешнее смещение для div комментария
 	    /*/
 	 
 	    height:50px;
 	    left:-70px;
 	    position:absolute;
 	    width:50px;
 	    background:url(&apos;img/default_avatar.gif&apos;) no-repeat #fcfcfc;
 	     
 	    /* Центрируем вертикально: */
 	     
 	    margin-top:-25px;
 	    top:50%;
 	 
 	    -moz-box-shadow:1px 1px 0 #c2c2c2;
 	    -webkit-box-shadow:1px 1px 0 #c2c2c2;
 	    box-shadow:1px 1px 0 #c2c2c2;
	}

div .comment и #addCommentContainer имеют одинаковый стиль. Используется несколько правил CSS3 для скругления углов и отражения теней.
styles.css – Часть 2
 	.comment .avatar img{
 	    display:block;
 	}
	 
 	.comment .name{
 	    font-size:20px;
 	    padding-bottom:10px;
 	    color:#ccc;
 	}
 	 
 	.comment .date{
 	    font-size:10px;
	    padding:6px 0;
 	    position:absolute;
 	    right:15px;
 	    top:10px;
 	    color:#bbb;
 	}
 	 
 	.comment p,
 	#addCommentContainer p{
 	    font-size:18px;
 	    line-height:1.5;
	    overflow-x:hidden;
 	}
 	 
 	#addCommentContainer input[type=text],
 	#addCommentContainer textarea{
 	 
 	    /* Стиль для ввода */
 	 
 	    display:block;
 	    border:1px solid #ccc;
 	    margin:5px 0 5px;
 	    padding:3px;
 	    font-size:12px;
	    color:#555;
 	    font-family:Arial, Helvetica, sans-serif;
 	}
 	 
	#addCommentContainer textarea{
 	    width:300px;
 	}
 	 
 	label{
 	    font-size:10px;
 	}
 	 
 	label span.error{
 	    color:red;
 	    position:relative;
 	    right:-10px;
 	}
 	 
 	#submit{
 	     
 	    /* Кнопка "Отправить" */
	     
	    background-color:#58B9EB;
 	    border:1px solid #40A2D4;
 	    color:#FFFFFF;
 	    cursor:pointer;
 	    font-family:&apos;Myriad Pro&apos;,Arial,Helvetica,sans-serif;
 	    font-size:14px;
 	    font-weight:bold;
 	    padding:4px;
 	    margin-top:5px;
 	 
 	    -moz-border-radius:4px;
 	    -webkit-border-radius:4px;
 	    border-radius:4px;
 	}
 	 
 	#submit:hover{
 	    background-color:#80cdf5;
 	    border-color:#52b1e2;
 	}

Во второй части мы задаем стили для комментариев и элементов формы. Отметим селектор input[type=text], который выделяет элементы в зависимости от атрибута type.
Шаг 4 – jQuery

Теперь перейдем к jQuery.
script.js
 	$(document).ready(function(){
 	    /* Следующий код выполняется только после загрузки DOM */
 	     
 	    /* Данный флаг предотвращает отправку нескольких комментариев: */
 	    var working = false;
	     
 	    /* Ловим событие отправки формы: */
 	    $(&apos;#addCommentForm&apos;).submit(function(e){
 	 
 	        e.preventDefault();
 	        if(working) return false;
 	         
 	        working = true;
 	        $(&apos;#submit&apos;).val(&apos;Working..&apos;);
 	        $(&apos;span.error&apos;).remove();
 	         
 	        /* Отправляем поля формы в submit.php: */
 	        $.post(&apos;submit.php&apos;,$(this).serialize(),function(msg){
 	 
 	            working = false;
 	            $(&apos;#submit&apos;).val(&apos;Submit&apos;);
 	             
 	            if(msg.status){
 	 
 	                /*
 	                /   Если вставка была успешной, добавляем комментарий
 	                /   ниже последнего на странице с эффектом slideDown
 	                /*/
 	 
 	                $(msg.html).hide().insertBefore(&apos;#addCommentContainer&apos;).slideDown();
 	                $(&apos;#body&apos;).val(&apos;&apos;);
 	            }
 	            else {
 	 
 	                /*
 	                /   Если есть ошибки, проходим циклом по объекту
 	                /   msg.errors и выводим их на страницу
 	                /*/
 	                 
 	                $.each(msg.errors,function(k,v){
 	                    $(&apos;label[for=&apos;+k+&apos;]&apos;).append(&apos;<span class="error">&apos;+v+&apos;</span>&apos;);
 	                });
 	            }
 	        },&apos;json&apos;);
 	 
 	    });
 	     
 	});

Мы используем вызов функции $(document).ready(), которая привязывает функцию к событию загрузка контента DOM. Переменная working действует как флаг, который сигнализирует о том, что запрос AJAX находится в работе (таким образом предотвращается дублирование одного и того же комментария).

В возвратной функции для запроса POST AJAX мы проверяем свойство status, чтобы определить, был ли успешно вставлен комментарий. Если да, мы добавляем полученную разметку на страницу после последнего комментария с анимацией slideDown.

Если были проблемы, то мы выводим сообщения об ошибках, добавляя span error к соответствующему элементу label (атрибут элемента label содержит id ввода, который имеет ошибку).

Готово!
Заключение

Чтобы запустить скрипт на вашем сервере нужно создать таблицу comments в вашей базе данных MySQL. Вы можете сделать это с помощью кода SQL из файла table.sql, который надо ввести на закладке SQL в phpMyAdmin. Затем нужно установить параметры соединения с базой данных MySQL в файле connect.php.

Добавлено: 30 Декабря 2014 22:53:55 Добавил: Андрей Ковальчук

Отправка сообщения на стену друга (wall.post)

1C

В этом уроке показано:
- как получить и отсортировать список друзей
- как разместить список друзей в элементе select
- как отправить сообщение на стену друга



code.js

$(document).ready(function(){
var friends_data; // отсортированный список друзей
 
    VK.init(function() {
    // выполняем запрос получения списка друзей
    VK.api("friends.get", {fields:"first_name,photo"}, function(data) {
        // узнаем количество друзей
        var fr = data.response.length;
        // сортируем друзей по имени (функция sFirstName описана ниже)
        friends_data = data.response.sort(sFirstName);
        // в value элемента будем записывать номер пользователя в массиве friends_data
        for(var i=0;i<fr;i++){
            $(&apos;#friends_list&apos;).append(&apos;<option value="&apos;+ i +&apos;">&apos;+ friends_data[i].first_name + &apos; &apos; + friends_data[i].last_name +&apos;</option>&apos;);            
        }
        $("#friends_list").change(function () {
            // узнаем какой элемент выбран в select
            selectVal = $(&apos;#friends_list option:selected&apos;).val();
            if (selectVal!=&apos;&apos;) { // если выбран друг
                // вытаскиваем из массива фотографию выбранного пользователя по номеру в массиве
                $(&apos;#user_info&apos;).html(&apos;<img src="&apos;+ friends_data[selectVal].photo +&apos;"/>&apos;);
            } else { // если выбрано "выберите друга"
                // очищаем блок с аватаркой
                $(&apos;#user_info&apos;).html(&apos;&apos;);
            }
        })
    });
    });
 
$(&apos;#send_btn&apos;).click(function() {
    if ($(&apos;#friends_list option:selected&apos;).val()!=&apos;&apos;) { // если выбран пользователь
        if ($(&apos;#message_tf&apos;).val()!=&apos;&apos;) { // если введено сообщение
            uid_to = friends_data[$(&apos;#friends_list option:selected&apos;).val()].uid; // id выбранного пользователя
            message_to = $(&apos;#message_tf&apos;).val();
            // отправляем запись на стену
            VK.api(&apos;wall.post&apos;,{owner_id:uid_to, message:message_to},function(data) {
                if (data.response) { // если получен ответ
                    alert(&apos;Сообщение отправлено! ID сообщения: &apos; + data.response.post_id);
                } else { // ошибка при отправке сообщения
                    alert(&apos;Ошибка! &apos; + data.error.error_code + &apos; &apos; + data.error.error_msg);
                }
            });
        } else {
            alert(&apos;Введите сообщение!&apos;);
        }
    } else {
        alert(&apos;Выберите пользователя!&apos;);
    }
    return false;
}); 
});
// функции сортировки
function sFirstName(a,b) {
    if (a.first_name > b.first_name)
        return 1;
    else if  (a.first_name < b.first_name)
        return -1;
    else
        return 0;
}

index.html
<html>
<head>
<script src="js/jquery-1.6.1.min.js" type="text/javascript"></script>
<script src="js/code.js" type="text/javascript"></script>
<link rel="stylesheet" href="css/style.css" type="text/css" />
<script src="http://vkontakte.ru/js/api/xd_connection.js?2" type="text/javascript"></script>
</head>
<body>
<table>
    <tr>
        <td>
            <select id="friends_list">
                <option value="">Выберите друга</option>
            </select>
        </td>
        <td rowspan="3">
            <div id="user_info"></div>
        </td>
    </tr>
    <tr>
        <td>
            Сообщение:<br />
            <textarea id="message_tf">Текст сообщения</textarea>
        </td>
    </tr>
    <tr>
        <td>
            <a href="#" id="send_btn">Отправить</a>
        </td>
    </tr>
</table>
</body>
</html>

style.css
body {
    padding:0;
    margin:0;
    font-family: tahoma, verdana, arial, sans-serif, Lucida Sans;
    font-size: 11px;
}
select,textarea {
    padding:0;
    margin:0;
}
table {
    border-collapse:0;
    padding:0;
    margin:0;
}
table td {
    vertical-align:top;
    font-family: tahoma, verdana, arial, sans-serif, Lucida Sans;
    font-size: 11px;
}
#message_tf {
    width:100%;
    height:50px;
    resize:none;
}


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

Добавлено: 30 Декабря 2014 20:49:45 Добавил: Андрей Ковальчук

1C+PHP+MySQL

1C

В современном мире люди используют Интернет не только для поиска информации, но и для приобретения каких либо товаров и услуг. Поэтому организации, например имеющие статус среднего бизнеса, стараются разместить свои прайс-листы в интернете или даже создать Интернет-магазин. Создать его не так-то просто. Если вы имеете «реальный» бизнес и используете определенную систему учета товаров (или услуг), нужно учитывать несколько немаловажных факторов:

Каждый уважающий себя Интернет-магазин должен показывать остаток товара на складе, а также не показывать тот товар, которого уже нет в наличии. (а может быть что товар есть на разных региональных складах)
Цены не должны расходиться с ценами в реальном магазине. Не учитывая доставку, хотя и это уже давно стало бесплатным практически везде.
Я привел только 2 факта, в действительности их может быть гораздо больше, всё зависит от того, какую цель вы ставите перед своим Интернет-проектом.

Многие организации для ведения учета товаров или оказанных услуг используют ПО «1С» и как показывает практика, большая часть организаций работает с версией 7.7, и не торопятся перейти на 8.х. так как это влечет за собой накладные расходы.

Для Реализации работы с WEB в 1С7.7 есть прекрасное решение - WEB-расширение, но оно работает только с Microsoft Internet Information Server (IIS). IIS используют не все хостинг – провайдеры, да и те кто использует вряд ли разрешат подключить свой сервер к чужой БД.

А держать «у себя» IIS сервер достаточно накладно для организаций среднего бизнеса (оборудование + интернет канал + лицензии ОС и ПО = увеличение стоимости товара).

Другое дело «свободное» ПО и ОС: Linux, Apache, PHP, MySQL. Эти четыре продукта использует большинство хостинг – провадеров, поэтому их использование как платформы для создания Интернет-проектов наиболее оптимально.

Как связать 1С 7.7 с MySQL? Можно использовать внешнюю компоненту MySQL,dll, но её использование не всегда возможно, особенно если ваш Веб-сервер находиться удаленно или вы покупаете хостинг у сторонней организации, так как не безопасно открывать доступ к БД из Интернета.

Для решения этой задачи я использовал технологию передачи данных через URL.

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

И сейчас я бы хотел поделиться с коллегами приобретенным опытом реализации это технологии.

Кратко о принципе:


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

Например, нам нужно передать остаток товара на складе: из 1С должен будет сформироваться url: http://www.server.com/script.php?good=201&count=302&date=2009-06-09, где:

http://www.server.com – адрес сервера
script.php – исполняющий скрипт
good=201 – переменная и код товара
count=302 – переменная и количество остатка
date=2009-06-09 – дата на которую передается остаток
причем для работы данной схемы достаточно лишь иметь доступ в Интернет с того компьютера на котором выполняется операция по передачи данных. (сервер БД нет необходимости подключать к Интернету)

Встреча с возможными ошибками:


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

1. Проблема передачи дробных чисел, а именно трудности, возникающие при использовании символа «точка» (.)

Если необходимо передать любое дробное число, то в 1С оно будет храниться виде 1.1. При передаче числа через url точка, отделяющая целую часть от дробной, вызывает ошибку, так как символ «точка» служит для разделения доменов. Следовательно, необходимо преобразовать эту самую «точку» в другой символ наиболее подходящий для этого. И этот символ - «запятая» (,). Для того чтобы осуществить это преобразование, я написал функцию, листинг которой приведен ниже:
Функция ЧислоURL(Стр) 
	Возврат СтрЗаменить(Строка(Стр),".",",");
КонецФункции

Эта функция возвращает строку в которой все символы «.» заменены на «,» в строковой переменной Стр. Применимо это не только к числам, но и к текстовым данным.

Теперь при передаче число 1.1 будет иметь формат 1,1. Далее при получении мы должны привести это число обратно в «привычный» вид, это можно сделать на стороне PHP-скрипта функцией strtr() . краткое её описание я привел ниже, полное можно найти здесь

Описание функции string strtr ( string $str , string $from , string $to ):

Эта функция возвращает строку str , в которой каждое вхождение любого символа из перечисленных в from заменено на соответствующий символ из строки to . (www.php.net)

Т.е. в нашем случае функция будет иметь вид strtr("1,1", ",", ".") и результатом её работы будет: 1.1

2. Проблема передачи даты. В 1С дата имеет вид «ДД.ММ.ГГГГ» например, 01.01.2009. При передаче такого вида данных будет вызвана такая же ошибка, как и при передаче числовых данных. Конечно, для решения и этой проблемы можно использовать указанную выше функцию ЧислоURL, но я решил пойти другим путём и конвертировал дату в формат MySQL, то есть «ГГГГ-ММ-ДД». Для этого я написал функцию МуДата, вот ее листинг:
Функция МуДата(Стр)  //дата в формате MySQL (ГГГГ-ММ-ДД)
	Возврат "" + ДатаГод(Стр) + "-" +ДатаМесяц(Стр) + "-" + ДатаЧисло(Стр);	
КонецФункции

Функция работает следующим образом – опять же выделяет из переменной Стр, Год, Месяц, Число и выстраивает их в формате ГГГГ-ММ-ДД, наиболее привычным при работе с MySQL.

Об ошибках все.

Подготовка 1С:


Теперь расскажу о том, как заставить 1С работать с WEB.

Для того, чтобы иметь возможность работать с протоколом HTTP в 1С, я использовал библиотеку V7+, которая поставляется фирмой 1С и служит для расширения возможностей 1С 7.7.

Для начала необходимо подключить внешнюю компоненту (подробнее здесь), используя функцию «ЗагрузитьВнешнююКомпоненту("v7plus.dll")». Далее необходимо создать объект addin.v7httpreader, для этого я использовал переменную НТТР. А для передачи и получения данных используется метод ПолучитьКакСтроку(адрес, СтрокаДляПриёма); который получает данные в переменную СтрокаДляПриёма с адреса указанного в переменной адрес. В целом все это будет выглядеть примерно так:
Процедура Сформировать()
 	ПЕРЕМ СтрокаДляПриёма;
	ЗагрузитьВнешнююКомпоненту("v7plus.dll");
	HTTP=СоздатьОбъект("addin.v7httpreader");
	адрес="http://www.google.ru";
	HTTP. ПолучитьКакСтроку (адрес, СтрокаДляПриёма);
	сообщить (СтрокаДляПриёма);
КонецПроцедуры

Выше указанная процедура выведет в окно сообщений HTML-код заглавной страницы сайта http://www.google.ru

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

Немного о PHP:


Теперь напишем PHP-скрипт, который просто будет выводить данные полученные методом GET. (ознакомиться с тем, как PHP получает данные можно здесь) Листинг такого скрипта:
 <?php
$text=$_GET['text']; // получаем значение переменной text 
print $text;
?>  

Назовем его test.php и поместим в корневую папку web-сервера. Далее для проверки работы скрипта введем в адресную строку браузера http://localhost/test.php?text=hello%20wolrd В том случае, если все сделано верно, на экране появиться страница с текстом hello world.

«Соединяем» 1С и PHP:


Далее создаем в 1С внешнюю обработку и вставим в её модуль следующий код:
Процедура Сформировать()
   	ПЕРЕМ СтрокаДляПриёма;
	ЗагрузитьВнешнююКомпоненту("v7plus.dll");
	HTTP=СоздатьОбъект("addin.v7httpreader");
	адрес="http://localhost/test.php?text="+текст;
	HTTP. ПолучитьКакСтроку(адрес, СтрокаДляПриёма);
	Сообщить(СтрокаДляПриёма);
КонецПроцедуры

Отличается она от алгоритма, который мы создавали выше лишь значением в переменной адрес.

И так в случае успешной работы 1С и РНР-скпипта в окне сообщений 1С мы увидим надпись hello world.

Теперь очевидно, что с помощью 1C можно передать данные PHP-скриптам, а они в свою очередь делают с ними все что необходимо, например, записывают их в БД.

Пример записи данных в БД:


Запись в БД MYSQL будет производиться средствами PHP, об этом сказано уже не мало. Поэтому чтобы не повторяться, опишу пример из собственной практики.

Для начала создадим обработку в 1С:

На форму положим поле ввода и присвоим ему идентификатор текст, далее немного переделаем процедуру описанную в разделом выше:
Процедура Сформировать()
   	ПЕРЕМ СтрокаДляПриёма;
	ЗагрузитьВнешнююКомпоненту("v7plus.dll");
	HTTP=СоздатьОбъект("addin.v7httpreader");
	адрес=адрес="http://localhost/test.php?text="+Стр;
	HTTP. ПолучитьКакСтроку(адрес, СтрокаДляПриёма);
	возврат(СтрокаДляПриёма);
КонецПроцедуры

Теперь необходимо создать БД в MySQL (как это сделать описано здесь). Создадим БД и присвоим ей имя TESTDB. Далее создадим таблицу с именем TEST:
CREATE TABLE `test` (
`id` INT NOT NULL AUTO_INCREMENT ,
`text` TEXT NOT NULL ,
PRIMARY KEY ( `id` ) 
);

Как видно из запроса, в таблице всего 2 поля:

id – уникальный номер сроки;
text – текстовое поле, куда будут помещаться данные из 1С.
Теперь необходимо написать PHP-скрипт, который и будет записывать данные из 1С в MySQL. Листинг данного скрипта приведен ниже:
<?php
$host='localhost'; //адрес сервера
$db='testdb'; //имя БД
$user='root'; // имя пользователя
$password=''; //пароль к БД
$link = mysql_connect($host, $user, $password); //установка соединения 
mysql_select_db($db, $link); //подключения в БД

$text=$_GET['text']; // получаем значение переменной text 

$query = "insert into test values (NULL, '$text')"; //генерируем запрос
mysql_query($query, $link); //отправляем запрос 
print mysql_error(); //сообщаем об ошибке  если ошибок не было то возвращает пустое значение. 

?>

Все готово! Теперь открываем Внешнюю обработку в 1С и пишем в поле ввода слово Hello! Нажимаем кнопку «Сформировать». Если все сделано правильно, то в созданной нами таблице появится запись со словом Hello! В противном случае, в окне сообщений 1С появится текст ошибки.

Заключение:


Весь тот опыт, которым я поделился в этой статье, можно использовать не только в Интернет-торговли, но и в корпоративных целях, например для того, чтобы:

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

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

Добавлено: 21 Сентября 2013 02:10:20 Добавил: Андрей Ковальчук

1С 7.7 Открытие окна в данном режиме недоступно!

1C

Данная ошибка возникает в 1С 7.7 если мы пытаемся выполнить метод «ОткрытьФорму» из формулы, которая находиться в реквизите диалога на форме.

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


Обойти это можно с помощью «ложного закрытия». В модуле создаем глобальную переменную
Перем НашаПеременная;

В процедуре которая выполняется при вводе даты пишем:
Процедура ПриВводеДаты()
	НашаПеременная = 1;
	Форма.Закрыть(0);
КонецПроцедуры

А само открытие формы выполняем уже из предопределенной процедуры ПриЗакрытии
Процедура ПриЗакрытии()
	Если НашаПеременная =1 Тогда
		ОткрытьФорму("Отчет",Контекст,КаталогИБ()+"ExtForms\ВнешнийОтчет.ert");
		НашаПеременная = 0;
		СтатусВозврата(0);
		Возврат;
	КонецЕсли;
КонецПроцедуры

Добавлено: 21 Сентября 2013 02:06:51 Добавил: Андрей Ковальчук

Как подключиться из 1С к MySQL

1C

Для начала скачиваем MySQL ODBC Driver-MyODBC 3.51 драйвера.
Вот код подключения из 1С (выставляем свою базу, имя пользователя и пароль)

conn = СоздатьОбъект("ADODB.Connection"); 
ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};SERVER="+"localhost"+";DATABASE="+"basename"+";UID="
+"username"+";PWD="+"password"+";OPTION="+3+";";
conn.open(ConnectionString);  
ТекстЗапроса="select * from mytable;" ;
rs=conn.execute(ТекстЗапроса) ;
сообщить(rs);  
Пока rs.EOF()=0 Цикл
    Сообщить(rs.fields(0).value); 
    Сообщить(rs.fields(1).value);
    Сообщить(rs.fields(3).value);
    rs.MoveNext();
КонецЦикла;

Добавлено: 21 Сентября 2013 02:03:36 Добавил: Андрей Ковальчук

1С 7.7 Как добавить пиктограмму (значок) в табличную часть

1C

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



Открываем документ в конфигураторе.
Внизу на панели нажимаем кнопку текст.



Потом наводим мышку на табличную часть и нажимаем левую кнопку мыши. В итоге у нас в конце должна появится новая колонка.



Нажимаем на шапку этой колонки. Она будет выделена. Потом в открывшемся по правой кнопки мыши меню выбираем свойства.



В свойствах на закладке «Дополнительно» ставим галочку «Показывать пиктограммы» и в поле формула пишем имя функции которая будет возвращать номер пиктограммы (НомПикт()).



Далее выделяем саму табличную часть документа. И выбираем свойства.



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



Пример реализации функции возвращающей номер пиктограммы.
Допустим нам необходимо хранить в базе документ с отмеченными пиктограммами. Для этого в табличной части сделаем новый реквизит «Флажок» тип «Число» длина 1.



Теперь напишем код который будет показывать пиктограммы. У нас будет одна функция НомПикт() которая будет возвращать номер пиктограммы равный числу в реквизите флажок. И предопределенная процедура ПриНачалеРедактированияСтроки() обрабатывает щелчок на пиктограмме и ПриЗакрытии() будет сохранять в реквизит Флажок номер выбранной пиктограммы.

Функция НомПикт ()
	Возврат Флажок;
КонецФункции   
//-----------------------------------
Процедура ПриНачалеРедактированияСтроки()
	Если СокрЛП(Форма.ТекущаяКолонка())="" Тогда  
		Если Флажок=1 Тогда
			Флажок=2;
		ИначеЕсли Флажок=2 Тогда
			Флажок=1;
		КонецЕсли;			
	КонецЕсли;
КонецПроцедуры

Добавлено: 21 Сентября 2013 02:02:29 Добавил: Андрей Ковальчук

1С 7.7 ЗиК сверхурочные часы в табеле

1C

В этой заметке рассмотрим ввод и отображение сверхурочных часов. Как правильно ввести сверхурочные часы и как исправить стандартный отчет в ЗиК «Табель учета рабочего времени», чтобы в нем отображались сверхурочные часы.

Если работник работал сверхурочно, то эти часы необходимо отразить через документ «Табель отработанного времени». Для этого создаем новый документ. Выбираем в поле «тип отработанных часов» сверхурочные часы и проставляем количество часов переработки по дням.
Проводим и в журнале расчетов должны появится записи «Оплата сверхурочных часов».

Теперь необходимо решить проблему с отображением этих часов в ЗиК 7.7 в отчете «Табель учета рабочего времени» в форме Т-13. ЗиК сделана так, что сверхурочные часы не отображаются в форме табеля Т-13. Открываем модуль отчета «ТабельУчетаРабочегоВремени» ищем там строки

ИначеЕсли ВР=ВидРасчета.ОплатаСверхурочныхЧасов Тогда
 
ИначеЕсли ВР=ВидРасчета.ОтпускОчередной Тогда

и между ними вставляем
ДокТаб = СоздатьОбъект("Документ.ТабельОтработанногоВремени");
Если ДокТаб.НайтиДокумент(ТаблицаВытесняемыхРасчетов.Документ) = 1 тогда
	ДокТаб.ВыбратьСтроки();
	Пока ДокТаб.ПолучитьСтроку() = 1 цикл
		Если (ДокТаб.Сотрудник = Сотрудник)и((ДокТаб.ТипЧасов = Перечисление.ТипыЧасов.Сверхурочные15)или(ДокТаб.ТипЧасов = Перечисление.ТипыЧасов.Сверхурочные20)) тогда
			Для Сч = 1 по 31 Цикл
				Часы = ДокТаб.ПолучитьАтрибут("КолвоЧасов" + Формат(Сч, "Ч(0)2.0"));
				Если Часы > 0 тогда
					КолвоЧасов[Сч]	= КолвоЧасов[Сч] + Часы;
					ДокиОснования[Сч] = ТаблицаВытесняемыхРасчетов.Документ;
					СУ = СУ + Часы;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
КонецЕсли;

Также находим все строки типа:
КодЧасов  [ПозицияМассива] = "Я";
КолвоЧасов[ПозицияМассива] = Часов;

и меняем их на:
КодЧасов  [ПозицияМассива] = "Я";
КолвоЧасов[ПозицияМассива] = КолвоЧасов[ПозицияМассива]+Часов;

Сохраняем и в отчете появляются сверхурочные часы. Они будут суммироваться к основным часам.

Добавлено: 21 Сентября 2013 01:57:42 Добавил: Андрей Ковальчук

Игра Однорукий бандит

1C

#include<iostream>
#include<conio.h>
#include<time.h>
#include<Windows.h>
#include<math.h>
using namespace std;
void main()
{
long money;
int imp=0;


money=100;


setlocale(LC_ALL,"rus");
cout<<"\n\tДобро пожаловать в игру 'Однорукий бандит'!";
_getch();
cout<<"\n\tНажав <Enter> будут выпадать 3 числа. ";
_getch();
cout<<"\n\tВаша начальная сумма составляет 100 золотых.";
cout<<"\n\tЗа 3 совпадения Вы выиграете 100 золотых.";
cout<<"\n\tЗа 2 совпадения Вы выиграете 50 золотых.";
cout<<"\n\tА если совпадений не будет, то Вы потеряете 20 золотых.";
_getch();
cout<<"\n\tВы можете в любой момент окончить игру и забрать выиграш, нажав <Esc>.";
_getch();
cout<<"\n\tУдачи!";
do
{
srand(time(NULL));
int a=1+rand()%9;
int b=1+rand()%9;
int c=1+rand()%9;

cout<<"\n\t"<<a<<" "<<b<<" "<<c<<endl;
if
(a==b&&b==c)//все 3 числа на совпадение
{
money=money+1000;
cout<<"\t\nДжекпот!"<<"Ваши деньги: "<<money<<"золотых!";
}
else
if(a==b||b==c||a==c)//проверка 2 чисел
{
money=money+50;
cout<<"\n\t2 числа одинаковые.Ваши деньги: "<<money<<"золотых!";
}
else 
money=money-20;
cout<<"\n\tНет совпадений. Ваши деньги: "<<money<<"золотых!";
imp=_getch();
}
while (imp!=27||money==10||money==0);
cout<<"Игра окончена!";
_getch();
}

Добавлено: 19 Августа 2013 12:21:05 Добавил: Андрей Ковальчук