<?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='\
Вопрос, чем управляет флаг «Не очищать движения документов»?
Это значит, что указанные в соответствующих полях корректировки — не будут очищаться — к ним добавятся новые записи. Если галочку — не поставить — корректировки будут очищены. В описании об этом сказано..
Хорошая обработка, удобно! Еще бы… при задаче: «Перезаполнять данные по:»
добавить функцию «по договорам контрагента». Вообще тогда классно!
Трудно будет добавить в эту обработку функционал, позволяющий вести корректировку по договорам, которые ведутся по заказам? Или это должна быть принципиально другая обработка?
(4) Sema76, такая обработка есть, но после нее во многих случаях становится только хуже..так как бардак обычно по заказам жуткий..ну и она на сколько я помню не совсем универсальная-я ее до конца до ума не довела. Если хочешь могу скинуть так просто на мыло-может если чуток доработать тебе подойдет.
(5) Bubuyka, было бы интересно. У меня сейчас задача навести порядок в УПП по взаиморасчетам. Как по договорам в целом, так и по заказам. Где бы вот еще теорию почитать, чтобы понять, что сделать. Меня даже бы устроил подход, корректировать по одному контрагенту, договору, даже устроит, чтобы подобрать подходящую дату и время для корректировки по договору. Может как вариант «закрыть» существующие договора по заказам, и с чистого листа по новым (в смысле, в самой программе). Любой подход приемлем. Лишь бы постепенно привести все в порядок.
На самом деле сколько я не пыталась людей, сколько сама не думала так и не нашла пиши для ведения взаиморасчетов по заказам. Это избыточная аналитика по крайней мере в тех конторах в которых я работала. Регистры для учета взаиморасчетов по заказам используют все те же. Просто в регистрах Расчеты по приобретению и Взаиморасчетов по док расчетам заполняется еще и Заказ. Соответственно остатки превращаются в лохматый веник скрытый от глаз доблестный бухгалтерии. На самом деле самый лучший выход перекинуть остатки на новые договора, которые будут вестись по договору в целом.
Вот обработка для выправления взаиморасчетов по договорам, которые ведутся по заказам. Но еще раз обращаю внимание — что она может работать не корректно. Делала давно под спец. задачу. Но можно взять за основу сам принцип. Сильно уж не пугайтесь процентов на 90 она работает.
Обработка
(9) Bubuyka, спасибо!
Буду разбираться! Думаю, результат будет. Мне это обязательно нужно сделать.
Посмотрел «По заказам». Используются те же регистры. Можно ведь в запросе использовать поле «Сделка» для сравнения.
Какие «подводные камни» могут быть, если применить ту же методику, что и «По договору в целом»?
(10) Sema76, да там все то же самое. Глянь в обработке. Подводные камни.. ну во-первых сложно найти человека, который сможет адекватно сказать, что да это поступление и эта платежка (по разным сделкам) так и должны висеть на остатке, а вот эти ошибочно отнесены на разные сделки, а на самом деле должны быть схлопнуты. Плюс бухгалтерия в ужасе от красноты творящейся в оборотке, по вине регистров о существовании которых они зачастую даже не подозревают. Так что мой совет — выводить оставить по всем договорам, делать их копии (только с каким -то признаком) переносить остатки на эти новые договора и вести уже в целом по договору.
(11) Bubuyka, нам нужно обязательно часть договоров вести «По заказам». Красноты уже много. Будем разбираться. Бухгалтера нормальные, продвинутые, несколько лет уже работают в УПП;) И не только они, но и экономисты и кладовщики, и расчетчики, короче все. Буду сообщать как развивается ситуация.
(12) Sema76, Ну в таком случае — искренне рада за тебя)) Это ОЧЕНЬ большая редкость! На самом деле если следить за этим делом — и держать руку на пульсе — то система работает четко — так что работать и по заказам вполне можно. Буду рада услышать о дальнейшей судьбе ваших взаиморасчетов!
(13) Bubuyka, посмотрел обработку По заказам. Пока не очень понял как она работает. Она у меня выводит Контрагентов, по которым все нормально, по которым есть проблемы не выводит, или я сам что-то путаю. Ведь для обработки по Заказам можно использовать обработку В целом по договору. Добавить Измерение Сделка. Ведь те же регистры используются:
+ Регистр накопления «Расчеты по приобретению (бухгалтерский учет)» — Регистр накопления «Расчеты по приобретению (бухгалтерский учет)»
+ Регистр накопления «Взаиморасчеты с контрагентами» — Регистр накопления «Взаиморасчеты с контрагентами»
+ Регистр накопления «Взаиморасчеты с контрагентами по документам расчетов» — Регистр накопления «Взаиморасчеты с контрагентами по документам расчетов»
В чем отличие будет между По договору в целом и По заказам?
(14) Sema76, отличие и есть в измерении Сделка.
Пока, вроде разобрался с Регистром накопления «Расчеты по приобретению (бухгалтерский учет)». Использую эту же обработку, поменяв в ней «По договору в целом» на «По заказам».
Для выявления проблемных договоров пользуюсь Универсальным отчетом по Регистру накопления «Расчеты по приобретению (бухгалтерский учет)». Обработка правильно создает Документ «Корректировка записей регистров». По отчету следим чтобы не перепутались заказы.
(15) Bubuyka, по корректировке Регистра накопления «Расчеты по приобретению (бухгалтерский учет)» Измерение «Сделка» вроде не мешает. Документ «Корректировка записей регистров» заполняется его значением. Просто, думаю, повнимательнее надо контролировать.
Или здесь могут возникнуть какие-то ошибки?
(17) Sema76, да нет. Тут главный вопрос как раз в большом объеме и необходимо стиль все проверять.
(17) Sema76, регистр расчетов по приобретению как раз отвечает за зачет авансов. Если в предоплате была указана сделка, и отгрузка произведена без сделки, то аванс не захлопнется. Еще там есть немаловажный признак — дата операции. Так вот — корректировка долга его заполняет. Даже при наличии задолженности! в результате, долг, образованный через корректировку долга не захлопывается при оплате.
(19) elisabet, Если есть задолженность — то в корректировке долга надо указать документ расчетов. Тогда все нормально будет закрываться. (Если конечно договор ведется по документам расчетов). С корректировкой долга вообще надо аккуратно.. Там шаг влево шаг вправо и можно такие взаиморасчеты получить что мама не горюй.
{Форма.Форма.Форма(275)}: Ошибка при вызове метода контекста (Записать): Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!
—
может это ошибка потому что я использую один документ корректировка регистров по приходу и расходе ?
УПП ред.1.3.122.3
{ВнешняяОбработка.ПерезаполнениеОстатковПоВзаиморасчетам.Форма.Форма.Форма(396)}: Ошибка при вызове метода контекста (Записать)
НЗДанные.Записать();
по причине:
Запись не верна! Поле «Валюта» должно быть пустым! (Регистр бухгалтерии: Журнал проводок (бухгалтерский учет); Номер строки: 20)
(22)
Возможно у вас на одном из счетов завис остаток, в котором ошибочно (например бух. справкой) указали валюту и теперь обработка пытается честно эту проводку сторнировать. Проверьте остатки по оборотке в разрезе валют по «не валютным» счетам.