<?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='\
Класное решение, вот бы еще бы выташить поступление, и делать расчет если есть цена закупочная и розничная, а не себестоимость!
Может хотябы поступление выташите?
Рульно получилось. Плюсую. Посмотри у O-Planet есть подобная (другая). Тоже работает «на ура». А в целом — МОЛОДЦА !!!
+1, спасибо
Не, ну как бы +1, конечно.. Э-э-э «клянёмся»… Но как-то оно бы это… (с) В.Галыгин «Богатыри»
Внесу ложку дёгтя…
— В случае если количество = 0 (а по услугам так бывает) возникает ошибка деления на 0. (при определении Цены).
— Не учитывается возможность отгрузки без перехода права собственности (на 45 сч).
— Не учитывается реализация отгруженных товаров.
— Не учитывается возможность сторно.
и пожелания..
— Если знаем сумму с НДС, НДС и себестоимость, неплохо бы знать и доход.
— Анализируем товары, услуги.. материалы, а работы чем плохи? ( А может быть даже и ОС и НМА, чтобы уж совсем полная картина? А может ещё и розницу прикрутить?)
— Материал — Контрагент можно, а чего ж Контрагент — Материал нельзя?
Не ребята…
Исправляйте кому нужно! Там алгоритм не сложный благо, что движок который использует отчет (конечно его узнали те кто программирует) позволяет делать чудеса.
А отчет писался для МОЕГО бухгалтера, под его нужды… Пока другого не просит.
клас, +1, спасли жизнь
+1 за эту фразу:
«За не имением в типовой никакого отчет по продажам это — РЕШЕНИЕ»
Пасиба огромное!!!!
Понравилось…я собственно пользователь.
Еще бы про 40-ю главу НК, особенно за период по позициям номенклатуры с отбором по документам поставки/реализации (с контролем цены сделки за период (отклонение 20%) что-нибудь сделать и жизнь стала бы совсем замечательна:-)Именно с выборкой из документов поставки/реализации а не по средней:-)
(9) 2 gull72: есть такое у меня (вы, главное, не стесняйтесь — спрашивайте у Che что вам надо 😉
http://infostart.ru/profile/174/projects/96/image.php?img=494
http://infostart.ru/profile/174/projects/96/
картинка:
сама орбработка:
обработка для ТиС (под комплексной тоже должна пойти), под БУХ ее переточить — проблем не представляет.
Пасиба преогромное!!!!
спасибо
Уважаю.Отлично работает, только добавила столбик «профит» . Для 8.1 мы купили такой же отчетик за 900 руб, тоже не нарадуемся.
ничего так отчетик… нашим бухам понравился… вот только они хотят колонку с разницей «себестоимости» и «всего»… нет желания добавить? или придется самому?
уже добавил… надеюсь никто не против 🙂
Мне не нравится, что данные берутся не из бух. итогов, а из документов. Для меня не подходит, поскольку данные о реализации выгружаю операциями из ТиС.
Но «+» всё равно, за старания.
Здорово! Еще бы группировку «По документу» именно что бы сам реестр документов можно было формировать списком за период, то вобще бы цены не было. Супер. Плюсую.
Отлично!
Особенно порадовали два варианта группировки: контрагент и номенклатура.
Ставлю большой «+»
Меня просто спас!!!!!++++++
Супер! Спасибо!!!!!++++
туда бы еще поступление….
Оооо вы чудо!! спасибо большое!!! 😀
Если бы еще в отдельной колонке выводилась наценка в рублях и процентах было бы ваще!!!!
Хороший отчет. Еще бы хорошо сделать отбор по номенклатуре,контрагентам и возможность быстро разворачивать весь отчет по различным уровням,а то довольно муторно разворачивать каждого контрагента. И хорошо бы в конце сделать в итогах суммирование по количеству для разных единиц измерения.
Очень хорошое решение++++++. Мне понравилось
Классная штука, только в упрощенке не работает… Но переделать не сложно. За идею спасибо.
Есть небольшой недочет. Не могу понять в чем причина.
Если длинна Полного наименования номенклатуры больше 50 символов
в режиме Контрагент-Номенклатура при раскрытии (развороте) перечня товаров по контрагенту обрезается название товара до 50 символов. В режиме Номенклатура — контрагент такого нет все названия товаров показываются полностью.?????
Как исправить, в чем причина?
Скажите, для Бухгалтерии 7.7 для Украины эта обработка должна подходить? У мня не пошла 🙁 По количеству выдаваемых ошибок я догадываюсь, что не должно работать, но решил уточнить — я не спец в этой области. Отчет такой ой как нужен!
Исходя из того, что типового подобного отчета в конфигурации нет, неплохое подспорье