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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2024-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 не будет опубликован. Обязательные поля помечены *