Отчет "Продажи ниже себестоимости" для 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='\

32 Comments

  1. kivduts

    Не хватает одно маленькой колонки Контрагент называется. А так идея супер и реализация супер молодца.

    Reply
  2. kivduts

    И для ТиСа было бы не плохо сделать такое же дело.

    Reply
  3. IP43

    (2) Вы совершенно правы. Но, это было сделано для бухгалтера, ей контрагент не нужен. Но есть одно но, бухгалтер наехала на менеджеров, нажаловалась директору, и те внесли ряд предложений, а именно:

    1) Добавить контрагента.

    2) Добавить товар.

    Так что скоро будет.

    Reply
  4. IP43

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

    Reply
  5. KosmosMars

    Сделайте для комплексной. Если не сложно!

    Reply
  6. bendya

    Подскажите, в какую папку скопировать этот файл?

    Reply
  7. IP43

    Можно в любую 🙂 А в 1С Файл открыть и открыть этот файл.

    А можно в EXTFORMS информационной базы и подключить через Сервис — Дополнительные возможности

    Reply
  8. observeronline

    На ТиС 77.92 дает ошибку:

    Опер=СоздатьОбъект(«Операция»)

    {ПУТЬ к .ERT(25)}:неудачная попытка создания объекта (операция)

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

    Вопрос: если бага, то когда ждать фикса, а если нет, то что я мог сделать неверно?

    Вообще идея просто замечательная, искренне говорю спасибо!

    Reply
  9. IP43

    (8) На ТиСе ошибка потому что версия для бухгалтерии.

    (2, 8) По поводу версии для ТиСа. А что вам мешает пользоваться отчетом «Отчет по продажам ТМЦ» ставите галку в «Детализации» против «Номенклатура», «Документы реализации» и получаете нечто похожее, где продажи ниже себестоимости выводятся красным цветом. И колонки почти такие же 🙂

    Reply
  10. observeronline

    Согласен. Можно и так. Но Ваше решение позволяет дозировать инфу.

    Reply
  11. Adoms

    Спасибо от бухгалтера!

    Reply
  12. coolek

    Отчет не подходит..если отгузка в валюте =)ь Себестоимость берет в рублях…а выручку в валюте..и понятное дело что убыток будет хорошенький) Щас посмотрю код..че к чему)

    Reply
  13. IP43

    (12) Согласен. Надо доделать

    Reply
  14. coolek

    Впринципе там не так уж и много…в начале условие на проверку валюты договора..и в рублевом случае К = 1, а в валютном К = курсу..и в нужных местах домножить на К…где надо оно на курс, а где не надо на 1 домножит =) ну я так сделал..

    Reply
  15. Adoms

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

    Reply
  16. IP43

    (14) Тут еще у главбуха есть идея по доработке, буду доделывать и твое вставлю 🙂

    (15) Корректировка средневзвешенной это чисто бухгалтерско-налговые заморочки, а отчет показывает по какой накладной отгрузили ниже себестоимости на момент отгрузки, что бы принять меры (например наказать менеджера). Если товар в течении месяца приходил по разной цене, а при текущем состоянии дел в стране, он приходит дороже и дороже, то корретировка средневзвешенной себестоимости только усугубляет результат. Да и даже если товар после конкретной продажи придет по более дешевой цене, нечего уповать на это, надо стремиться продавать не ниже текущей себестоиомсти.

    Reply
  17. IP43

    (10) Для дозирования инфы в ТиС, достаточно «Отчет по продажам ТМЦ» сохранить как внешний и добавить в нем условие, если продажа ниже себестоимости, то выводим строку, если нет пропускаем. Это такая мелоч, что выкладывать ее сюда как то даже стыдно 🙂

    Reply
  18. Adoms

    (16) ой, извините, я просто убрал условие < себестоимости, и получился отчет, побобный «Отчет по продажам ТМЦ» в ТиС… Ведём учет предпринимателя в стандартной бухгалтерии, и Ваш отчет помогает заполнить Книгу учета доходов и расходов индв. предпринимателя

    Reply
  19. IP43

    (18) 🙂 Судя по опыту внерений Предприятия 7.7, для бухгалтера что Торговля, что Предприниматель, да и Упрощенка с 15%, темный лес. Привыкли они к стандартной бухгалтерии с ее планом счетов 🙂 Вот и приходится извращаться 🙂

    Reply
  20. ost_s

    спасибо, видимо полезная вещь, можно не мэйл (ost_s@mail.ru) получить?, а то рейтинга не хватает…

    Reply
  21. IP43

    (20) хотел было сказать, приходите завтра, но решил не огорчать женский пол 🙂 отправлено 🙂

    Reply
  22. ost_s

    СПАСИБО ОГРОМНЕЙШЕЕ!!!

    Reply
  23. Велена

    Спасибо!

    Reply
  24. galagala

    Все хорошо! Но можно было бы добавить и документ «Продажа в розницу». Было бы еще лучше!

    Reply
  25. sysline

    Пытаюсь подобное написать для 8.2.

    Не будет наглым попросить код в качестве примера?

    sysline@mail.ru

    Reply
  26. IP43

    (25) код открыт, качни и смотри 🙂

    Reply
  27. n.chaschilova

    Добрый день, не подскажите а проблему с валютными доками решили или нет? К сожалению в прочих подобных обработках именно эта проблема, цепляется выручка в валюте из накладной, а надо из операции по 90.1.1, нигде не могу найти доведенный до ума вариант, у самой ума не хватает переделать под себя :((((

    Reply
  28. n.chaschilova

    Попробую ваш отчет на себе. Отпишусь, как и че.

    Reply
  29. n.chaschilova

    «Добрый день, не подскажите а проблему с валютными доками решили или нет? К сожалению в прочих подобных обработках именно эта проблема, цепляется выручка в валюте из накладной, а надо из операции по 90.1.1, нигде не могу найти доведенный до ума вариант, у самой ума не хватает переделать под себя :(((( »

    Да к сожалению в обработке не рализована возможность работы с документами в валюте :((

    Reply
  30. n.chaschilova

    А еще было бы хорошо формировать полный анализ выручки и отдельно выводить убыточные реализации ))

    Reply
  31. IP43

    Извините но как то некогда с 7-кой возиться, особенно со старыми разработками, все на 8-ку переходят, под нее отчеты страгаем 🙂

    Reply
  32. ukgh

    Спасибо! Полезная вещь

    Reply

Leave a Comment

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