Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха информатор 3.1
Еще более удобное оповещение о флуде!

Краснодарское время: 22 Май, 2012, 11:04:49

Страниц: [1] 2
Печать
Автор Тема: Синхронизация базы сайта с базой 1С (экспорт, импорт). Часть 1 — Импорт.  (Прочитано 3125 раз)
0 Пользователей и 1 Гость смотрят эту тему.
md5    ↓ 
10 Сентябрь, 2008, 11:18:51
НЕ ХУЕТА! ХУЕТА!

выезд, апартаменты, массаж, стриптиз, подружки, дорого
Группа: в ухо

Карма: не нужна
Сообщений: 10494
Сила слова: 1.19

Тревожный вопрос, как же организовать общение между 1С и базой сайта?
 
Рассмотрим вариант, когда мы будем использовать импорт и экспорт данных в формате DBF.
 
Часть 1. Импорт в базу нашего сайта.
 
Экспорт из 1С это делается щелчками мыши, вдаваться в подробности не будем, мы не одинэсники.
 
Как импортировать DBF файл и распрасить его?
 
Приведем пример DBF файла. В нем структура такая:
 
ARTICUL, NAME, GROUP1, GROUP2, GROUP3, GROUP4, REMAINS, PRICE (и дополнтельные поля в зависимости от поставленной задачи и товаров)
 
ARTICUL — идентификатор товара
NAME — его название
GROUP1-GROUP4 — это категории товара. Цифры обозначают уровень вложенности и дают намек на структуру категорий.
REMAINS — остатки
PRICE — цена
 

Т.е. тут нет категорий, тут только товары, а пренадлежность и вложенность в категории определяется параметрами GROUP1-GROUP4.
Их и надо использовать для построения дерева и привязки к ним.
 

В php существуют инструменты для работы с такими файлами — dbase.
 
Открываем файл для чтения (read-only — это 0) с помощью функции dbase_open и подсчитываем количество записей.
 
PHP

$db = dbase_open($file, 0);
if ($db) {
    $rows = dbase_numrecords($db);
 
    print 'Найдено товаров в файле: ' . $rows;
}
 

Обращу внимание, что нумерация записей в dbf файле начинается не с 0, а с 1.
Поэтому, при обходе файла в цикле, мы начнем с 1.
 
Для получения данных о записе будем использовать dbase_get_record_with_names, которая возвращает ассоциативный массив, где ключи — названия полей.
 

Сначала позаботимся о структуре категорий нашего каталога. Допустим это будет простое дерево по parent_id
 
SQL

CREATE TABLE IF NOT EXISTS `structure` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) UNSIGNED DEFAULT NULL,
  `name` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 PACK_KEYS=0 AUTO_INCREMENT=1;
 

Сразу же определимся со структурой таблицы с товарами:
 
SQL

CREATE TABLE IF NOT EXISTS `goods` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) UNSIGNED DEFAULT NULL,
  `articul` int(11) UNSIGNED DEFAULT NULL,
  `name` varchar(255) NOT NULL DEFAULT '',
  `GROUP1` varchar(255) NOT NULL DEFAULT '',
  `GROUP2` varchar(255) NOT NULL DEFAULT '',
  `GROUP3` varchar(255) NOT NULL DEFAULT '',
  `GROUP4` varchar(255) NOT NULL DEFAULT '',
  `remains` int(11) UNSIGNED DEFAULT NULL,
  `price` float(11,2) DEFAULT NULL,
  UNIQUE KEY  (`articul`),
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 PACK_KEYS=0 AUTO_INCREMENT=1;
 

Данные из полей GROUP1-GROUP4 нам понадобятся при экспорте из нашей базы (чтобы облегчить жизнь).
 

Итак, обходим наши данные:
 
PHP

for ($i=1; $i<=$rows; $i++) {
    // в $row содержится запись
    $row = dbase_get_record_with_names($db, $i);
   
    // дальше работаем с данными...
}

