"Перемещение" товаров между организациями в УТ 10.3




Принцип обмена данными из 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='\

30 Comments

  1. LavS

    А можно скриншот покрупнее? Помню мне как-то доводилось делать аналогичную обраотку ещё под УП 10.2:)

    Reply
  2. ValeraEm

    выложил покрупнее

    Reply
  3. ValeraEm

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

    Reply
  4. sdv88

    если ИП торгует в розницу то эта операция оформляется же документами «Чек ККМ»? тогда почему список формируется на основании документов реализации?

    Reply
  5. ValeraEm

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

    Reply
  6. sdv88

    Спасибо. а документами реализации можно оформлять розничные продажи? получается на каждую продажу счет фактуру чтоли делать? я уже переписал обработку теперь она формирует список из документов «отчет о розничных продажах».

    Reply
  7. puhin

    (7) sdv88, а можешь выложить переделанною обработку или на почту отправить?

    Reply
  8. margo2007

    Частная задача.

    Reply
  9. V.Nikonov

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

    Кроме того, регистр добавляет универсализм в плане множества организаций входящих в Компанию.

    Лично для себя организовывал оба подрежима: По минусовым остаткам регистра и по продажам за период. А сейчас добавил третий — к каждому расходному документу формирую связанную цепочку перепродаж.

    Вот только обработка рассчитана на мою переписанную УТ (соответственно нет смысла публиковать).

    Reply
  10. V.Nikonov

    Кстати, просба уточнить виды и режимы формируемых документов. В частности оставляется ли флаг ОтражатьВУправленческомУчете (соответственно происходит создание новых партий)? Или всё на откуп оператору (он может сохранить документы в любом виде и в любом количестве)?

    И уточните способ «убивать серии»… (Что, производится перезаполнение и перепроведение ранее созданных?)

    Сейчас качать всё подряд совсем не хочется… поэтому хочется полного ознакомления с используемой методикой.

    Reply
  11. ValeraEm

    (11) Типовые документы «Реализация товаров и услуг» и «Поступление товаров и услуг». Флаг стоит. Естественно списываются старые партии и создаются новые. Серии «убиваются»/списываются при реализации (самому себе), поступление на ИП формируется уже без серий.

    Reply
  12. V.Nikonov

    Переделка Партий хороша только для случая, когда Себестоимость передаётся в Бухгалтерский учёт. С точки зрения Оценки Эффективности продаж Группы Компаний — крайне неудобно! Левый вал продаж (объём «перемещений») не так просто фильтруется. К тому же, в объёме присутствуют «неэффективные продажи» собственной фирме с малой наценкой, и занижена наценка Конечному покупателю.

    Reply
  13. ValeraEm

    (13) Бизнес-процесс владельцы выстроили еще до автоматизации (УТ только инструмент:) … Фильтровать продажи самому себе — в общем то совсем не проблема, да и не нужно. Ну а про занижение наценки конечному пользователю — такого в принципе не может быть, менеджера тут же уволят.

    Reply
  14. V.Nikonov

    И каким же отчетом смотрят результаы продаж с точки зрения Наценки?

    Не просматривать же заказы поштучно?

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

    Reply
  15. ValeraEm

    (15) В моем случае результаты с т.з. наценки владельца не интересовали.

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

    Reply
  16. Karglak

    Нужная обработка, у клиента как раз такая же ситуация. Оформление за период представляется менее удобным, чем по отрицательным остаткам.

    Reply
  17. V.Nikonov

    (17) Karglak,

    Следующая обработка работает по остаткам Организации и заодно формируют сводную перепродажу за период.

    см. http://infostart.ru/public/79693/

    Reply
  18. DoctorRoza

    У меня подобная ситуация у клиента, только 3 организации — на одной учитывают НДС, на другой — не учитывают и 3- я розница. И нужно организовать перемещение из 2-х организаций в розницу и продать товар. Только не совсем понятно, разве перемещением можно утаить от налоговой итоговую выручку!? Чувствую, буду переделывать обработку под себя, но все равно, плюс однозначно!

    Reply
  19. V.Nikonov

    (19) DoctorRoza,

    В большинстве случаев играться можно только общей суммой НДС начисленной. В таком случае, достаточно при перепродажах между организациями (Орг с НДС -> Орг на вмененке) применять минимально допустимые цены, итого можно сократить сумму НДС начисленную.

    P.S. Я создавал обработку перепродажи с заполнением Минусами остатков Организаций, а затем игрался с ценой и ассортиментом для оптимизации НДС начисленного. Моя Обработка «Очередная продажа собственной фирме» к сожалению не проверяет достаточность остатка Организации-Продавца для покрытия всего минуса Организации покупателя. Соответственно в случаях, когда Орг-Продавец не «поставляла» товар, то произойдёт перенос Минуса от Орг-Покупатель к Орг-Продавец. В моём случае, это была экзотика, соответственно подобную проверку не подключал.

    Reply
  20. DoctorRoza

    Вот я сейчас сижу и колдую над этой ситуацией. В принципе, тут не сложно получать остатки и сравнивать с требуемым количеством. Жаль, что 10.3 не реализована передача между организациями! Может еще появится! ))

    Reply
  21. V.Nikonov

    На сей момент единственную Конфу со штатной перепродажей знаю — «УТ 11». Но на этом и ещё на встроенном «Управляемом приложении» прелести для небольшой организации заканчиваются…

    По слухам, 1С предпочитает свернуть развитие всех торговых программ.

    Reply
  22. tehas

    как раз, то что искал, спасибо

    Reply
  23. 4ish

    (10) «Лично для себя организовывал оба подрежима: По минусовым остаткам регистра и по продажам за период.»

    А как быть, если складов несколько? На одном продаем в минус, на втором этих продаж не видим. В результате — можем продать товара больше, чем его было на складе. И, соответственно, реализация не проведется.

    Reply
  24. V.Nikonov

    (24) 4ish В случае УТ и УПП все зависит от метода учета остатков по Организациям: Если ведется учет остатков Организаций в разрезе Складов, то и формировать перепродажи надо по каждому из складов. А если собственность не распределяется по складам, то склад носит чисто номинальный характер (разумеется в варианте без Управленческого учета)…

    Reply
  25. revned

    такая же задача появилась.

    только нужно, чтобы все автоматически делалось..

    думаю, сделать подписку — при проведении реализации, и смотреть — если не хватает товаров у розничной организации, то делать реализациюпоступление с нужным количеством товаров.

    Что скажете?

    Reply
  26. V.Nikonov

    С подпиской несколько сложнее. Не всегда формируемый документ будет сделан с первой попытки ПРАВИЛЬНО. Он может неоднократно подвергаться исправлению, и соответственно многократно будет передалываться (или хуже того формироваться дополнительные) документы перепродажи.

    Соответственно логичнее запускать пакет перепродажи оператором вручную.

    У нас, модифицирована программа. Через реквизит «ДокументОснование» можно завязывать всю цепочку перепродаж (в структуре подчиненности), если соответствующие изменения внести и в «КритерииОтбора/СвязанныеДокументы».

    А для формирования перепродажи запускается из документа обработка ПродажиСобственнойФирме.

    Хотя для многих Компаний прокатит и постобработка (по итогам недели месяца, или дня) анализирующая Отрицательные остатки Организаций.

    Reply
  27. V.Nikonov

    (26) revned, Кроме того, рекомендую сделать Функцию объекта или глобальную функцию. Ранее сформированные документы должны однозначно находиться и перезаполняться автоматически.

    Reply
  28. V.Nikonov

    (26) revned, Еще на правах рекламы собственного варианта предлагаю ознакомиться с http://infostart.ru/public/79693/

    Reply
  29. revned

    (29) V.Nikonov, Спасибо за советы. Про изменение документа сразу и не учел.. Еще не взялся делать, возможно и не нужно будет, хватит и обработки, которую вручную запускать будут.

    Reply
  30. Prelude

    По мне вот это самая лучшая из того, что встречал http://infostart.ru/public/19419/

    Reply

Leave a Comment

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