Категории

[FAQ] Часто задаваемые вопросы и ответы

Проблемы и решения

Ошибки и исправления

Общие вопросы

Расширения

Установка и обновление

Модули

Шаблоны

Локализация интерфейса

Коммерческие предложения

Учимся бизнесу

Бизнес книги

Поисковая оптимизация (SEO)

Магазины на ShopOS

Хостинг для ShopOS

Предложения и пожелания

Курилка

Автоматический импорт заказов из магазина в 1С

Задача состоит в том, чтобы сделать автоматическую выгрузку заказов от клиентов из магазина в базу 1С Бухгалтерия.

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

Путь реализации:
1.Результатом авт. импорта должен служить файл в формате .xls (таблицы Excel) или .dbf Например Import.xls

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

1-столбец:
Название "KOD" это уникальный код товара. Единый для магазина и базы 1С.
В него заносятся значения метка {$order_values.PRODUCTS_MODEL} - уникальный код товара

2-столбец: "PRICE" это цена товара
В него заносятся значения метка {$order_values.PRODUCTS_SINGLE_PRICE} - цена единыцы товара

3-столбец: "KOL" это код товара
В него заносятся значения метка {$order_values.PRODUCTS_QTY} - количество определенной позиции товара

Рисунок внизу топика.
Автоматический импорт заказов из магазина в 1С

2. Генерироваться этот файл должен php скриптом  (что-то наподобие из темы "Автогенерируемый онлайн прайс", скрипт pricexls.php)

3. Предлагаю сделать для такого скрипта кнопку в админке на странице "Список заказов" в боксе с кнопками "Счет" и "Накладная" или их переделать

Ну а дальше, когда такой файл будет служить основанием для загрузки в 1С.
Реализовать загрузку в базу 1С такого файла можно с помощью встроенного или внешнего ert-отчета.

Теперь о том как я пытался это сделать и как у меня не получилось:

Я переделывал кнопку "Счет".
При нажати этой кнопки выполняется скрипт admin/print_order.php
Он выводит на печать шаблон themes/шаблон/module/print_order.html
Этот шаблон я  преобразовал (путем простого удаления лишнего) в таблицу, которая соответствует структуре таблицы вышеописанного файла Import.xls

{config_load file="$language/lang.conf" section="print_order"}
{config_load file="$language/lang.conf" section="product_info"}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Заказ_{$oID}</title>
<meta http-equiv="Content-Type" content="text/html; charset={$charset}" />
</head>

<body onload="window.print()">
<table style="border-bottom:1px solid;" width="100%" border="0" cellpadding="0" cellspacing="0">
 

         
          <td width="148" style="border-right: 2px solid; border-bottom: 2px solid; border-color: #ffffff;">KOD</td>
          <td width="160" style="border-right: 2px solid; border-bottom: 2px solid; border-color: #ffffff;">PRICE</td>
          <td style="border-right: 2px solid; border-bottom: 2px solid; border-color: #ffffff;" width="150">KOL</td>
        </tr>
        {foreach name=aussen item=order_values from=$order_data}
        <tr>
         
     
          <td style="border-right: 2px solid; border-bottom: 2px solid; border-color: #ffffff;"><p>{$order_values.PRODUCTS_MODEL}</p>
          <p>{$order_values.PRODUCTS_ATTRIBUTES_MODEL}</p></td>
          <td style="border-right: 2px solid; border-bottom: 2px solid; border-color: #ffffff;">{$order_values.PRODUCTS_SINGLE_PRICE}</td>
          <td style="border-right: 2px solid; border-bottom: 2px solid; border-color: #ffffff;">{$order_values.PRODUCTS_QTY}</td>
         
        </tr>
        {/foreach} </table>
</td>
  </tr>
</table>
</body>
</html>


В итоге, при нажатии кнопки "Счет" образуется нужная таблица, но только в формате html. Это главный минус.
Потому что теперь эту html страницу нужно в браузере сохранить на комп, принудительно поставив расширение "XLS" сохраняемому файлу.
Потом этот файл нужно открыть в Excel и пересохранить в формате Excel.
Только после этого он становится пригодным к импорту в 1С.