Обычно файлы очень большие, поэтому мы сделаем поэтапную разбивку по 100 записей за 1 заход:
PHP

$start = isset($_GET['start']) ? intval($_GET['start']) : 1;
$end = $start+99;
if ($end > $rows) $end = $rows;
 

Таким образом цикл у нас будет такой:
PHP
for ($i=$start; $i<=$end; $i++)

 
Ну вот и сам разбор данных, опеределние категорий, вложенностей и добавление товара в базу (или его обновление при наличии).
 
PHP

for ($i=$start; $i<=$end; $i++) {
    $item = dbase_get_record_with_names($db, $i);
   
    // установим первоначальное значение для parent_id нашего товара в ноль
    $parent_id=0;
   
    $groups = array();
    /*
    ** Обычно, при импорте в dbf из 1С, кодировка будет cp866
    ** мы переведем её в обычную для себя — cp1251
    */

    $groups[] = convert_cyr_string(trim($item['GROUP1']), "a", "w");
    $groups[] = convert_cyr_string(trim($item['GROUP2']), "a", "w");
    $groups[] = convert_cyr_string(trim($item['GROUP3']), "a", "w");
    $groups[] = convert_cyr_string(trim($item['GROUP4']), "a", "w");
   
   
    /*
    ** Определяем parent_id (категорию, к которой отнесем наш товар)
    ** для подробностей — смотрите функцию ниже
    */

    $parent_id = DefineParent($groups);
   
    $articul = $item['ARTICUL'];
    $name = convert_cyr_string(trim($item['NAME']), "a", "w");
    $remains = intval($item['REMAINS']);
    $price = floatval($item['PRICE']);
    /*
    ** Приведение типа у remains может отличаться
    ** здесь пример, когда осаток товара на складе — целое число
    ** может быть остаток float, например, когда это вес какой-либо продукции (2,45 кг резиновых членов)
    ** так что, тут по ситуации
    */

   
   
    /*
    ** Дальше мы проверим, есть ли в базе товар с таким артикулом
    ** и в зависимости от этого мы его добавим, либо обновим его данные
    */

   
    $query = "SELECT `id`
                FROM `goods`
                WHERE `articul`='"
. mysql_real_escape_string($articul) . "'
                LIMIT 1"
;
    $sql = mysql_query($query) or die(mysql_error());
   
    if (mysql_num_rows($sql)==1) {
        $row = mysql_fetch_assoc($sql);
        // Если товар уже имеется в базе, мы обновим его данные: цену и остаток на складе
        $query = "UPDATE `goods`
                    SET
                        `price`='{$price}',
                        `GROUP1`='{$groups[0]}',
                        `GROUP2`='{$groups[1]}',
                        `GROUP3`='{$groups[2]}',
                        `GROUP4`='{$groups[3]}',
                        `remains`='{$remains}'
                    WHERE `id`={$row['id']}
                    LIMIT 1"
;
        $sql = mysql_query($query) or die(mysql_error());
    }
    else {
        // Если его нет, то добавим его!
        $query = "INSERT
                    INTO `goods`
                    SET
                        `parent_id`={$parent_id},
                        `name`='{$name}',
                        `GROUP1`='{$groups[0]}',
                        `GROUP2`='{$groups[1]}',
                        `GROUP3`='{$groups[2]}',
                        `GROUP4`='{$groups[3]}',
                        `articul`='{$articul}',
                        `price`='{$price}',
                        `remains`='{$remains}'
                    "
;
        $sql = mysql_query($query) or die(mysql_error());
    }
   
}
 
dbase_close($db);
 
print 'Сделано ' . $end . ' из ' . $rows . '. ';
 
if ($end != $rows) {
    print 'Продолжаем... <script type="text/javascript">setTimeout("document.location.href=\'import.php?start=' . ($end+1) . '\'", 1000);</script>';
}
 

