<?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='\
К сожалению в ближайшее время скриншотов не будет, так как почему то «сервер не найден», а я в отпуск ухожу
В отчете у тебя есть ТабДокумент.ПроверитьВывод(ОблСтрока); так вот если никакого принтера нет, она вызывает исключение, поэтому ее нужно как обвязать Попыткой, или еще как.
Не встречал такого раньше… Вообще то какая разница по идее есть принтер или нет. Но в принципе тогда нужно весь цикл включать в попытку
А чё про 23, 25 счета забыл?
Про 23 и 25 счета не просили. Если нада будет, то и их сделаю
+5
Добавьте если можно в разрезе подразделений))
(7) Я подумаю над вашим предложением…
Подумайте пожалуйста,это бы очень очень облегчило мне жизнь))
Обновил отчет. Появилась новая закладка по затратам на 20 и 26 счетах. Для других счетов группировки по подразделениям сделать не получается, так как у них нет такого субконто в плане счетов.
(4) Отчет очень понравился, но есть пара замечания/пожелания. Большая просьба: добавьте группировки
1. «группировать по счетам» или выделить отдельно расходы собираемые на счете 91.02
2. добавьте, пожалуйста, затраты по 25-счету и 23-счету. но т.к. эти счета могут закрываться в 20, то в этом случае надо исключать проводки типа д.20-к.25(23)
—-
Ошибка в отчете: Если счет 26(25 и др.) закрывается в счет 20, то отчет показывает эти проводки/суммы = возникает ошибка.
(11) Я так понимаю, что нужно исключить проводки Дт20 — Кт26,25,23, которые выходят при выводе данных по 20му счету?
очень хорошо сделано, еще раз спасибо огромное)))
(11) Выкладываю версию отчета 1.1 где учтены ваши пожелания
(12) Тут нужна отдельная кнопка, типа «Печать только «полные затраты» по 20-счету», или выводить на экран/печать отдельный отчет показывающий все собранные затраты по счету 20.
—-
На мой взгляд, вопрос не однозначный(извините, если ввел в заблуждение):
1. Если анализируем расходы, как это задумывалось изначально, тогда, я лично считаю, что расходы относимые Дт20 — Кт26,25,23 надо исключить.
2. Если надо смотреть счет 20 для анализа [тут следовало бы поставить фразу «полная производственная себестоимость»но это не совсем корректное выражение]себестоимости продукции/услуг/работ, тогда надо делать два отчета а) по 20-счету с проводками Дт20 — Кт26,25,23
б) отчет по распределению затрат (что и куда списывается с Кт.26,25,23, где для каждого счета свои «таблички распределения»)
——
ЗЫ. На всякий случай, могу прислать свой файл(без каких то дальнейших обязательств) — пример ведомости по распределению затрат по со счета 25, тогда пишите свой адрес мне в личку.
…А группировка по счета, лично для меня, — очень ценная вещь! Спасибо!
В ближайшее время не будет времени дорабатывать проект, но с вопросами включения и исключения проводок Дт20 — Кт26,25,23 думаю можно что нибудь придумать… например с возмозможностью включения и исключения
Добавил флаг «Исключить проводки Дт 20 — Кт 23, 25, 26» — при установленном флаге обороты соответствующих проводок будут исключены из отчета.
А нельзя ли сделать чтобы периодичсность выводилась в колонку а не в строку?.
А можно адаптировать это для 1с 8.2?
Для Бухни 2.0 взлетел без переделок. Отлично !
Почему то не выводит данные — затраты по подразделениям, если нет выработки (выпуска продукции), а например только есть реализация услуг
без скринов не солидно
Большое спасибо. Плюс+
А будет ли версия для бух 2.0 на 8.2
(25) Вот в (21) сказали что работает на БП 2.0, и у меня тоже работает. Нужно просто открыть обработку в конфигураторе 8.2 и согласиться на конвертирование. После этого должно работать.
У меня вылетает ошибка
{Форма.Форма(944)}: Ошибка при вызове метода контекста (Выполнить): {(28, 4)}: Таблица не найдена «Справочник.ПрочиеДоходыИРасходы»
<<?>>Справочник.ПрочиеДоходыИРасходы КАК ПрочийДоходРасход
СтатьиЗатрат.Загрузить(Запрос.Выполнить().Выгрузить());
по причине:
{(28, 4)}: Таблица не найдена «Справочник.ПрочиеДоходыИРасходы»
<<?>>Справочник.ПрочиеДоходыИРасходы КАК ПрочийДоходРасход
Как от неё избавиться?
Хороший отчет, спасибо. Без проблем сконвертировал для 8.2. Да, и хотелось бы видеть скрины до того как скачиваешь данный отчет.
(27) А что у вас за конфигурация? Видимо отсутствует справочник Прочие доходы и расходы.
(28) До них руки как-то не дошли, если не забуду, то сделаю