Вобщем получилось мягко сказанно не очень.

Учитывая вышеописанное  всех кто может и кому интересна данная тема Прошу помочь в решении

написания php-скрипта, который автоматически генерирует нужную xls- таблицу.
Может быть переделать admin/print_order.php


P.S. После внедрения данного импорта в 1С, выложу ert-отчеты для "1С 7.7 Предприятие"


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


ГОТОВОЕ РЕШЕНИЕ !
Подробное описание.

Тестировалось и нормально работает с:
Версия Shopos 2.5.4
Версия 1С Предприятие 7.7 торговля и склад

Я переделал кнопку "Накладная" в Админке на странице "Список заказов" (Админка->Покупатели->Заказы) в правом боксе редактирования заказов, т.к. считаю что она не несет никакой смысловой  нагрузки в магазине. Если кто-то ею пользуется, то придется создавать новую кнопку. Итак:

1. Переименуем кнопку "Накладная" на "Импорт в 1С" Для этого в файле по адресу /admin/lang/ru/buttons.php  находим:

define('BUTTON_PACKINGSLIP', 'Накладная');

и меняем на
define('BUTTON_PACKINGSLIP', 'Импорт в 1С');


2. Привязываем к этой кнопке скрипт, который будет автоматически сохранять информацию текущего заказа в файл Order.xls
Этот файл будет иметь вид таблицы со следующим содержанием (см. внизу рисунок Order.jpg), где:

products_id  - код товара (имеет единое значение в базе магазина и в базе 1С, а так же является уникальным в пределах  каждой  из баз);                     
products_price  - цена одной единицы наименования товара;
products_quantity  - количество товара одного наименования.

В файле по адресу /admin/print_packingslip.php полностью заменяем все его содержимое на этот скрипт:
<?php
/*
--Dynamic Excel or Word File from MySQL--
php-doc-xls-gen for php/MySQL: (.doc or .xls dumper):

This script takes the contents of a MySQL table and dumps it to
either a dynamically-generated MS Word File (file with ending '.doc')
or a dynamically-generated MS Excel File (file with ending '.xls').

Prerequisites:  You Must have MS Word and/or MS Excel installed on
the same computer as your web browser for this to work (although
the script can be placed on any Unix/Linux server, you have to access it using
a browser on a Windows machine with either Word or Excel installed).

How to use:
1)edit the MySQL Connection Info below for your MySQL connection
  & for the name of the MySQL table that you would like to make the dump for
2)save this file somewhere on your server
3)link to this file from another page:
  a)for Word dumps:
    <a href="this_file_name.php?w=1">link to word dump</a>
  b)for Excel dumps:
    <a href="this_file_name.php">link to excel dump</a>
  --or else--
  create a Bookmark to this page (include any of the optional parameters
  described below as part of the query string for the bookmarked URL)
4)how to reuse this code to create a dump for ANY MySQL table on your server:
  a)comment-out this line below under MySQL Connection Info:
    //$DB_TBLName = "your_table_name";
  b)include the name of your MySQL table in links (or bookmarks) to this page
    as an extra parameter:
    ie: for word dump--
    <a href="this_file_name.php?w=1&DB_TBLName=your_table_name">link to word dump</a>
    ie: for excel dump--
    <a href="this_file_name.php?DB_TBLName=your_table_name">link to excel dump</a>
  c)all of the above also holds true for the name of the Database:
    you could pass along the name of the Database as a parameter to this script
in order to use it on many different databases on your server:
comment out //$DB_DBName = "your database"; in this script below
and then link to this file like:
"this_file_name.php?$DB_DBName=your_database&DB_TBLName=your_table_name..."
5)if you're resourceful, you could also pass the sql statement to be used for this
  script as a parameter: "this_file_name.php?sql=..."
  but you might have to URL-ENCODE your sql statement before passing it to this script,
  and then URL-DECODE it in the beginning of this script for it to work.

To change the formatting of the Word or Excel File generated:
change the respective parts of the coding for the word or the excel file that format
the database info sent to the browser.  Most useful for this are the escape characters
for tabs ('\t') & line returns ('\n').  Experiment with these until you get the formatting
that you desire.

If you're going to be using this script with SSL, please see the comments marked
'A NOTE ABOUT USING THIS SCRIPT WITH SSL' found below!

This code is freeware (GPL).  Please feel free to do with it what you'd like.
Comments, bugs, fixes to:
churmtom@hotmail.com

Originally: Nov. 25th, 2001
Updated:    May  12th, 2002
Updated:    July  1st, 2002
Updated:    Jan 19th, 2003 - SSL Fix for MSIE

Thanks to Josue & Steven d.B. for helping point out
improvements for this code!

Interested in a desktop application that backs up a
COMPLETE MySQL database to an Excel File--without using ODBC?

Then try out my MySQL Database 2 Excel KonvertR program:
http://www.churm.com/konvertr/index.php
*/