function DefineParent($groups)
{
    $parent_id = 0;
   
    foreach ($groups as $group) {
        if (!empty($group)) {
            $group_name = trim($group);
           
            /*
            ** Проверим, есть ли такая категория уже в нашей базе?
            */

            $query = "SELECT `id`
                        FROM `structure`
                        WHERE `name`='"
. mysql_real_escape_string($group_name) . "' AND `parent_id`={$parent_id}
                        LIMIT 1"
;
            $sql = mysql_query($query) or die(mysql_error());
           
            if (mysql_num_rows($sql)==1) {
                //Если нашли, то вытаскиваем её id, это и будет наш parent_id
                $row = mysql_fetch_assoc($sql);
                $parent_id = $row['id'];
            }
            else {
                /*
                ** Если нет такой категории, то её необходимо создать
                ** и взять id новой категории за parent_id
                */

                $query = "INSERT
                            INTO `structure`
                            SET
                                `parent_id`={$parent_id},
                                `name`='"
. mysql_real_escape_string($group_name) . "'";
                $sql = mysql_query($query) or die(mysql_error());
               
                $parent_id = mysql_insert_id();
            }
        }
        else {
            // Если категория пустая, то дальше идти нет смысла, возвращаем полученный parent_id
            return($parent_id);
        }
    }
    return($parent_id);
}
 

* pyha.ru.faq-1C.zip (36.46 Кб - загружено 107 раз.)
« Последнее редактирование: 10 Сентябрь, 2008, 11:58:02 от md5 » Записан

8: Undefined variable: str
Файл: /home/pyha/pyha.ru/forum/bbcode/Xbb/Tags/Man.php
Строка: 18
adw0rd: мудень блять, я уже фиксить стал эту фигню :)
md5: вуахахахаха
md5    ↓ 
10 Сентябрь, 2008, 11:28:56 , спустя 10 минут 5 секунд
НЕ ХУЕТА! ХУЕТА!

выезд, апартаменты, массаж, стриптиз, подружки, дорого
Группа: в ухо

Карма: не нужна
Сообщений: 10494
Сила слова: 1.19

http://pyha.ru/articles/php/1c-dbf-import/
Записан

8: Undefined variable: str
Файл: /home/pyha/pyha.ru/forum/bbcode/Xbb/Tags/Man.php
Строка: 18
adw0rd: мудень блять, я уже фиксить стал эту фигню :)
md5: вуахахахаха
CTAPbIu_MABP    ↓ 
10 Сентябрь, 2008, 12:43:39 , спустя 1 час 14 минут 43 секунды
НЕ ХУЕТА! ХУЕТА!

мавр
Группа: в ухо

Карма: не нужна
Сообщений: 5187
Сила слова: 1.81

прикольно)
я както делал базу сайта из mdb подключенного через odbc как источник данных
работал кстати через адодб, очень скажу вам нормально получалось
Записан

java.lang.OutOfMemoryError
sap    ↓ 
11 Сентябрь, 2008, 07:35:57 , спустя 1 день 6 часов 52 минуты 18 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Жмурики

Карма: 40
Сообщений: 2697
Сила слова: 1.48

А вообще возможно технически сделать так, чтобы базы синхронизировались автоматически по расписанию?
Записан

md5    ↓ 
11 Сентябрь, 2008, 08:51:25 , спустя 1 час 15 минут 28 секунд
НЕ ХУЕТА! ХУЕТА!

выезд, апартаменты, массаж, стриптиз, подружки, дорого
Группа: в ухо

Карма: не нужна
Сообщений: 10494
Сила слова: 1.19


А вообще возможно технически сделать так, чтобы базы синхронизировались автоматически по расписанию?
конечно
у кефирки спроси, как ставить таймеры ;)
 
я не силен в 1С, более того - я его только видел несколько раз не ближе 1 метра + коробки от него видел и поэтому не знаю, умеет ли он работать с мускулом и др. субд.
У нас синхронизация происходит так:
1С-ники каждые пол часа по ФТП заливают DBF файл (наверно же есть там спецсредства для этого...) а на стороне сервера у нас по крончеку скрипт разгребает его и обновляет мускульную базу
 
