Возврат товаров, проданных в прошлых кассовых сменах, через Чек ККМ на возврат




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

24 Comments

  1. oldcopy
    В Управлении торговлей 11.4 разработчики зачем-то сделали возможность делать «ЧекККМ на возврат» для Чеков ККМ сделанных прошлыми датами.

    Это не «зачем-то», а требования 54-ФЗ.

    Использовать напрямую стандартный механизм (Возврат товаров от клиента > Расходный кассовый ордер) бухгалтерия отказалась

    И правильно сделала. Потому что правильно — это оформить чек на возврат прихода.

    Это в свою очередь ведет к тому, что с включенным контролем остатков этот «Отчет о розничных продажах» не проводится.

    Контроль остатков в розничной торговле? Оригинально… Это если сказать мягко…

    По факту ваша обработка — производственная диверсия.

    Reply
  2. nagimo

    Эх, я бы и рад был бы, если бы все было так оптимистично, как вы пишете.

    Это не «зачем-то», а требования 54-ФЗ

    Согласен, этот момент не знал.

    И правильно сделала. Потому что правильно — это оформить чек на возврат прихода.

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

    Контроль остатков в розничной торговле? Оригинально… Это если сказать мягко…

    Не совсем розничная, а оптово-розничная. Напомню — это УТ 11.4. Несколько складов-магазинов, по одним оптовая торговля, по другим розничная.

    Но не в этом дело — контроль остатков для них очень важен, чтобы поддерживать хоть какой-то порядок.

    И я не пойму вопроса — неужели в розничной торговле контроль остатков не нужен?

    А по факту — не проводится документ «Отчет о розничных продажах», если в него попадает номенклатура из чека на возврат. Попадает она туда с минусовым количеством.

    Reply
  3. lunjio

    (1)

    Использовать напрямую стандартный механизм (Возврат товаров от клиента > Расходный кассовый ордер) бухгалтерия отказалась

    И правильно сделала. Потому что правильно — это оформить чек на возврат прихода.

    Вот здесь уже я не согласен, при формировании чека из такого расходника, разве не проставится возврат прихода, поэтому как раз правильная схема возврат -> расходный на основании возврата.

    Reply
  4. KonstantinTPH

    (3) вчера специально проверил оба варианта. В двух случаях печатается идентичный чек возврата прихода. И получается минусовой отчет по данной позиции, если в этот день она не была реализована (правда отчет у меня проводится с контролем остатков)

    Другое дело что из чека ККМ на возврат не напечатать заявление на возврат и сложно отслеживать и искать возвраты.

    По мне так схема работы через заказ на возврат, возврат и РКО единственно правильная.

    Reply
  5. oldcopy

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

    Розничная продажа отличается обезличенным подходом к контрагенту, 62P, в отличие от остальных 62-х имеет единственное субконто — склады, тогда как у остальных 62-х — это контрагент и договор.

    При розничной продаже мы будем иметь проводки Дт 50.1 — Кт 62Р при продаже и Дт 62Р — Кт 50.1 при возврате.

    Если оформлять возврат через Возврат + РКО то в цепочку проводок попадет 62.02, который требует гораздо большего документального оформления со стороны бухучета, потребуется договор с контрагентом и его паспортные данные. Т.е. на ровном месте возникает необходимость очень большого пласта первички для оформления операции возврата. Поэтому вполне понятно нежелание бухгалтеров так работать.

    Такая схема может и должна применяться в том случае, если с покупателем действительно составляется договор и дальнейшая поставка и возвраты осуществляется в рамках этого договора. Со всем сопутствующим документальным оформлением.

    А если речь идет об обычной рознице, то так делать неверно, плюс могут возникнуть вполне справедливые вопросы при проверке по поводу наличия договоров и их реального характера. При этом также следует учесть, что нормы 502 ГК РФ и ЗоЗПП не содержат требования предъявления покупателем паспорта или письменно оформлять заявление на возврат. Для этого достаточно кассового чека (хотя и это не является необходимым условием).

    Получается тупиковая ситуация: покупатель не обязан предъявлять паспорт и вполне может не иметь его с собой. А бухгалтер не имеет права отдать деньги по РКО без паспорта (и договора с покупателем). Выхода тут ровно два: обостряем конфликт и посылаем покупателя за паспортом, теряя его лояльность, либо отдаем ему деньги и закрываем документы левыми данными, либо с нарушениями их оформления.

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

    Reply
  6. oldcopy

    (2)

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

    Не нужен и даже вреден. Если товар стоит на витрине / лежит в корзине у покупателя — то он должен быть продан, независимо от того, есть ли он по остаткам. Актуальность остатков поддерживается инвентаризацией.

    (2)

    Они сами никак не могут понять как правильно.

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

    (2)

    Не совсем розничная, а оптово-розничная.

    Оптово-розничной торговли не бывает. Оптовая предусматривает наличие договора между покупателем и продавцом, т.е. проводки через 62.01 / 62.02, возвраты идут тоже в рамках договора и производятся через возврат — РКО, хотя последнее не обязательно, я могу не забирать деньги, а взять на них в рамках этого же договора иной товар. И опт — это практически всегда выписка товара без его физического наличия здесь и сейчас. Покупатель выписывает товар у менеджера по учетным остаткам и уже после этого идет получать товар на склад, может быть даже и не сегодня.

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

    Reply
  7. nagimo
    Reply
  8. oldcopy

    (7)

    Да и законодательные размышления не решают проблемы (хотя полезно, спасибо) — но пожалуйста больше конкретики относительно УТ 11.4.

    Законодательные размышления ставят рамки, которые мы обязаны соблюдать вне зависимости от того, как ведем учет, хоть в УТ, хоть в Экселе.

    (7)

    Вот выдержка из справки по документу «Возврат товаров от клиента»

    Эта информация устарела и не соответствует текущим законодательным нормам. Ниже прикрепил скриншот из Консультанта.

    (7)

    Конечно, есть вероятность, что это только мнение разработчиков 1С и конечно в идеале было бы хорошо то, что пишет oldcopy, но пока что в наличии версия торговли 11.4.6.188, где такой идеал не реализован.

    Это — устаревшая информация. Все необходимое в текущих версиях УТ реализовано, это именно то, что вы назвали:

    зачем-то сделали возможность делать «Чек ККМ на возврат» для Чеков ККМ, сделанных прошлыми датами

    Вы же для чего-то принялись изобретать велосипед, хотя более правильно было бы проводить отчет о розничных продажах без контроля остатков. Да и вообще надо было начать оттуда, посмотреть логику проведения и понять, то ли это недоработка УТ, то ли у вас что-то с настройками.

    Reply
  9. nagimo

    (4)

    правда отчет у меня проводится с контролем остатков

    А скажите, при этом сообщение какое-нибудь выдается? Или проводит без каких-либо ошибок?

    Reply
  10. KonstantinTPH

    (9)

    Знаете, ввёл вас в заблуждение. Контроль остатков организаций выключен. Другое дело, не понимаю почему с ним не даёт провести. Ведь это в отчете значения с минусом а по факту товар то прибавляется, какое ему дело до остатков если они увеличиваются!

    Я сейчас просто буду блокировать пробитие этих чеков по предыдущим сменам и верну возможность создавать только возврат на чеках в закрытых сменах.

    Reply
  11. oldcopy

    (10)

    Контроль остатков организаций выключен. Другое дело, не понимаю почему с ним не даёт провести. Ведь это в отчете значения с минусом а по факту товар то прибавляется, какое ему дело до остатков если они увеличиваются!

    Я сейчас просто буду блокировать пробитие этих чеков по предыдущим сменам и верну возможность создавать только возврат на чеках в закрытых сменах.

    А потом к вам придет покупатель с возвратом. Вы его пошлете за паспортом (потому что РКО), он обидится и потопает прямиком в Роспотребнадзор. И будет прав, потому что отсутствие у него паспорта не является основанием отказа в возврате.

    Либо вы отдадите деньги без паспорта и нарушите правила оформления кассовых документов, что может вылиться в 10 тыр штрафа по 120 НК РФ.

    Reply
  12. KonstantinTPH

    (11)

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

    Только интересно, перед кем я на ЕНВД должен свои РКО показывать…

    Reply
  13. nagimo

    (8)

    А вот статья с сайта ИТС: https://its.1c.ru/db/utovio/content/273/hdocот 14.03.2018 г.

    Получается для УТ 11.4 эта информация тоже устарела?

    Вы же для чего-то принялись изобретать велосипед, хотя более правильно было бы проводить отчет о розничных продажах без контроля остатков. Да и вообще надо было начать оттуда, посмотреть логику проведения и понять, то ли это недоработка УТ, то ли у вас что-то с настройками.

    Именно оттуда всё и началось. Поэтому сначала делали через отключение контроля остатков (пару документов и только главный бухгалтер).

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

    Таким образом — по оптовому складу (для оптовых продаж) требуется контроль остатков, по розничному, как вы пишете, нет.

    Значит решение — использовать тот алгоритм, который предлагает 1С уже в 2018 г., когда 54ФЗ уже действует.

    А для этого и потребовалась доработка.

    Reply
  14. oldcopy

    (12)

    Даже пытаться не буду Вам рассказывать как мы работаем

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

    (12)

    Только интересно, перед кем я на ЕНВД должен свои РКО показывать…

    ЕНВД уже отменило кассовую дисциплину?

    (13)

    Значит решение — использовать тот алгоритм, который предлагает 1С уже в 2018 г., когда 54ФЗ уже действует.

    Я вам написал, что ваше решение требует паспорт при возврате денежных средств, который вы требовать не в праве. А дальше смотрите сами, что вы будете нарушать.

    Reply
  15. rpgshnik

    А забавно было бы собрать группу (большую группу) проверенных модераторов, которые бы одобряли статьи к публикации :)) понимаю что это не реально, но качество контента выросло бы в разы. А так от постоянных дублей, высеров какой я хороший и вбросов говна заведомо диверсионных действий, никто не застрахован, особенно молодые специалисты.

    Reply
  16. nagimo

    (15)

    идея отличная, но действительно не реальная.

    Тем более, что нужно было бы еще отслеживать и комментарии, не относящиеся к теме публикаций.

    Или комментарии «почтальона Печкина» от 1С — «я знаю что правильно вот так, но как сделать это в программе я вам не скажу (потому что сам не знаю)».

    Ведь только время зря такие комментаторы отнимают, ничего дельного не предлагая.

    Reply
  17. oldcopy

    (16)

    Или комментарии «почтальона Печкина» от 1С — «я знаю что правильно вот так, но как сделать это в программе я вам не скажу (потому что сам не знаю)».

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

    Reply
  18. KIBER31

    (16) Столкнулся с той же проблемой, ОРП не проводится, ругается на отрицательный остаток на складе при проведении ОРП в котором были возвраты и они в документе идут отрицательным числом. Чеки при закрытии смены удаляются и они больше не создают движения по регистрам.

    Удалось решить проблему?

    Ошибка возникает в процедуре «ЗаполнитьВидыЗапасовПоТаблицеОстатковСформироватьВТНовыеРез­ервы в общем модуле ЗапасыСервер».

    В общем-то я нашел условие, которое должно быть выполнено, чтобы не было ошибок, оно выглядит вот так

    ИначеЕсли (КоличествоТовара > 0 И КоличествоОстаток > 0)

    Или (КоличествоТовара < 0 И КоличествоОстаток < 0) Тогда

    КоличествоТовара — это количество в документе, у нас -1

    КоличествоОстаток — это на складе, у нас 0

    Смущает условие «Или (КоличествоТовара < 0 И КоличествоОстаток < 0», но очень часто кол-во на складе = 0, а не меньше нуля.

    Reply
  19. nagimo

    (18) Само решение я в публикации и написал.

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

    Не совсем помню в каких процедурах искал ошибку (более 10-ти часов потратил на поиск ошибки), но приведенное вами название процедуры очень знакомо.

    Reply
  20. KIBER31

    (19) Дело в том, что мы проводим продажи в Рознице, а не в УТ. В УТ по обмену попадают документы из Розницы и в УТ ОРП уже не проводится. Ваша публикация подразумевает то,что продажа и возврат должны быть в УТ .

    Но вот как мне победить это, пока не могу понять.

    Reply
  21. KIBER31

    Нашел причину.

    В моем случае дело было в настройках контроля остатков, в УТ три вида контроля, если выключить контроль остатков по организации и включить Контролировать обеспечение в настройках склада, то ОРП проводится (с возвратом), товар встает на остаток и остатки контролируются.

    Reply
  22. nagimo

    (21) да, кстати, отключение контроля остатков решает эту проблему.

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

    Reply
  23. Alexkot2011

    Да, а как по Расчету себестоимости (если возврат товара в другой день)?

    При минусовом остатке товара в Отчете о розничных продажах, партия не подставляется и себестоимость по этому товару и этой операции не считается. Только при схеме: Возврат товара клиенту — Расходно-кассовый ордер — себестоимость расчитывается правильно..

    Reply
  24. zakidonoff

    (6)

    Оптово-розничной торговли не бывает.

    Прикольная ересь.

    И кто же мне запретит в маленьком магазинчике вязания веников, где благополучно стоит розничная касса, выписывать счета на поставку моей незаменимой продукции для соседского ЖЭКа? Пусть даже и с того же самого склада, откуда ведётся розничная торговля?

    Ещё более интересно мне, где можно в конфигурации УТ найти проводки по счетам. Вот сейчас специально залез в конфигурацию управления торговлей (нет), дабы убедиться лишний раз, что я не верблюд.

    И опт — это практически всегда выписка товара без его физического наличия здесь и сейчас.

    Ну да, ну да. Особенно в наших реалиях, когда ты пока не купил партию товара, никогда не сможешь предсказать его стоимость у поставщика. Для крупных компаний эти ценовые колебания, конечно, нивелируются объёмами продаж, но даже они редко рискуют выставлять не обособленные счета на товар, большая часть которого ещё не имеется у них на складах. Что уж говорить про разного рода мелкие ИП?

    Reply

Leave a Comment

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