//EDIT YOUR MySQL Connection Info:
$DB_Server = "localhost";        //your MySQL Server
$DB_Username = "хххх";     //your MySQL User Name
$DB_Password = "ххххх";        //your MySQL Password
$DB_DBName = "хххххххххххх";        //your MySQL Database Name
$DB_TBLName = "os_orders_products"; //your MySQL Table Name
//$DB_TBLName,  $DB_DBName, may also be commented out & passed to the browser
//as parameters in a query string, so that this code may be easily reused for
//any MySQL table or any MySQL database on your server

//DEFINE SQL QUERY:
//you can use just about ANY kind of select statement you want -
//edit this to suit your needs!
//$sql = "Select * from $DB_TBLName";
$sql = "SELECT`products_id`,`products_price`,`products_quantity`\n"
    . "FROM `os_orders_products`\n"
    . "WHERE orders_id='".(int)$_GET['oID']."'"
    . "LIMIT 0,90";
//Optional: print out title to top of Excel or Word file with Timestamp
//for when file was generated:
//set $Use_Titel = 1 to generate title, 0 not to use title
$Use_Title = 0;
//define date for title: EDIT this to create the time-format you need
$now_date = date('m-d-Y H:i');
//define title for .doc or .xls file: EDIT this if you want
$title = "Dump For Table $DB_TBLName from Database $DB_DBName on $now_date";
/*

Leave the connection info below as it is:
just edit the above.

(Editing of code past this point recommended only for advanced users.)
*/
//create MySQL connection
$Connect = @mysql_connect($DB_Server, $DB_Username, $DB_Password)
    or die("Couldn't connect to MySQL:<br>" . mysql_error() . "<br>" . mysql_errno());
//select database
$Db = @mysql_select_db($DB_DBName, $Connect)
    or die("Couldn't select database:<br>" . mysql_error(). "<br>" . mysql_errno());
//execute query
$result = @mysql_query($sql,$Connect)
    or die("Couldn't execute query:<br>" . mysql_error(). "<br>" . mysql_errno());

//if this parameter is included ($w=1), file returned will be in word format ('.doc')
//if parameter is not included, file returned will be in excel format ('.xls')
if (isset($w) && ($w==1)){
$file_type = "msword";
$file_ending = "doc";
}
else {
$file_type = "vnd.ms-excel";
$file_ending = "xls";
}
//header info for browser: determines file type ('.doc' or '.xls')
header("Content-Type: application/$file_type");
header("Content-Disposition: attachment; filename=Order.$file_ending");
header("Pragma: no-cache");
header("Expires: 0");

/*
A NOTE ABOUT USING THIS SCRIPT WITH SSL:
==============================================
To get this script to work properly in MSIE,
do the following:

//delete this header:
header("Pragma: no-cache");

//and add these headers just after the "Expires: 0" header:
header("Keep-Alive: timeout=15, max=100");
header("Connection: Keep-Alive");       
header("Transfer-Encoding: chunked");

Thanks to Christopher Owens for this!
==============================================
*/

/*    Start of Formatting for Word or Excel    */

