Обрезание БД удалённого магазина одной кнопкой




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

75 Comments

  1. Fisherru

    А вообще у нас ещё много разных интересных технологий 😉

    :-))))

    Reply ↓
  2. anbxp

    Жопа. У вас остаток товара в справочнике хранится?:)

    Reply ↓
  3. Mikeware

    Редкостный бред…

    Reply ↓
  4. brr

    Не понятно: зачем выгружать и загружать документы, вводятся ли начальные остатки? Маловероятно, что после таких манипуляций сходятся остатки.

    Автор поработайте над статьей, понять из написаного что либо сложно.

    Reply ↓
  5. Fisherru

    (2)

    Остатки как и у всех хранятся в регистре.

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

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

    Reply ↓
  6. Fisherru

    (3)

    Про бред не понял 🙁

    Была задача без участия программиста выполнить в автоматическом режиме обрезание БД — задача решена…

    Основная сложность была выполнить последовательность неких действий (которые я раньше делал вручную) и чтобы 1С, запущенная из BAT-ничка в пакетном режиме, понимала, что и когда ей делать надо…

    Reply ↓
  7. Fisherru

    (4)

    В базе магазина продажи регистрируются расходными накладными. По 200 — 800 документов в день. Через год — полтора документов становится настолько много, что идут реальные подвисания как при создании нового документа, так и при его записи и проведения.

    Обрезать «под ноль» — нельзя, так как в магазины периодически повторно перевыгружаются скорректированные документы закупа, корректирующие остатки.

    Поэтому оставляем в магазине все документы за 1-2 месяца. Остальное прибиваем.

    Выполнять удаление документов за отбрасываемый период в среде 1С, как это делается в стандартной — ооооооооооочень долго.

    Поэтому:

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

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

    Удаляем физически все DBF-ки (кроме справочников) — очень быстро 😉

    В чистую базу грузим остатки на начало периода и все документы в нём.

    Остатки сходятся копеечка в копеечку. Что и подтверждается сравнением отчётов по остаткам товаров по входным ценам сделанным ДО и ПОСЛЕ обрезания.

    Reply ↓
  8. ttycoon

    А можно посмотреть болванки загрузки/выгрузки? У нас тоже конфигурация самописная, писали свои обработки, но всегда интересно посмотреть как у других.

    А вообще идея замечательная, у самих почти десять объектов, обрезаем раз в несколько лет, но от этого не легче — делали всегда вручную, по бумажке :). Попробуем внедрить у себя.

    Reply ↓
  9. Fisherru

    (8)

    Вот, первый комментарий по теме 🙂

    Спасибо за поддержку 😉

    У нас более 130 магазинов и сеть продолжает расти.

    По жизни замечено, что при достижении размера *.dbf + *.cdx > 500 Мб — начинается вешалка. А если в магазине (у нас небольшие алкомаркеты) несколько касс, то они вообще конкретно мешают друг другу.

    Да, делал обрезание вручную — ручное копирование, удаление *.cdx? куча выгрузок (всё было по отдельности : цены, остатки, документы и прочее), аналогично загрузки. Обрезание шло в одном магазине 40 — 50 мин (магазин стоял).

    Когда сделал единую выгрузку (объединив все обработки в одну) и загрузку — стало 20-25 минут, но ручной труд остался.

    Сейчас, грубо, управляющий запускает bat-ничек и курить 10-15 минут — всё!

    Reply ↓
  10. Fisherru

    Выгрузку/загрузку сейчас положу 😉

    Reply ↓
  11. akon

    (3) Никакой ни бред! Подобная проблема у меня была с аптеками. И тоже периодически занимался «обрезанием» по тому же принципу. Идея «правильная». Пока не смотрел, но заранее спасибо.Да, про (8) не забудь.

    Reply ↓
  12. Fisherru

    Вот ссылочка

    «Принципы выполнения Выгрузки / Загрузки данных при обрезании БД удаленного магазина»

    http://infostart.ru/blogs/1085/

    Кстати «плюсики» можно и там ставить :-))))))

    Reply ↓
  13. Fisherru

    Если есть какие вопросы — пишите 😉

    Reply ↓
  14. SatanClaws

    (9): По жизни замечено, что при достижении размера *.dbf + *.cdx > 500 Мб — начинается вешалка. А если в магазине (у нас небольшие алкомаркеты) несколько касс, то они вообще конкретно мешают друг другу.

    Т.е. вешалка начинается при 500 метрах на фактически 1 рабочем месте, активно вводящем документы?

    Сурово у вас конфа написана, ничего не скажешь…

    По теме — идея интересная, такого способа (физически вынося неугодные таблицы) еще не видел…

    Чем определяете имена таблиц?

    Ручками парсите .dd файл или, скажем, через 1С++?

    Данные документов выгружаете/загружаете через «ЗначениеИзСтроки()/ЗначениеВСтроку()»

    Reply ↓
  15. SatanClaws

    (14) «Данные документов выгружаете/загружаете через «ЗначениеИзСтроки()/ЗначениеВСтроку()»»

    это был вопрос 🙂

    Reply ↓
  16. SatanClaws

    И еще вопрос — чем не подошел классический метод:

    обработка, которая копирует необходимую периодику введенную документами; создает документы вноса остатков, помечает на удаление ненужные документы и т.д.?..

    Reply ↓
  17. Fisherru

    (14)

    >Сурово у вас конфа написана, ничего не скажешь…

    :-))))))

    Самая любимая конфа :-). Писанная с «нуля» и максимально облегченная

    НО, факты есть факты.

    500 метров при огромной куче маленьких документов — это примерно размер

    1SCRDOC.DBF под 100 метров, заголовочной части расх.накл — под 150 Мб, табличной части расх.накл — за 50 Мб — остальное маленькое.

    И когда касса пытается под DBF-ом таскать подобные объемы для создать/записать /провести, а сервак — это обычный ПК — реально тормоза…

    Специфика, блин.

    А когда 2 кассы — вообще пипец. Они вместе(почти) нажимают «Провести» и всё — оба компа надолго задумываются, висят несколько минут — потом вываливаются из 1С из-за блокировок.

    В лучшем случае одна касса остается в программе.

    Лично наблюдал. После этого и решили резать.

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

    Так что на базах 2-3 Гига работают по 20 — 40 человек.

    А нынче вот на SQL перешли. Хоть объем и раздулся, но всё равно веселее стало 😉

    Reply ↓
  18. Fisherru

    (14)

    >идея интересная, такого способа (физически вынося неугодные таблицы) еще не видел…

    Когда только пришёл в эту компанию (уж лет 8 как), всё так и было как в описанном вами в (16) «классическом методе».

    Это после закрытия бокса с компьютером на рынке (раньше так было 🙂 )

    выдирали из него винт, цепляли в офисе на крутую банку и … вперёд!

    Не помню сколько там данных было, но если за ночь обрежется — зашибись 😉

    Очень долго удаляются документы. А если большой период, то тормаза в геометрической прогрессии. Типа 1 месяц — 20 мин, 2-й — 50, 3-й 1,5 — часа и так далее. Чего-то там в 1С не круто реализовано.

    А тут знакомый мастер подсказал — не парься : выгрузил, прибил *.dbf, загрузил. Да, нужно поработать — выгрузки загрузки написать…

    НО, итог, 20 минут и база обрезана!

    Reply ↓
  19. Fisherru

    (14)

    >Чем определяете имена таблиц?

    Всё просто (это в BAT-нике):

    rem — удаление всего кроме справочников

    del /Q Путь*.cdx Путьdh*.dbf Путьdt*.dbf

    del /Q Путь
    a*.dbf Путь
    g*.dbf Путь1sblob.dbf

    del /Q Путь1scrdoc.dbf Путь1sdnlock.dbf Путь1sjourn.dbf

    del /Q Путь1SCONST.dbf ПутьSYSLOG*.*

    Можно и со справочниками побаловаться, если они распухли и в таком виде не нужны…

    Reply ↓
  20. Fisherru

    (15)

    >»Данные документов выгружаете/загружаете через «ЗначениеИзСтроки()/ЗначениеВСтроку()»»

    Нет знаете ли, как-то так исторически сложилось, что всё ручками, каждый реквизит в отдельное поле.

    Знаю — не универсально. 🙁

    Может когда и через метаданные напишем, но коль это уже скока лет живёт, добавить 1-2 новых реквизита — гораздо проще 🙂

    Reply ↓
  21. Fisherru

    P.S.

    «Принципы выполнения Выгрузки / Загрузки данных при обрезании БД удаленного магазина»Кстати «плюсики» можно и там ставить :-))))))

    Извините предыдущая ссылка чёт не работала, эта вот вроде правильная:

    http://infostart.ru/blogs/1085/

    Reply ↓
  22. Ёпрст

    Жесть…

    База в 500 метров вместе с cdx — это вообще оооооочччченнннь ммаааало, чтоб её резать.

    А длинные строки как, которые в блобе валяются ?

    Свёртка + прибитие файлов — вообще мегабоян..

    Резать такую маленькую базу не в конце года — вообще моветон.

    Книжки покупок/продаж вообще не ведёте?

    Взаиморасчеты с клиентосами/поставщиками — тоже ?

    Reply ↓
  23. Ёпрст

    +22 Посмотрел Выгрузка_Загрузка … тихий ужас.

    Reply ↓
  24. Fisherru

    (22)

    В 17 посте уже рассказал что и почему надо резать, привел размеры dbf-ок которые по сети тягаются туда — сюда…

    Там где документов мало : 100-200 в день (наши строительные супермаркеты),

    нормально доживают и работают и при 1-1,5 Гигах, то есть там приведённые выше размеры активно юзающихся dbf-ок достигаются при 1-1,5 Гигах общего размера базы!

    Если нет подобного личного опыта — лучше не комментировать.

    Я это не из пальца высосал, а лично наблюдал.

    От длинных строк вообще отказались, поэтому блоб пуст.

    Открою секрет — длинные строки = страшные тормоза — бегите от них.

    Если, к примеру, элементы справочника номенклатура имеют длинную строку (типа описание), то при бегании вверх-вниз по форме списка справочника — страшное замедление. ДАЖЕ если их и не выводим на экран.

    В 1С длинные строки реализованы через ж…

    Reply ↓
  25. Ёпрст

    (24) http://www.forum.mista.ru/topic.php?id=334679&page=1

    «Лично он наблюдал» ..ппц.

    Детсад.

    Reply ↓
  26. Fisherru

    (22)

    >Свёртка + прибитие файлов — вообще мегабоян..

    Вот это я не понял — все нормальные программисты, делают новые чистые базы, ну или обрезают, через выгрузку(если надо) / удаление dbf / загрузку(если надо) — очень быстро…

    >Резать такую маленькую базу не в конце года — вообще моветон.

    >Книжки покупок/продаж вообще не ведёте?

    >Взаиморасчеты с клиентосами/поставщиками — тоже ?

    Замечу, это база магазина (она только для торговли), когда достигает нужного размера или тормоза начинается — тогда и режем…

    Вся информация с магазинов стекается в сводную базу в офисе.

    Тут и ведём всякие долги и прочее-прочее.

    СВОДНУЮ базу режем только с Нового года (если нужно)

    Сейчас сводная на SQL превышает в размере 10 Гиг.

    В ней активно работают до 20-30 человек — всё путем 😉

    В общем повторюсь — своя специфика, кто её не имеет — тот не поймет.

    Reply ↓
  27. Ёпрст

    +25 на сегодняшний день в одной базе *.DBF 10,9 Гб

    размер самой большой дбф-ки 951 метр …

    база с середины 2008 года..

    Reply ↓
  28. Ёпрст

    +27 активных юзверей — 60-70…и всё летает.

    Reply ↓
  29. Ёпрст

    (26) У вас в базе — 1 регистр, который ВЫ запросом выгружаете… дальше собственно, разговор можно закрывать…

    мини склад млин..

    Reply ↓
  30. Ёпрст

    +29 Причем, выгружаете весьма экзотическим способом…

    Reply ↓
  31. Fisherru

    (25)

    Не хочешь не верь

    Reply ↓
  32. Ёпрст

    (31) Верить чему ?

    Что базу , в !!! 500 !!! метров это вместе с CDX, т.е реально она 100-200 метров нужно резать? И притом, что для учета там всего 1 (ОДИН) регистр ?

    Конечно верю!

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

    Reply ↓
  33. Fisherru

    (27)(28)

    Везёт 😉

    У нас в магазинах в качестве серваков стоят Интел коре дуо 1,8,

    да и винты обычные — может в этом дело?

    Reply ↓
  34. Fisherru

    >Посмотрел Выгрузка_Загрузка … тихий ужас

    >Причем, выгружаете весьма экзотическим способом…

    А чего не так?

    Reply ↓
  35. Ёпрст

    (34) Да всё..

    🙂

    Выгружать Запросом — моветон, когда есть ВыгрузитьИтоги…

    Скидывать всё в dbf, используя XBase … тоже

    Загружать потом обратно, привязываяс к коду справочника — тоже…

    Ну и т.д.

    Reply ↓
  36. Fisherru

    (32)

    Какие-то пропорции неправильные…

    Вот в реально обрезанной базе у нас такие пропорции:

    CDX- 168М, DBF-433М

    И потом цифру 500 мы для себя выбрали — для профилактики

    На самом деле они работают и при больших размерах

    Самые-то коллизии начинаются – если 2 и более касс стоят, вот когда они пытаются одновременно юзать по сети

    1SCRDOC.DBF под 100 метров, dbf заголовочной части расх.накл — под 150 Мб

    Вот тогда пипец – это собственно я и наблюдал…

    Reply ↓
  37. Ёпрст

    Если уж так хочется резать, путём прибития DBF, то хотя бы так:

    del -Y *.cdx

    del -Y 1sjourn.dbf

    del -Y dt*.*

    del -Y dh*.*

    del -Y ra*.*

    del -Y rg*.*

    del -Y 1SACCS.DBF

    del -Y 1SBKTTL.DBF

    del -Y 1SBKTTLC.DBF

    del -Y 1SENTRY.DBF

    del -Y 1SOPER.DBF

    del -Y cj*.*

    Далее ТиИ + галка очищать ссылки, удалять данные объектов.

    Останется база токма со справочниками.. без лишних ссылок на объекты..

    Потом думать о периодике и прочей муре.

    Reply ↓
  38. Ёпрст

    +37 Но один хрен, если ведётся книга покупок/продаж — так не делают…

    Если нужна аналитика в партиях (для тис, к примеру) тоже…

    если нужна аналитика по КредДокументу — тоже..

    и т.д.

    Reply ↓
  39. Fisherru

    (35)

    Да ладно, работает же 😉

    Всё как-то исторически сложилось 🙂

    А что касается «ВыгрузитьИтоги» — задумаюсь, как-то до сих пор не использовали…

    Тем более наша ВыгрузкаОстатков через запрос идёт около 10 секунд. стоит ли париться?

    >Скидывать всё в dbf, используя XBase — тоже моветон

    а как можно лучше? подскажите…

    >Загружать потом обратно, привязываяс к коду справочника — тоже…

    а как же по другому?

    Reply ↓
  40. Fisherru

    (37)

    del -Y 1SACCS.DBF

    del -Y 1SBKTTL.DBF

    del -Y 1SBKTTLC.DBF

    del -Y 1SENTRY.DBF

    del -Y 1SOPER.DBF

    del -Y cj*.*

    у нас в торговле этого нет

    Reply ↓
  41. Fisherru

    Нету у нас? самописное всё с «нуля»

    > книга покупок/продаж

    > аналитика в партиях

    > аналитика по КредДокументу

    И вообще, я тут собственно с другого начал — с BAT-ника

    Выгрузки/загрузки — не презентовал, не хвалюсь я ими — самые рядовые

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

    Reply ↓
  42. Ёпрст

    (39) А ты сравни метод ВыгрузитьИтоги с установленым фильтрами со своим запросом…

    ЗначениеВСтрокуВнутр/ЗначениеИзСтрокиВнутр — поимеешь сразу сам объект, и не надо ничего искать…это самое простое.

    Reply ↓
  43. Fisherru

    А справочники ни с регистрами ни с документами никак не связаны — не трогаем их и всё.

    Если просто убить регистры и документы и почистить периодику — то просто получим чистую базу для нового магазина.

    Reply ↓
  44. Fisherru

    (42)

    Спасибо, вот это интересно.

    Проста так обмены ещё до меня были написаны и я особо не углублялся…

    Reply ↓
  45. Fisherru

    >ЗначениеВСтрокуВнутр/ЗначениеИзСтрокиВнутр — поимеешь сразу сам объект, и не надо ничего искать

    Не очень догнал

    Сейчас, при загрузки документа, я для заполнения у него реквизита «склад», например, ищу по переданному коду склада в справочнике складов и подставляю найденный элемент.

    А как будет по новому?

    Можно кусок кода для примера?

    Reply ↓
  46. Ёпрст

    (45) а так не будешь искать, а сдлаешь Склад = ЗначениеИЗСтрокиВнутр(ранее сохраненная строка, как ЗначениеВСтрокуВнутр(Склад));

    Reply ↓
  47. Fisherru

    Попробую

    Reply ↓
  48. Fisherru

    (46)

    Кстати, экспериментальным путем получено, что при использовании

    ЗначениеВСтрокуВнутр(Объект) длинна возвращаемой строки 44 символа или бывает больше?

    Сколько нужно в Dbf-ке на длину поля резервировать?

    Reply ↓
  49. UncleVader

    (48) Вообще-то DBF для обмена данными — прошлый век, я юзаю XML и всем советую

    Reply ↓
  50. SatanClaws

    (49) Помниться, XML-парсер из v7plus.dll в чем-то был нестабилен…

    А с ДБФ — все просто и примитивно.

    К тому же — есть индексация.

    Reply ↓
  51. UncleVader

    (50) Хм… что-то я не наблюдал никакой нестабильности

    Примитивность ДБФ накладывает ограничения и неудобства

    Reply ↓
  52. Fisherru

    (49)

    А в чем выигрыш?

    В объеме выгрузки или в скорости?

    С XML-лем немного баловался когда делал выгрузку данных из 1С на платёжный терминал…

    Там структура передаётся построчно и, субъективно по мне, мене визуально читабельная, чем четко определенные поля DBF.

    Reply ↓
  53. Fisherru

    (42) (46)

    Побаловался я с ЗначениеВСтрокуВнутр/ ЗначениеИзСтрокиВнутр

    И понял, почему мои предшественники отказались от использования данной технологии…

    1. Скорость загрузки/выгрузки никаким образом не меняется ни в какую сторону,

    2. Объем выгрузки только возрастает в разы, так как передаем не код – 4-5 цифр, а строку 50 символов – а это возрастание трафика…

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

    4. ПОЛУЧАЕТСЯ ПОЛНАЯ ЛАЖА

    Поэкспериментировал я с выгрузкой загрузкой товаров, по старому с поиском через код и по-новому через ЗначениеВСтрокуВнутр/ ЗначениеИзСтрокиВнутр – сумма остатков загруженных в базы разошлась на большую цифру – порядка 30 %

    Начал рыть

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

    Ниже приведен пример одних и тех же товаров в разных базах, только первый товар совпадает по внутреннему представлению, остальные 2 – нет !!!

    Сводная база

    Товар = Абсент «Тунел Зеленый» 0,7*6 70% Испания

    Товар.Код = «5065»

    ЗначениеВСтрокуВнутр(Товар) = «{«B»,»0″,»0″,»14″,»0″,»0″,» 5061 «}»

    Товар = Бренди «Кондор» ХО в п/к 40% 0,7*12 Франция

    Товар.Код = «0»

    ЗначениеВСтрокуВнутр(Товар) = «{«B»,»0″,»0″,»14″,»0″,»0″,» 5062 «}»

    Товар = Абсент «Тунел Красный» 0,7*6 70% Испания

    Товар.Код = «5066»

    ЗначениеВСтрокуВнутр(Товар) = «{«B»,»0″,»0″,»14″,»0″,»0″,» 5063 «}»

    База магазина

    Товар = Абсент «Тунел Зеленый» 0,7*6 70% Испания

    Товар.Код = «5065»

    ЗначениеВСтрокуВнутр(Товар) = «{«B»,»0″,»0″,»14″,»0″,»0″,» 5061 «}»

    Товар = Бренди «Кондор» ХО в п/к 40% 0,7*12 Франция

    Товар.Код = «0»

    ЗначениеВСтрокуВнутр(Товар) = «{«B»,»0″,»0″,»14″,»0″,»0″,» 5065 «}»

    Товар = Абсент «Тунел Красный» 0,7*6 70% Испания

    Товар.Код = «5066»

    ЗначениеВСтрокуВнутр(Товар) = «{«B»,»0″,»0″,»14″,»0″,»0″,» 5060 «}»

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

    Reply ↓
  54. Fisherru

    +53

    Поправлюсь.

    Для обрезания одной базы (выгрузка и загрузка в одной базе)- это подходит, но только из-за красоты кода — стоит ли переписывать?

    А вот для выгрузок и обменов документами и справочниками между Сводной ба

    Reply ↓
  55. Mikeware

    (11) Проблема не «с аптеками», проблема с ДНК…

    Reply ↓
  56. Fisherru

    (55)

    Надеюсь выскажу мнение большинства:

    «Инфостарт не площадка для пикировок, а место для конструктивного диалога единомышленников» 🙂

    Reply ↓
  57. vip

    (53) А какое отношение имеет код к внутреннему ID элемента справочника?

    Reply ↓
  58. Ёпрст

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

    Бред сивой кобылы в лунную ночь…

    Даже лень объяснять почему…

    Reply ↓
  59. Fisherru

    (57)(58)

    Может мы о разном говорим?

    Код — базовый реквизит элемента справочника.

    Кроме того есть ещё внутренний ID элемента.

    Они НЕ взаимосвязаны (у части товаров они совпадают(последняя цифра в ЗначениеВСтрокуВнутр), но потом разьезжаются).

    Если говорить о том, что мы выгружаем документы, потом прибиваем их, в базе остаются только справочники, а потом мы загружаем документы обратно и нужно их заполнить по справочникам, то нам всё равно по чем искать по Коду элемента или по внутреннему ID, так как справочник как был до обрезания, так и остался после него.

    НО, если у нас документы (Закуп, например), как и элементы справочника рождаются в Центральной базе, а потом мигрируют в БД удалённых магазинов,

    то «Внутренний ID» использовать нельзя, я показал выше, что в разных базах «Внутренний ID» товаров различается (у меня на практике процентов 10-20 разьехалось).

    А поскольку, при заведении элемента справочника в БД удалённого магазина, я принудительно устанавливаю ему КОД как в центре, то они у меня везде одинаковые — его и используем.

    Reply ↓
  60. Fisherru

    (58)

    Отсылаю к моему посту (56)

    Reply ↓
  61. Ёпрст

    (59) Ну привет.. если разные ID — это автоматом РАЗНЫЕ элементы.

    Какая на синхронизация по коду может быть вообще ?

    Reply ↓
  62. vip

    (59) > элементы справочника рождаются в Центральной базе, а потом мигрируют в БД удалённых магазинов,

    то «Внутренний ID» использовать нельзя, я показал выше, что в разных базах «Внутренний ID» товаров различается (у меня на практике процентов 10-20 разьехалось).

    ответ в (58)

    С чем у тебя «Внутренний ID» товаров различается?

    Ты не совсем понимаешь, как в базе хранятся элементы справочников.

    Reply ↓
  63. Ёпрст

    «Нам всё равно по чему искать»

    Ну что за бред..

    Товаров с одинаковым кодом можно наплодить до едрени фени, а вот с одинаковыми ID — хрен.

    И еще, у некоторых справочников, вообще нет ни кода ни наименования.

    Reply ↓
  64. vip

    (1) > А вообще у нас ещё много разных интересных технологий 😉

    А вот теперь не сомневаюсь :))

    Reply ↓
  65. Fisherru

    (62)

    Правда, очень надеюсь, что понимаю 😉

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

    Прикиньте и работает 😉

    Не забывайте, всё пишем сами и под себя — с «нуля»

    (63)

    И справочники нужные у нас «с кодом» и крыжики уникальности кода стоят, там где надо, и коды мы сами рождаем в удалённых базах -в общем всё хорошо у нас и все счастливы.

    Вернусь к (62)

    Я привел пример:

    Что один и тот же товар в сводной базе и базе удалённого магазина имеют раный внутренний ID

    Сводная база

    Товар = Абсент «Тунел Красный» 0,7*6 70% Испания

    Товар.Код = «5066»

    ЗначениеВСтрокуВнутр(Товар) = «{«B»,»0″,»0″,»14″,»0″,»0″,» 5063 «}»

    База магазина

    Товар = Абсент «Тунел Красный» 0,7*6 70% Испания

    Товар.Код = «5066»

    ЗначениеВСтрокуВнутр(Товар) = «{«B»,»0″,»0″,»14″,»0″,»0″,» 5060 «}»

    То есть если я выгружу из сводной ID «{«B»,»0″,»0″,»14″,»0″,»0″,» 5063 «}»,

    То в базе магазина он найдёт мне совершенно другой товар.

    Reply ↓
  66. Ёпрст

    (65) Это — РАЗНЫЕ элементы с одним названием.. неужели не понятно?

    Reply ↓
  67. vip

    (65) > То в базе магазина он найдёт мне совершенно другой товар.

    И правильно сделает, т.к. это и будет совершенно другой товар.

    > Правда, очень надеюсь, что понимаю 😉

    Зря надеешься.

    Reply ↓
  68. Ёпрст

    + 66 Советую ознакомиться, на будующее

    http://www.script-coding.info/v77tables.html#1.1

    Reply ↓
  69. vip

    (66) Есть смутные сомнения, что у автора не УРБД, а самопальный обмен.

    По молодости таким баловался, работало, но проклял все на свете.

    Reply ↓
  70. Fisherru

    А вообще, я это все затевал ТОЛЬКО для представления технологии использования BAT-файла.

    Выгрузки / загрузки выложил по просьбе конкретных людей — они (эти обработки) ни на что не претендуют. Просто у нас вот так, и всё хорошо.

    Если у вас тоже всё хорошо, но по-другому — замечательно…

    (63)(64)

    А вы правда верите, что я всю эту тему замутил, чтобы просто постебаться?

    Реально, на всю работу потрачено много времени и экспериментов (не имею ввиду технологию выгрузки/загрузки их заготовки брал из того, что уже 100 лет используем, только доработал что нужно) — и работа завершена.

    Результатом стало то, что в случае тормозов магазина из-за размера базы (а 500 это метров или 5 Гиг — без разницы).

    Я звоню в магазин, управляющая входит в 1С, запускает обработочку, которая делает BAT-файл, выходит из 1С, запускает BAT-файл и идет курить.

    10 — 20 минут и база обрезана до минимальных 100 Метров — можно работать.

    Всё 🙂

    Reply ↓
  71. Ёпрст

    (69) Нам этого не понять.. Люди понимашь, на собственной нетленке с !одним! регистром учет ведут 10 лет и режут базу при 500 метров..

    А ты говоришь кода..кода..

    🙂

    Reply ↓
  72. Fisherru

    (69)

    Ага, самописное всё 🙂

    Не, у нас нормально, всё катит.

    Reply ↓
  73. vip

    (72) Так все-таки не УРБД?

    Тогда вопросов больше не имею.

    Reply ↓
  74. Fisherru

    А у нас всё автоматизировано (ну почти всё)

    На примере 1-го направления (деятельности).

    Есть оптовая компания, которая работает с клиентами и тарит нашу розничную сеть на 95% номенклатуры — 1 база.

    Розничная компания — 1 сводная + 135 (пока) удаленных магазинов (БД).

    Примерный режим работы:

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

    2. Если нужно, офис-менеджеры их корректируют и хлоп кнопочку – заявки в БД оптовой компании выгрузились / загрузились в виде отгрузок (разбитые по тоннажу, складам, товарному составу)

    3. Если нужно, офис-менеджеры их корректируют и хлоп кнопочку и эти отгрузки в виде закупа обратно в сводную базу розничной сети улетают, а заодно и корректировавшиеся (в оптовой базе) отгрузки предыдущих периодов (автоматом) прихватываются.

    4. Офис-менеджеры хлоп кнопочку и этот «Закуп» и изменёнными закупами предыдущих периодов на магазины по инету уезжают. Каждый пакет на свой магазин.

    5. Там управляющие их грузят.

    Ну а справочники – вечером выгрузили – хлоп кнопочку – всё на магазины по инету уезжает.

    И никакого УРБД-ного гемора…

    Правда хочу вместо этих 4-к кнопок – 1 большую нарисовать, но руководство пока морально не готово :-)))))))))))))

    Reply ↓
  75. Fisherru

    P.S.

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

    Грабли были, но единожды, из-за вирусов.

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

    Поскольку у меня таким образом не осталось копии ДО обрезания, пришлось тормозиться и вытаскивать ночную копию. Потом лечились от вирусов и всё по новой.

    В дальнейшем стали перед обрезанием делать ещё одну предварительную копию, чтоб наличие вирусов вычислить…

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *