Контроль остатков при закрытии чека. Контроль остатков и резерва на складе. Алкоголь и по виду номенклатуры. 1С Розница 2.2.7-2.2.10




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

5 Comments

  1. dj_tol

    Странное расширение, да и сама идея. Розница по своей сути не должна контролировать остатки по продуктам и алкоголю(в онлайн продаже). Для корректной работы с алкоголем нужно знать подтверждена ТТН или нет(да и это не важно до конца 2018года, потом v3ЕГАИС), а не наличие остатков на складе. Если покупатель пришел с бутылкой водки на кассу, то товар в любом случае есть на складе(торговом зале).

    Reply
  2. omenfarsh

    (1)

    На практике часто бывает пересорт по производителям в 1С. Так же при внутренней инвентаризации часто забывают посчитать некоторые позиции АП и списывают их из ЕГАИС , а вскоре находят. Поставить их на баланс , а потом отчитываться перед РАР откуда лишний алкоголь? Или без контроля остатков продать в минус по ЕГАИС и опять вернуться к постановке на баланс лишней АП?

    Далеко не все товароведы идеальны. И далеко не все умеют вести правильный учёт. Расширения делал по просьбе реальных клиентов, у которых большой объём продаж алкоголя каждый день, и которые продают не только через 1С:Розница , но и через Офлайн-кассы Штрих и АТОЛ, где продажа происходит именно по штрихкоду , а не по морке как это сделали в 2.2.9.

    Винить клиента в криворукости можно бесконечно, но это не решает его проблемы.

    1) Клиент, у которого периодически на большом складе при пересчете АП пропускают минимум несколько бутылок, пользуется контролем остатков при пробитии чеков, но через 1С у него проходят продукты питания, снеки и т.д., остатки которых вести ему не надо и он тратит бешенное количество времени на внесение приходных накладных по этим продуктам, чтобы те пробивались по кассе. Для этого клиента сделал расширение для РМК.

    2) Клиент работает через офлайн кассу Штрих, которая умеет продавать только по штрихкодам. Часто товаровед не успевает обклеить этикетками бутылки другого завода, после чего некорректно формируется Отчёт о розничных продажах и на основании него списывается не то пиво Актом списания ЕГАИС. Для этого тоже включили контроль остатков на складе в правах пользователя, но уперлись в то, что теперь каждый лишний грамм колбасы или неучтенный чупа-чупс не даёт провести Отчёт о розничных продажах. Для данного клиента сделал расширение, которое при проведении документа проверяет остатки только по алкоголю. Остальные продукты будут выравнивать при ревизии.

    Reply
  3. dj_tol

    (2) Я всегда уважаю чужой труд и Ваш тоже. Сам пишу много под реальных клиентов и если смотреть со стороны покупателя, то с Ваших слов магазин большой, то я взяв водку отстояв очередь и мне потом говорят, что нет остатка на ККМ(а я водку в руке держу), я в этот магазин в следующий раз пошел бы в последнюю очередь(извините если обидел Вас, не в обработке дело я уверен, что она выполняет заявленный функционал). К сожалению на людей(персонал магазина) как на 1С обновления не выходят.

    Reply
  4. omenfarsh

    (3)

    Да обид никаких нет)

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

    Да и просто выдалась возможность в комментарии более подробно описать ситуацию почему, зачем

    и для кого делалось.

    Reply
  5. user1042801

    Добрый день.Можете скинь обработку «Запрет продажи в минус алкоголя в РМК».Просто из за одной обработки не очень хочется покупать стартмани).Почта koop-kruf96@mail.ru .Буду очень признателен

    Reply

Leave a Comment

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