Товарный отчет ТОРГ-29. НОВАЯ РЕДАКЦИЯ




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

40 Comments

  1. Naton

    Добрый день!

    А как в Ваш отчет подставить номер документа перемещения не порядковый, а БСО?

    Речь о Конфиге Розница 2.0 для Беларуси.

    Reply
  2. StepByStep

    (1) Naton,

    Здравствуйте.

    А как в Ваш отчет подставить номер документа перемещения не порядковый, а БСО?

    Речь о Конфиге Розница 2.0 для Беларуси.

    Обработка разрабатывалась и сопровождается под российскую конфигурацию Розница 2.0.

    В ней реквизита документов «НомерБСО» нет.

    Необходимо подправить функцию СформироватьЗаголовокДокумента(Шапка, НазваниеДокумента = «») указав реквизит НомерБСО.

    Reply
  3. Naton

    нет, поправить нужно Функцию СформироватьОтчетТОРГ29

    ОбластьМакета.Параметры.НомерДокумента = СтрокаТЗ.Документ.НомерБСО;

    Ещё раз спасибо и за этот отчет и за расшифровку переоценок

    Reply
  4. StepByStep

    (3) Naton,

    Спасибо.

    Reply
  5. s_uu

    Добрый день, подскажите, пожалуйста, отчет работает только на Розница 2.0.4.5.???????

    Reply
  6. Naton

    В Рознице 2.0.5.3 (для беларуси) работает

    Reply
  7. SpideRus

    (5) s_uu,

    Запустил на 2.0.4.5, работает.

    Reply
  8. StepByStep

    ВЕРСИЯ 8.3.1 (.05.2015). Новая редакция.

    — Добавлена возможность выбора ВидЦены, в ценах которых выводится отчет.

    — Добавлены колонки отчета: «Себестоимость», «Наценка».

    — Колонка «Оборот» за период заменена на «Продажи».

    — Добавлен реквизит «МОЛ» (материально-ответственное лицо) с выводом в отчете.

    — Изменения на вкладке «Цены и себестоимость» номенклатуры.

    — Прочие изменения.

    Кратное увеличение производительности по сравнению с предыдущими версиями.

    Reply
  9. StepByStep

    ВЕРСИЯ 8.3.2 (06.2015).

    — Исправлены выявленные недочеты.

    — Добавлена таблица «Комментарии», в которую выводятся Сообщения/Предупреждения/Ошибки.

    Это поможет «разобраться» с проблемными документами.

    Reply
  10. StepByStep

    8.3.3 (15.11.2015).

    — Расширен список отслеживаемых ошибок (выводится на вкладке «Ошибки» — ранее «Комментарии»).

    — В таблице «Цены и Себестоимость» добавлена возможность фильтрации таблицы по «документу».

    — Прочие изменения.

    Reply
  11. IgorQ

    Добрый день, можно спросить почему в отчете вместо Поступления товаров ,выходит документ Установка цен?

    Reply
  12. StepByStep

    (11) IgorQ,

    Надо посмотреть. Проверю.

    Reply
  13. StepByStep

    8.4 (07.2016).

    — Исправление выявленных ошибок.

    — Добавлена таблица «Товары и документы» (вспомогательная, для выявления ошибок даных).

    — Прочие изменения.

    Reply
  14. bmf

    Скачал, показал бухгалтеру. В общем, судя по всему, отчет Ваш собирает и суммирует товары (цена*количество) в документах, что не всегда совпадает с фактической суммой в строке товара (причина тому скидки у поставщика, или упаковка приходуется 6 шт по 200руб 17 копеек). В итоге в отчете укзаны суммы документов не совпадающие с суммой самого документа, что для бухгалтера делает отчет неприемлемым.

    Reply
  15. StepByStep

    (14) bmf,

    Посмотрю.

    Reply
  16. sk_acc

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

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

    Reply
  17. StepByStep

    (14)

    Цена и количество берутся из регистра.

    Что туда записывается зависит от проведения документа.

    Может быть что-то с упаковками — проверю еще раз.

    Reply
  18. StepByStep

    (16)

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

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

    В результате цены учета реально могут отличаться от цен продаж.

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

    Это часто встречающаяся ситуация.

    Reply
  19. bmf

    (17) Да в том то и дело, что цена * количество не всегда равно сумме в строке. А в отчет должна попадать именно сумма из документа, а не произведение количества в строке на результат деления суммы на количество, который 1С называет «ценой», при этом округляя до сотой рубля.

    Reply
  20. StepByStep

    Цена в регистре — значение формируемое в регистре при проведении документа. Смотрите там.

    Reply
  21. sk_acc

    понятно , спасибо

    Reply
  22. Netker

    Не знаю где еще спросить. Подскажите почему сумма расхода по учетным данным отличается от суммы по продажи?

    У меня есть позиция, поступление сделано 1 марта, установка цен тоже 1 марта, больше движений по данной номенклатуре нет, 4 марта осуществлена продажа. В отчете сумму по учету показывает больше чем сумма продажи. Больше не каких изменения цен не было. Почему так формирует? уже всю голову сломал.

    Конфигурация розница 2.2

    Reply
  23. sk_acc

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

    Reply
  24. Netker

    У меня установка только одна сделана и до открытия кассовой смены. А все равно не правильно отчет формирует.

    Reply
  25. sk_acc

    Если хотите , можете скинуть базу на мыло , могу посмотреть.

    Reply
  26. codename-s

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

    Reply
  27. nagaitseff

    День добрый! Ваш отчет очень хороший, он всегда корректно отображает данные, в отличие от стандартного. У нас постоянно проблемы с ТОРГ-29, особенно часто появляется ошибка «Ошибка нарастающей суммы учета».

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

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

    Спасибо.

    Reply
  28. StepByStep

    (22)

    (23)

    (24)

    (26)

    (27)

    В ближайшее время буду проверять обработку на версии Розницы 2.2.

    По результатам выложу новую версию.

    Ваши вопросы — посмотрю.

    Reply
  29. StepByStep

    ВЕРСИЯ 9.0 (08.2017) НОВАЯ РЕДАКЦИЯ.

    Существенные изменения, дополнения.

    — Переработано формирование отчета.

    — Переработан блок проверки полученных данных.

    — Два режима работы отчета: Пользовательский и администраторский.

    — Три варианта отчета: Типовой (только учетные данные), Расширенный (учетные данные и продажи при отсутствии учета по себестоимости), Полный (учетные данные,продажи и себестоимость).

    — Таблица «Цены и Себестоимость» исключена из отчета.

    — Таблица «Товары и документы» дополнена графами из таблицы «Цены и Себестоимость».

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

    Таблица позволяет получить более точное представление об учете в информационной базе.

    — Добавлена возможность формировать документы, корректиующие имеющиеся ошибки учета.

    — Добавлено описание, расположеное непосредственно на форме отчета.

    — Добавлена поддержка конфигураций Розница 2.0 для Украины и Розница 2.2 для Беларусии.

    — Прочие изменения.

    Reply
  30. Filipp_inf

    Добрый день!

    Обработку скачала. (версию 9.0)

    При запуске в 1C 8.3 (8.3.9.2033) конфигурация Розница 2.2 (2.2.5.57) (http//v8.1c.ru/retail/) (толстый клиент)

    сразу выскочила ошибка:

    «Ошибка отображения типов:

    Отсутствует отображение для типа ‘{http//v8.1c.ru/8.2/managed-application/logform}FormChildrenAlign’

    И все. Запускала как внешнюю обработку через «Файл — Открыть».

    Может я что-то сделала не так?

    Reply
  31. StepByStep

    (31)

    Здравствуйте.

    Сейчас выложу новую версию. Должна работать на 9.3.9.

    Дело в том, что версия 9.0 писалась на 8.3.10. С этим связано.

    Reply
  32. StepByStep

    ВЕРСИЯ 9.0.2 (08.2017)

    — Исправление недочетов.

    Reply
  33. Andrekaa

    Добрый день

    а как в отчете обстоит дело с округлением до второго знака выражения Цена*Количество?

    а то из-за этого и например данные по ОРП не сходятся на копейки и начальные/конечные суммы тоже не идут?

    Reply
  34. Filipp_inf

    Добрый день!

    Спасибо за версию 9.0.2 (08.2017) .

    Теперь у нас отчет тоже заработал.

    Прекрасный инструмент!

    Все наглядно.

    Еще конечно хотелось бы, чтобы обязательным был только выбор магазина, а по складу флажок — «все склады магазина»,

    тогда получился бы более универсальный отчет, правда это уже не был бы ТОРГ-29.

    Но для бухгалтерии более полный анализ.

    Reply
  35. OksDallas

    Розница 2,2 «АКТ переоценки» переоценки берет не то количество товара по складу, не как в Вашем ТОРГ-29

    Reply
  36. КсенияИ

    Добрый день. Не правильно формируется сумма по документу Отчет о розничной продаже, если происходит изменение цены в течение дня. Т.е. если происходит продажа 10 ед товара по 10 руб, а позже 10 ед по 20 руб, в учетную сумму попадает как будто продали 20 ед по 20 руб. И по Переоценке товара он берет для переоценки кол-во товара на начало дня, а не на момент когда происходит изменение цены. Т.е. если на начало дня 10 ед.товара, затем происходит продажа 8, затем поступление товара, в результате чего должно произойти переоценка, он должен взять 2 ед оставшегося товара для переоценки, а в отчет попадают для всех 10. Планируется ли данное исправление? Или быть может, сможете дать комментарий, почему так должно рассчитываться?

    Reply
  37. max1con0

    Добрый день! При формировании отчета возникают ошибки: «Нарушена последовательность документов.

    Поледовательность документов:Документ-Основание Отчет о розничных продажах РИРТ-000041 от 14.03.2018 21:52:22

    — Эквайринговая операция РИРТ-000010 от 14.03.2018 20:55:14 раньше документа-основания.

    — Возврат товаров от покупателя РИРТ-000023 от 17.03.2018 9:16:44″.

    Ключ: «Иерархия»

    Тип ошибки: «ошибка»

    При этом даты документов расставлены корректно. Как исправить подобное?

    Reply
  38. max1con0

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

    Reply
  39. user796510

    Добрый день. Как выбрать тип отчёта для формирования (типовой/полный)?

    Reply
  40. s_uu

    Добрый день, как можно связаться с вами по е-майл насчет отчета? напишите в личку, спасибо!

    Reply

Leave a Comment

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