ещё есть подобная схема, но там уже не DBF, а XML, но это уже не из этого фака...
Записан

8: Undefined variable: str
Файл: /home/pyha/pyha.ru/forum/bbcode/Xbb/Tags/Man.php
Строка: 18
adw0rd: мудень блять, я уже фиксить стал эту фигню :)
md5: вуахахахаха
smv    ↓ 
08 Декабрь, 2009, 09:34:10 , спустя 453 дня 1 час 42 минуты 45 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: -2
Сообщений: 234
Сила слова: -0.85

Добрый вечер. Может быть испорчу своим вопросом всю тему, но все же. Подскажите пожалуйста, если кто-то знает, как все-таки из 1С экспортировать данные в DBF. Сам пробовал, но нашел только как снять дамп всей БД,  а нужно только кокретные прайсы. Искал на форумах других, но там видимо только для мега знатоков. Видел какие-то коды на руском языке... честно сказать ничего не понял.
Записан
phpdude    ↓ 
08 Декабрь, 2009, 09:47:43 , спустя 13 минут 33 секунды
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: д-о-х-у-я!
Сила слова: 1.66

Видел какие-то коды на руском языке... честно сказать ничего не понял.
ты сука в россии живешь, так и программируй на русском!!! 1С - ДЛЯ ПАТРИОТОВ!
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
smv    ↓ 
08 Декабрь, 2009, 09:52:37 , спустя 4 минуты 54 секунды
НЕ ХУЕТА! ХУЕТА!

Карма: -2
Сообщений: 234
Сила слова: -0.85


Видел какие-то коды на руском языке... честно сказать ничего не понял.
ты сука в россии живешь, так и программируй на русском!!! 1С - ДЛЯ ПАТРИОТОВ!

Ты сука умных мыслей нет, сиди селекты из бд делай
Записан
phpdude    ↓ 
08 Декабрь, 2009, 09:57:38 , спустя 5 минут 1 секунду
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: 20780
Сила слова: 1.66

smv, ты к чему?
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
smv    ↓ 
08 Декабрь, 2009, 09:58:39 , спустя 1 минуту 1 секунду
НЕ ХУЕТА! ХУЕТА!

Карма: -2
Сообщений: 234
Сила слова: -0.85


smv, ты к чему?

а ты к чему?
Записан
phpdude    ↓ 
08 Декабрь, 2009, 10:04:21 , спустя 5 минут 42 секунды
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: 20780
Сила слова: 1.66

видимо моему собеседнику при зачатии не повезло на ген юмора :)
Спустя 9 секунд добавил
проехали
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
smv    ↓ 
08 Декабрь, 2009, 10:05:51 , спустя 1 минуту 30 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: -2
Сообщений: 234
Сила слова: -0.85


видимо моему собеседнику при зачатии не повезло на ген юмора :)
Спустя 9 секунд добавил
проехали

Я задал помоему вполне конкретный вопрос. И буду очень благодарен если получу на него конкретный ответ. Давай не будм за зря сотрясать воздух... ок? В юморе хочеш потягаться? тогда тебе в аншлаг.
Записан
phpdude    ↓ 
08 Декабрь, 2009, 10:07:50 , спустя 1 минуту 59 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: 20780
Сила слова: 1.66

smv, не дали? :)
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
smv    ↓ 
08 Декабрь, 2009, 10:10:07 , спустя 2 минуты 17 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: -2
Сообщений: 234
Сила слова: -0.85


smv, не дали? :)
вау... ха ха ха... чуть со стула не упал. Видать ты в аншлаге часто зависаеш... а ты случаем не регина дубовицкая? а?
Записан
adw0rd    ↓ 
08 Декабрь, 2009, 10:16:07 , спустя 6 минут
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17615
Сила слова: 1.67

smv, так сними дамп и вытащи свои прайсы
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
Страниц: [1] 2
Печать
 

Перейти в: