Товарный отчет ТОРГ-29 для оптовых складов




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

52 Comments

  1. munster

    «Извините, Вам нельзя!»))))

    а так работает, спасибо

    Reply
  2. tchsn

    Извини забыл убрать это была комерческая версия

    Там есть строки кторые проверяют название организации которая её приобрела если обработку унесли в другое место она работать не будет

    Если сами не разберетесь напиши куда послать на Email пришлю без защиты

    Reply
  3. gutentag

    (2) так обновите файл

    Reply
  4. tchsn

    (3)А я с удовольствием но не как не найду где это сделать если подскажите буду признателен

    Reply
  5. tchsn

    (3)Ну вроде бы всё исправил

    Reply
  6. gutentag

    (4) тут, под вашим ником есть кнопка «Редактировать»; далее идете

    -> Файл -> тут можно удалить старый файл, и/или добавить новый файл (имхо лучше с добавкой, типа «версия-0002»).

    В крайнем случае, можете все удалить и загрузит все заново.

    Или пишите суппорту 🙂

    Reply
  7. tchsn

    (6) Большое спасибо за ответ и за труды как видите я уже нашел

    Reply
  8. gutentag

    (5) Пожелание: сделайте возможность формировать(типа поставить «галку» = формировать отчет по всем складам)

    Reply
  9. gutentag

    +(8) имхо включая розничные склады

    Reply
  10. tchsn

    (8) Акак вы себе это представляете? Каждый отчет имеет свой номер. Каждый склад имеет свои начальные и конечные остатки. Каждый склад имеет своего ответственного.

    Или же по этой галке должно формироваться столько отчетов сколько у Вас складов

    Reply
  11. tchsn

    (9) Посмтрите мой ответ (10) и ответь в какои виде это должно быть

    Reply
  12. gutentag

    Имхо я представлял, что остатки на начало и конец суммируются. Но т.к. у меня все делается по складам, то пожелание отменяется.

    Reply
  13. gutentag

    (11) Можно вопрос:

    Ситуатция: я обратил внимание, что в настройках розничного склада стоит:

    Вид склада = Неавтоматизированная торговая точка

    тип цен = Розничная

    Счета доходов и расходов от реализации = стоит «галка»= определять по учетной политике(организация на УСН).

    Деньги мы получаем по кассе и терминалу(пластиковые карты).

    Вопрос: ТОРГ-29 из стандартной конфигурации не формирует отчет. В чем засада?

    ——

    Спасибо за ответ.

    Reply
  14. tchsn

    (13) Для формирования стандартного отчета товар долже учитываться 41.11 , 41.12 и 41.03 (для тары) счетах тогда он формируется,если счета учета склада другие стандартный отчет не формруется и не важно как вы получаете деньги и где учитываете доходы и расходы

    Reply
  15. tchsn

    Всем большое спасибо за плюсы

    Reply
  16. gutentag

    (14) понятно, 41.11 , 41.12 = учет на складе ведется по продажной цене. У меня бухгалтер учет ведет на 41.02(учет по закупочной цене) а реализацию проводит документом «Отчет о розничных продажах».

    Замечания:

    -Обратил внимание, что при формировании отчета вместо «остаток на конец 31.05.2009» отчет выдает «Остаток на ПолеВвода»

    -ИМХО не ошибка(просто обращаю внимание, когда мой бухгалтер придет из отпуска, я спрошу у него об этом) Документ «Возврат от покупателя» попадает в раздел Расход со знаком минус.



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

    Reply
  17. tchsn

    (16) Попробуй второй отчет должен работать, если нет пиши переделаем

    Reply
  18. gutentag

    (17) нет во втором отчете не совсем складов не видно.

    Я в первом отчете я сделал так(и меня более всего устроило):

    «Перечисления.ВидыСкладов.Оптовый» везде заменил на «Перечисления.ВидыСкладов.НеавтоматизированнаяТорговаяТочка»

    Получилось два отчета для розничного и оптового склада.

    Имхо в отчете нужен алгоритм типа «ИЛИ»(Оптовый или Розничный или НеавтоматизированнаяТорговаяТочка)

    Но я только бухгалтер, а не программист.

    ИМХО В моем конкретном случае, сопоставляя данных бухгалтерского учета и отчета ТОРГ-29, бухгалтер применять не захотела, т.к. она учет на счете 41.02 и/или 41.01 ведет только по оптовым ценам.

    Т.е. Почти получился отчет «ТОРГ-31», но повторюсь — это мой личный случай 🙂

    Reply
  19. gutentag

    Ура!

    Reply
  20. idw

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

    Reply
  21. tchsn

    (20) Сделать конечно же можно, но нужно ли?

    Возвраты попадают таким образом лишь потому, что формируют сторнирующие проводки, отсюда всё наоборот

    Reply
  22. idw

    (21) хоть так и правильно, но во всех типовых конфах они попадают наоборот со знаком плюс. Бухи просто так уже привыкли.

    Reply
  23. tchsn

    (21) Хорошо я посмотрю сделаю и выложу

    Reply
  24. tchsn

    (22) На какой вариант делать?

    Reply
  25. idw

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

    Reply
  26. tchsn

    (25) Я выложил здесь 3 файла какой из трёх Вас надо переделать?

    Reply
  27. idw

    Понял, в принципе без разницы. Можно вот этот «ТОРГ-29 Любой склад Счета оптовые».

    Reply
  28. tchsn

    (27) Сделал и выложил, можешь тестировать, если что пиши исправим

    Reply
  29. tchsn

    Всем большое спасибо за плюсы которые поставили и которые ещё поставят

    Reply
  30. itt

    только подумали бухи что надо такой отчет — бумс и уже выложен!

    огромное спасибо за заботу о нас! 😎

    Reply
  31. tchsn

    За всегда пожалуйста, и Вам спасибо за плюс и за то что Вы оценили труд проделанный программистом

    Reply
  32. Bambrlog

    Обработка полезная, просьба большая сделайте для УТ 8,1

    Reply
  33. tchsn

    (32) Хорошо у меня сейчас некоторые технические проблемы, как их решу рассмотрю Ваше предложение

    Reply
  34. IP43

    а на каком релизе тестировалось? на Бухгалтерия предприятия, редакция 1.6 (1.6.22.4) не работает, отключаю в коде фильтр по складу, начинает заполнять.

    Reply
  35. rmariao

    А можно сделать такой же отчет для 8.2 Бухгалтерия предприятия?? Очень надо…. 🙁

    Reply
  36. MapaT

    Здравствуйте, а у Вас есть такая обработка, только для УТ 10.3 ТОРГ-29 по оптовому складу по себестоимости без НДС, с отбором по поставщику в приходной части. Буду признателен. Спасибо

    Reply
  37. Stepan_1c

    tchsn, здравствуйте. в вашей обработке не удается получить результат в разрезе складов в УПП. в консоле запросов к запросу добавил

    | ХозрасчетныйОстаткиИОбороты.КоличествоОборот,

    | ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт,

    | ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт

    и всё заработало почему то…можно добавить одну строку из этих и начинает всё работать. однако, в предприятии уже не работает, выдает пустую таблицу если оставить выбор по складу. если убрать все «СУММА», то выборка производиться по складам… можете помочь разобраться?

    сам справился… на дату последнего сообщения не обратил внимания. немного дописать пришлось для наших бухов. спасибо за отчет.=)

    Reply
  38. WildFire

    Почти то же самое, что и стандартная обработка от БП 2.0, только новые счета добавлены в список. Ну и фильтр подправлен. Но все равно спасибо, т.к. я сомневался, достаточно ли для такого отчета простого добавления счетов. Теперь вижу, что достаточно 🙂

    Reply
  39. Stepan_1c

    Спасибо!

    Помогло разобраться=)

    Reply
  40. karbofos

    Тоже эксперементировал со стандартным отчетом. Теперь вижу где была ошибка. Огромное спасибо. Помогло.

    Reply
  41. lastrain

    Подскажите: в отчете отображается одна сумма документа, а в документе, когда его открываешь, другая. В чем может быть причина? Что не так? Конфа типовая

    Reply
  42. ukgh

    То, что нужно! Спасибо!

    Reply
  43. sige

    Спасибо!

    Reply
  44. Unicorn31

    Спасибо!

    Reply
  45. ifarkhetdinov

    работает «+»

    Reply
  46. snip

    Под 8.2 если конвертнуть — будет работать?

    никто не пробовал?

    Reply
  47. lastrain

    да, под 8.2 все работает. Только открыть его в конфигураторе 8.2 и сконвертировать. специально ничего переписывать не надо

    Reply
  48. Rino

    а под УТ такое будет?

    Reply
  49. lastrain
  50. vlanik

    Использую под 8.2 после конвертации все работает как надо, спасибо автору.

    Reply
  51. Душечка

    Благодарю !!!

    Reply
  52. insurgut

    Если кто-то ищет для УТ 10.3: https://infostart.ru/public/905359/

    Reply

Leave a Comment

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