<?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='\
Если это то, о чем я думаю, то вы сделали мой день риалы)))
скачала, протестила, все отлично пока.
единственное, у ручной операции почему-то не заполняется автоматом организация в шапке.
(2) У меня была одна организация, поэтому внимания не обратил. Исправил, залил свежую с заполнением организации.
а мне пришлете? не скачивать же второй раз)
Нет желания доработать функционал, чтобы можно было сторнировать по выбранным регистрам?
(5) Хорошая идея. Сейчас времени нет, на выходных наверное сделаю.
(6) долетели уж поди?… © Любовь и голуби
еще косяк вылез-не сторнирует суммы НУ, ПР, ВР от слова СОВСЕМ)
прошу автора еще раз выслать мне обработку с исправлениями, обещал 😉
(8) По какому регистру не сторнирует? Только что проверял, все работает вроде.
(9) получила обработку но она не открывается, говорит версия не подходит…
у меня ERP 2.4.
(10) Сейчас нет редакции 2.4, как посмотрю и исправлю вышлю на почту.
(11) Добрый день. 1. Поправили ли для редакции 2.4? 2. Код обработки открыт, можем сами если что поправить?
(12) Да исправления для 2.4 вносил. Код открыт.
(5) Не прошло и года, реализовал =)
Спасибо! Кажется, это то, чего так недоставало типовой ERP
Добрый день, для пущей универсальности добавьте в код поддержку КА 2
(16) Добрый день. Спасибо за совет, добавил поддержку КА2.
Добрый день. У нас КА 2.4. Пробуем обработку. Сторнируем документ от марта 2019. Стоит запрет изменения данных до 31.03.2019. Ошибка:Дате 15.03.2019 соответствует запрет изменения данных пользователя.
(18) Добрый день. Если я правильно вас понял, то проблема в том что стоит дата запрета до конца марта, и вы указали в поле даты сторно 15 марта, и типовые механизмы не дают сделать сторно. Обработка никак обойти такую проверку не может, поэтому можно или дату сторно ставить на апрель, или же переносить дату запрета.
Дату сторно мы выбираем апрельскую, но ошибку все равно не дает
(20) Возможно по какому то регистру сведений сторно пытается сделать движения в марте. Попробуйте на вкладке снять галки со всех регистров сведений, может поможет. У меня комплексной нет под рукой и проверить пока не могу. Напишите по какому документу делаете сторно, я на недели посмотрю.
Добрый день!
1С:ERP Управление предприятием 2 (2.4.7.151)
Делал сторно к документу Отчет комиссионера (агента) о продажах.
Не делает движения по регистрам накопления, хотя они есть в списке Отбор по регистрам:
1. Активы и пассивы (ПрочиеАктивыПассивы) — хотя данный регистр доступен для выбора при настройке состава регистров в документе Корректировка регистров
2. Плановые оплаты клиентов (РасчетыСКлиентамиПланОплат) — не доступен для выбора в Корректировке регистров (видимо косяк типовой конфы)
3. Расчеты с клиентами по срокам (РасчетыСКлиентамиПоСрокам) — не доступен для выбора в Корректировке регистров (видимо косяк типовой конфы)
Дополнение к пунктам 2-3:
зачем на вкладке Отбор по регистрам показываются даже те регистры, которые недоступны в настройке состава регистров в документе Корректировка регистров?
Т.е. если правильно понимаю, то в типовой документ Корректировка регистров при всем желании не получится данной обработкой добавить записи по недоступным регистрам.
Видимо в списке Отбор по регистрам нужно показывать только те регистры, по которым открыта возможность создания движений для документа Корректировка регистров.
(22) Добрый день.
По дополнениям, я действительно не анализировал какие регистры можно корректировать с помощью документа корректировки, не было такой необходимости, возможно переделаю позже.
По ошибке сейчас нет под рукой ERP и проверить не могу, как проверю, дополнительно напишу.
(22) Проверил на типовой демке релиза 2.4.7.151, регистр Активы и пассивы корректно заполнился.
(24) Извиняюсь, к обработке вопросов нет.
Вопрос к ERP.
Причина была в следующем.
В ERP, по крайней мере в 2.4.7, есть баг: при первом проведении документа (после создания) не создаются записи в регистр Активы и пассивы (как минимум речь про ПТУ).
Эти записи появляются только при втором проведении (в дальнейшем не исчезают).
Вашей обработкой воспользовался после первого проведения документа.
А затем видимо еще перепроводил документ.
Соответственно получилось, что движения в Активы и пассивы документ создает, а в Корректировку они не попали.
Спасибо за оперативную реакцию!
А как решили вопрос со сторнированием регистра по клиентам по срокам?
ведь без его корректировки — в ведомости по клиенту ничего не изменится.
(26) Я уже года полтора с ERP не работал. Если не сложно опишите подробнее вопрос (а то я не понял что то), хотя бы какая база и какой документ, я посмотрю, и дам ответ.
(27) раньше документы по расчетам с клиентами/поставщиками формировали регистры накопления «Расчеты с клиентами (поставщиками)» и «Расчеты с клиентами (поставщиками) по документам».
Этот набор регистров остается, если расчеты ведутся офлайн.
Мы же в новой базе включили расчеты онлайн.
И теперь вместо регистра «Расчеты .. по документам» — появился регистр «Расчеты с клиентами (по срокам)».
И если в регистр «расчеты … по документам» можно было сделать запись документом «корректировка регистров», то регистр по срокам — корректировкой не двигается.
(27)
1С:ERP Управление предприятием 2 (2.4.6.207)
Документ например, Реализация товаров и услуг.
Расчеты с КА — онлайн.
(28) Постараюсь на недели посмотреть. Но думаю что этот регистр не является регистратором для корректировки, и обработка с этим ничего не сможет сделать. Тут видимо дорабатывать конфигурацию необходимо, что бы можно было сторнировать данный регистр.
(28) Посмотрел регистр «Расчеты с клиентами (по срокам)» — регистратором для этого регистра установлен только документ «РегистраторРасчетов», поэтому когда обработка сторнирует документ к примеру Реализацию, она не трогает записи по этому регистру (запись сделал другой документ). Но и отсторнировать корректировкой документ «РегистраторРасчетов» не выйдет, т.к. корректировка не является регистратором.
На вскидку, можно доработать обработку, что бы при сторнировании помечался на удаление связанный документ «РегистраторРасчетов», и тогда движений по «Расчеты с клиентами (по срокам)» не будет. Но тут надо смотреть на что это может повлиять в дальнейшем.
(31) спасибо!