if (isset($w) && ($w==1)) //check for $w again
/*    FORMATTING FOR WORD DOCUMENTS ('.doc')  */
{
//create title with timestamp:
if ($Use_Title == 1){
echo("$title\n\n");
}
//define separator (defines columns in excel & tabs in word)
$sep = "\n"; //new line character

    while($row = mysql_fetch_row($result))
    {
        //set_time_limit(60); // HaRa
        $schema_insert = "";
        for($j=0; $j<mysql_num_fields($result);$j++)
        {
        //define field names
        $field_name = mysql_field_name($result,$j);
        //will show name of fields
        $schema_insert .= "$field_name:\t";
            if(!isset($row)) {
                $schema_insert .= "NULL".$sep;
                }
            elseif ($row != "") {
                $schema_insert .= "$row".$sep;
                }
            else {
                $schema_insert .= "".$sep;
                }
        }
        $schema_insert = str_replace($sep."$", "", $schema_insert);
        $schema_insert .= "\t";
        print(trim($schema_insert));
        //end of each mysql row
        //creates line to separate data from each MySQL table row
        print "\n----------------------------------------------------\n";
}
}
else
/*    FORMATTING FOR EXCEL DOCUMENTS ('.xls')  */
{
//create title with timestamp:
if ($Use_Title == 1){
echo("$title\n");
}
//define separator (defines columns in excel & tabs in word)
$sep = "\t"; //tabbed character

//start of printing column names as names of MySQL fields
for ($i = 0; $i < mysql_num_fields($result); $i++) {
echo mysql_field_name($result,$i) . "\t";
}
print("\n");
//end of printing column names

//start while loop to get data
/*
note: the following while-loop was taken from phpMyAdmin 2.1.0.
--from the file "lib.inc.php".
*/
    while($row = mysql_fetch_row($result))
    {
        //set_time_limit(60); // HaRa
        $schema_insert = "";
        for($j=0; $j<mysql_num_fields($result);$j++)
        {
            if(!isset($row))
                $schema_insert .= "NULL".$sep;
            elseif ($row != "")
                $schema_insert .= "$row".$sep;
            else
                $schema_insert .= "".$sep;
        }
        $schema_insert = str_replace($sep."$", "", $schema_insert);
//following fix suggested by Josue (thanks, Josue!)
//this corrects output in excel when table fields contain \n or \r
//these two characters are now replaced with a space
$schema_insert = preg_replace("/\r\n|\n\r|\n|\r/", " ", $schema_insert);
        $schema_insert .= "\t";
        print(trim($schema_insert));
        print "\n";
    }
}
?>


В этом только что скопированном скрипте находим:
$DB_Server = "localhost";        //your MySQL Server
$DB_Username = "хххх";     //your MySQL User Name
$DB_Password = "ххххх";        //your MySQL Password
$DB_DBName = "хххххххххххх";        //your MySQL Database Name
$DB_TBLName = "os_orders_products"; //your MySQL Table Name

и подставляем вместо "хххххх" свои данные. Если вдруг забыли, то они лежат у вас в файле config.php в корне магазина.

Вот эта часть кода
$sql = "SELECT`products_id`,`products_price`,`products_quantity`\n"
    . "FROM `os_orders_products`\n"
    . "WHERE orders_id='".(int)$_GET['oID']."'"
    . "LIMIT 0,90";

это SQL- запрос к вашей базе данных по команде SELECT, т.е. мы выбрали необходимые нам три поля для нашей таблицы  (см. внизу рисунок Order.jpg) products_id, products_price, products_quantity.
Если для ваших нужд потребуестя другая структура файла Order.xls (наприм. не  3 а 4 или 2 поля или совсем другие поля, что вряд ли) то ПРАВИТЬ следует именно эту часть кода.
А вообще по каждой функции в самом скрипте есть закомментированные подсказки, правда на английском.
Сам скрипт взял сдесь: http://www.vanta.ru/script/info.php?id=1408&clas=0

По части магазина это все.

Теперь по части 1С.

