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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *