Остатки ЕГАИС. 1С:Розница




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

33 Comments

  1. webandroid

    бесполезно, т.к. объем нужно в названии номенклатуры дописывать (есть обработки) а алкокод что даст? вы его глазом из акцизной марки будете сканировать, вычленять и сравнивать?

    Reply
  2. gigabyte-leha

    Этот отчет берет название номенклатуры из справочника классификаторы алкогольной продукции, а узнать какой алкокод зашит в акцизе можно через специальный сайт.

    Reply
  3. Гость

    Хороший отчет, мне пригодился! Все понятно доступно.

    Reply
  4. niki295

    Сейчас занимаюсь остатками, отчетик бы пригодился, но не хватает 1sm, может уступите?

    Reply
  5. gigabyte-leha

    Могу, чуть позже на сегодня сделаю 1sm

    Reply
  6. niki295

    Спасибо огромное, я уже другую Вашу скачал )

    Reply
  7. LINDA_N

    Скачала вариант №2. Обработку считаю полезной, так В 1С Разнице, даже применяя универсальные отчеты, невозможно бухгалтеру сделать свод-сопоставление остатков в ЕГАИС и на складе. Очень необходимо внести следующие изменения в эту прекрасную обработку :

    1) В отчет не попадают позиции номенклатуры, по которой в ЕГАИС нулевые остатки, а на складе числится остаток(может быть и плюс, и минус — ошибки учета). На практике при номенклатуре более 1000 позиций номенклатуры очень трудно выловить эти расхождения. Я, бухгалтер, потратила на это 4 часа!

    2) Было бы удобнее сверку вести не от последнего запроса Остатков в ЕГАИС, а дать возможность выбрать запрос. Соответственно, остатки на складе для сопоставления формировать на дату запроса.

    Reply
  8. gigabyte-leha

    Пока нету возможности сделать изменения, как появится время займусь этим вопросом.

    Reply
  9. Protman

    (2)

    Этот отчет берет название номенклатуры из справочника классификаторы алкогольной продукции, а узнать какой алкокод зашит в акцизе можно через специальный сайт.

    Розница 2.2.5.27 сама нормально может запросить остатки по складу и в торговом зале ЕГАИС. В принятом xml с остатками уже есть информация какое наименование и какой алкокод… Вот только было бы гораздо полезнее в отчёте видеть остатки фактические и остатки с ЕГАИС чтобы узнать расхождения вовремя… По алкокоду будет видно пересорт…

    Reply
  10. gigabyte-leha

    Вторая картинка и вторая версия отчета как раз такую информацию и выводит!

    Reply
  11. CrimeanWind

    (10)с номенклатурой ваш отчёт не сравнивает? по изображениям не ясно

    Reply
  12. gigabyte-leha

    Смотрите описание «v.2 Во второй версии отчета, формируются данные остатки ЕГАИС и учетные остатки, сгрупировано по номенклатуре и если есть связь несколько алкогольной продукции к одной номенклатуре, отчет выведет данные в иерархии. Также можно сделать отбор по конкретной номеклатуре

    Reply
  13. CrimeanWind

    (12)спасибо, отличный отчёт!

    Пара моментов, которые улучшили бы:

    1. Колонка, в которой в которой были бы данные (Сумма всех привязанных аклокодов) — (Остаток номенклатуры).

    Можно было бы сразу понять куда обратить внимание. Где нужно списать, а где поставить на баланс.

    2. Отбор по алкокоду

    Будут видны различия по конкретному АК, кроме того:

    Сейчас нередко встречается, что у разных номенклатур один алкокод [Это могут быть обычная бутылка и наборы с бокалом, стандартная и сувенирные бутылки и т.д.]. Подвязывают один АК к разным номенклатурам через РегистрСведений.СоответствиеНоменклатурыЕГАИС

    3. Отбор по времени и файлу остатков.

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

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

    Reply
  14. CrimeanWind

    Для алкогольной продукции Наименование на наименование.полное было бы лучше сменить.

    Например, Массандровские вина многие сейчас отображаются так:

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

    Это не обязательно и не критично, в номенклатуре есть назвние, но для рядового пользователя будет удобнее заодно проверить и сопоставление, т.к. многие до сих пор лажают ещё при оформлении прихода.

    Что-то накатал я тут целую простыню текста, не считайте за критику 🙂

    Reply
  15. gigabyte-leha

    Спасибо за отзыв, в следующей версии отчета учту все указанные нюансы.

    Reply
  16. Belou8rs

    Скачал не работает в новой версии 1С Розница 2.2.6.18

    Reply
  17. gigabyte-leha

    Для версии 2.2.6.18 еще не чего не работает.

    Reply
  18. KirillRols

    Для 6.22 не работает.

    Reply
  19. KirillRols

    Отчёт очень полезный, обновите, пожалуйста под 6.22

    Reply
  20. gigabyte-leha

    В ближайшее время обновлю.

    Reply
  21. KirillRols

    Что-нибудь получается?

    Reply
  22. gigabyte-leha

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

    Reply
  23. KirillRols

    Просто подписка скоро кончится

    Reply
  24. user949408

    Ребят как запрос по остаткам из ЕГАИС сделать, не могу добавить в запрос номенклуатуру.

    Reply
  25. gigabyte-leha

    В Рознице в складе есть запрос остатков

    Reply
  26. juricher

    Не захотела работать обработка

    Reply
  27. gigabyte-leha

    Версию 2.2.7* не поддерживает.

    Reply
  28. juricher

    (27) И не собираетесь поддерживать? Плохо.. Очень жаль 2 монеты. Очень. Тогда прошу возвратить 2 монеты. В описании было написано 2.2

    Reply
  29. gigabyte-leha

    Поддержка 2.2.7 и выше не планируется. Читайте внимательно описание!!!

    Reply
  30. CrimeanWind

    (28)по поводу возврата это же вроде в техподдержку или владелец обработки тоже может вернуть?

    Reply
  31. juricher

    (29) Ок. Буду читать внимательно. Жаль.

    Reply
  32. Gendalf

    Жаль что ограничено версиями…. ((( Почти купил.!

    Reply
  33. gigabyte-leha

    Скорректировал отчет под версию Розницы 2.2.9.20.

    Reply

Leave a Comment

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