1. Запускаем 1С в режиме конфигуратора.
2. Находим: Конфигурация->Документы->Расходная Накладная (или Счет-фактура, кому что нужно)
3. Двойной клик по Расходной накладной, дальше жмем на кнопку "Форма" 
4. Первая вкладка "Диалог" представлена в виде конструктора. Здесь создаете Кнопку "IMP", перемещаете в удобное для вас место. Двойной клик по кнопке, открываются свойства этой кнопки. Ставим Следующие свойства:
На вкладке "Общие"
Заголовок: "IMP"
Идентификатор: "Импортик"
На вкладке "Дополнительно"
Формула: "Импортик()" и ниже ставим птичку "Пропускать при вводе"
Сохраняем кнопку.
Переходим к вкладке "Модуль" и в програмный код вставляем следующую часть кода (где то в середину)
// ===============================
Функция ОткрытьИмпортируемыйФайл(П_Книга)
Перем ЗапущенExcel;
Перем ОшибкаОткрытия;

Спр=СоздатьОбъект("Справочник.Номенклатура");
ЗапущенExcel = 1;

Попытка
// запускаем Excel-Server
ВходExcel = СоздатьОбъект("Excel.Application");
Исключение     
ЗапущенExcel = 0;
Предупреждение("MS Excel не загружен!");
КонецПопытки;

Если ЗапущенExcel=1 Тогда
//Если П_Книга=1 Тогда
Попытка
// открываем файл
//ВходExcel.Application.Workbooks.Open(ПутьXLS+"2010 каталог.xls");
ВходExcel.Application.Workbooks.Open(НазваниеФайла);
        Исключение
КонецПопытки;
//КонецЕсли;

ВходнойФайлОткрыт = 1;
КонецЕсли;
РабочаяКнига=ВходExcel.ActiveWorkbook;
    Попытка
Лист=РабочаяКнига.Worksheets(П_Книга);

Если КоличествоСтрок() > 0 Тогда
Рез = Вопрос("Табличная часть будет очищена!","Да+Нет");
Если Рез = "Да" Тогда
УдалитьСтроки();
КонецЕсли;
КонецЕсли;
НачальнаяСтрока = 1;
Для П_Стр=НачальнаяСтрока По 1000 Цикл
Если СокрЛП(""+Лист.Cells(П_Стр,1).Value)="" Тогда
Прервать;
КонецЕсли;

//ТЗС.НоваяСтрока();
Для П_Клн=1 По 3 Цикл
Ячейка=""+Лист.Cells(П_Стр,П_Клн).Value;
//Сообщить("П_Стр="+П_Стр+"; П_Клн="+П_Клн+"; Ячейка="+Ячейка);
//ТЗС.УстановитьЗначение(П_стр-1,П_Клн,СокрЛП(Ячейка))
Если П_Клн=1 Тогда
П_Артикул=Окр(Число(СокрЛП(Ячейка)),10,0);
ИначеЕсли П_Клн=2 Тогда
П_Цена=Окр(Число(СокрЛП(Ячейка)),10,4);
ИначеЕсли П_Клн=3 Тогда
П_Кво=Окр(Число(СокрЛП(Ячейка)),10,3);
КонецЕсли;
КонецЦикла;

Если П_Кво>0 Тогда
//ВводОстатковТоваров();
НоваяСтрока();
Если Спр.НайтиПоКоду(П_Артикул)=1 Тогда
    Товар=Спр.ТекущийЭлемент();
КонецЕсли;
глПриИзмененииТовара(Контекст);
Количество=П_Кво;
//Единица=Спр.БазоваяЕдиница;
Коэффициент=Единица.Коэффициент;
//ЦенаБезНДС=П_Цена;
ЦенаСНДС=П_Цена;
глВыч_суммы_накл(Контекст);
//Записать();
КонецЕсли;

КонецЦикла;
Исключение
Возврат 0;
КонецПопытки;
Попытка
ВходExcel.ActiveWorkbook.Close();
Исключение
КонецПопытки;
КонецФункции

//******************************************************************************
Процедура Импортик()
Перем СпрГ1,П_Новый_,П_Перезапись;
Перем ЦеныТовара;
Перем КатегорииЦен;

Спр=СоздатьОбъект("Справочник.Номенклатура");
СпрВ=СоздатьОбъект("Справочник.Валюты");
НазваниеФайла="d:\Order.xls";
Для П_Книга=1 По 1 Цикл
Если ОткрытьИмпортируемыйФайл(П_Книга)=0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры


Сохраняем изменения, пользуемся, радуемся.


Спасибо!


Источник



Copyright ShopOS