Отчет по продажам для 1С: Бухгалтерия 7.7




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

27 Comments

  1. DDD2005

    Класное решение, вот бы еще бы выташить поступление, и делать расчет если есть цена закупочная и розничная, а не себестоимость!

    Может хотябы поступление выташите?

    Reply
  2. cs25

    Рульно получилось. Плюсую. Посмотри у O-Planet есть подобная (другая). Тоже работает «на ура». А в целом — МОЛОДЦА !!!

    Reply
  3. andrey995

    +1, спасибо

    Reply
  4. azernot

    Не, ну как бы +1, конечно.. Э-э-э «клянёмся»… Но как-то оно бы это… (с) В.Галыгин «Богатыри»

    Внесу ложку дёгтя…

    — В случае если количество = 0 (а по услугам так бывает) возникает ошибка деления на 0. (при определении Цены).

    — Не учитывается возможность отгрузки без перехода права собственности (на 45 сч).

    — Не учитывается реализация отгруженных товаров.

    — Не учитывается возможность сторно.

    и пожелания..

    — Если знаем сумму с НДС, НДС и себестоимость, неплохо бы знать и доход.

    — Анализируем товары, услуги.. материалы, а работы чем плохи? ( А может быть даже и ОС и НМА, чтобы уж совсем полная картина? А может ещё и розницу прикрутить?)

    — Материал — Контрагент можно, а чего ж Контрагент — Материал нельзя?

    Reply
  5. dmitish

    Не ребята…

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

    А отчет писался для МОЕГО бухгалтера, под его нужды… Пока другого не просит.

    Reply
  6. borisova

    клас, +1, спасли жизнь

    Reply
  7. zaic

    +1 за эту фразу:

    «За не имением в типовой никакого отчет по продажам это — РЕШЕНИЕ»

    Reply
  8. arkin

    Пасиба огромное!!!!

    Reply
  9. gull71

    Понравилось…я собственно пользователь.

    Еще бы про 40-ю главу НК, особенно за период по позициям номенклатуры с отбором по документам поставки/реализации (с контролем цены сделки за период (отклонение 20%) что-нибудь сделать и жизнь стала бы совсем замечательна:-)Именно с выборкой из документов поставки/реализации а не по средней:-)

    Reply
  10. CheBurator

    (9) 2 gull72: есть такое у меня (вы, главное, не стесняйтесь — спрашивайте у Che что вам надо 😉

    картинка: http://infostart.ru/profile/174/projects/96/image.php?img=494

    сама орбработка: http://infostart.ru/profile/174/projects/96/

    обработка для ТиС (под комплексной тоже должна пойти), под БУХ ее переточить — проблем не представляет.

    Reply
  11. Asteriks_99

    Пасиба преогромное!!!!

    Reply
  12. ЛюблюТебя

    спасибо

    Reply
  13. Lidia

    Уважаю.Отлично работает, только добавила столбик «профит» . Для 8.1 мы купили такой же отчетик за 900 руб, тоже не нарадуемся.

    Reply
  14. StadoAdama

    ничего так отчетик… нашим бухам понравился… вот только они хотят колонку с разницей «себестоимости» и «всего»… нет желания добавить? или придется самому?

    Reply
  15. StadoAdama

    уже добавил… надеюсь никто не против 🙂

    Reply
  16. kabanoff

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

    Но «+» всё равно, за старания.

    Reply
  17. AlexStar

    Здорово! Еще бы группировку «По документу» именно что бы сам реестр документов можно было формировать списком за период, то вобще бы цены не было. Супер. Плюсую.

    Reply
  18. n.borodkina@rosogneupor.com

    Отлично!

    Особенно порадовали два варианта группировки: контрагент и номенклатура.

    Ставлю большой «+»

    Reply
  19. val1977

    Меня просто спас!!!!!++++++

    Reply
  20. PTA.ha

    Супер! Спасибо!!!!!++++

    туда бы еще поступление….

    Reply
  21. Lynxi

    Оооо вы чудо!! спасибо большое!!! 😀

    Если бы еще в отдельной колонке выводилась наценка в рублях и процентах было бы ваще!!!!

    Reply
  22. platinum

    Хороший отчет. Еще бы хорошо сделать отбор по номенклатуре,контрагентам и возможность быстро разворачивать весь отчет по различным уровням,а то довольно муторно разворачивать каждого контрагента. И хорошо бы в конце сделать в итогах суммирование по количеству для разных единиц измерения.

    Reply
  23. slige

    Очень хорошое решение++++++. Мне понравилось

    Reply
  24. vladimir_makarov

    Классная штука, только в упрощенке не работает… Но переделать не сложно. За идею спасибо.

    Reply
  25. Tinder

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

    Если длинна Полного наименования номенклатуры больше 50 символов

    в режиме Контрагент-Номенклатура при раскрытии (развороте) перечня товаров по контрагенту обрезается название товара до 50 символов. В режиме Номенклатура — контрагент такого нет все названия товаров показываются полностью.?????

    Как исправить, в чем причина?

    Reply
  26. makar_serg

    Скажите, для Бухгалтерии 7.7 для Украины эта обработка должна подходить? У мня не пошла 🙁 По количеству выдаваемых ошибок я догадываюсь, что не должно работать, но решил уточнить — я не спец в этой области. Отчет такой ой как нужен!

    Reply
  27. nata1006

    Исходя из того, что типового подобного отчета в конфигурации нет, неплохое подспорье

    Reply

Leave a Comment

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