Приводим в порядок 60-ый счет (расчеты с поставщиками и подрядчиками)




Принцип обмена данными из 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='\

14 Comments

  1. Alex_E
    Буду рад, если кому поможет!

    — вот это вряд ли — документы расчетов с контрагентами тупо повиснут в сальдо — это не помощь — это вредительство 🙂

    Reply
  2. aximo

    (1) Alex_E, да, по документам не ведется…. не совсем ясно для понимания, зачем вести 60-ый счет по документам — он должен вестись в разрезе контрагент-договор.

    Думаю, найдутся люди, которые понимают и это их устроит

    Reply
  3. Рустам

    Если данная обработка предназначена для Бухгалтерии 2.0, то в этой конфе, 60 и 62 счета ведутся только по документам расчетов. Пользователь конечно может вести учет без учета документов расчетов, но тогда будут проблемы с заполнение рег. отчетности, формированием счетов-фактур на аванс, ну вообще это не красиво)) А 60 счет ведется в разрезе документов расчетов, в том числе для того, чтобы можно было получить информацию о дате возникновения задолженности.

    Reply
  4. aximo

    (3) прошу предложить ваше решение проблемы закрытия 60-ого счета, года на 60.01 и 60.02 к концу месяца одновременно висят суммы по 1 договору. плюс, существуют по-необходимости ручные проводки за месяц… ситуации бывают разные.

    Reply
  5. Alex_E

    (2)

    Думаю, найдутся люди, которые понимают и это их устроит

    — думаю, что люди, которые Вас понимают, не понимают, как работает программа 🙂 Даже если они не хотят вести учет по документам, БП это делает сама, а Ваша обработка не поможет исправить учет, а ещё больше его испортит — проверьте сами — сформируйте оборотку по всем трём субконто — наверное сильно удивитесь. Но суровая правда жизни такова, что при составлении отчетности, а и в принципе везде, где это необходимо, прогрмма будет брать сальдо в разрезе всех субконто, а не первых двух. Так то начиная с баланса и далее по списку будет полный фуфел, прости господи))))))))))))))))))

    Reply
  6. Рустам
    прошу предложить ваше решение проблемы закрытия 60-ого счета, года на 60.01 и 60.02 к концу месяца одновременно висят суммы по 1 договору. плюс, существуют по-необходимости ручные проводки за месяц… ситуации бывают разные.

    Есть такой замечательный документ, как «Корректировка долга», можно воспользоваться им, либо тоже самое сделать через «Операцию введенную в ручную», если лень руками это делать, то можно написать обработку, которая свернет взаиморасчеты по документам расчетов))) Ну или на крайний и не хороший случай, закрыть все движения на один документ расчетов, ну это если по 60 или 62 счету очень сильный бардак.

    Reply
  7. aximo

    (5), (6) я вас понял

    Reply
  8. Alex_E

    (6) Рустам, Корректировка в любом случае — более правильно — например при усн она сделает (в смысле может сделать) дополнительные движение по забалнсу и регситрам, в операции все это то же можно сделать — только уж больно хлопотно 🙂

    Reply
  9. Рустам

    (8) Alex_E, Согласен, корректировка, самый правильный для этих целей документ, но она к сожалению плохо работает с отрицательными остатками. Поэтому, без операции, никуда))

    Reply
  10. Alex_E

    (9) Рустам, Отрицательные остатки по счету — это совсем поганый учет. Корректировка работает нормально, больной вопрос для неё- это неправильные виды договоров в остатках по счетам, например на 62 вид договора с поставщиком, но всё это решаемо, например заполнением ТЧ из внешней обработки, зато движения будут правильные, а операция — чтожд, я видел бухгалтерию, где только операции и были в учете, или были документы, сплошь отредактированные ручной корретировкой — те же операциии….

    Reply
  11. Рустам

    (10) Alex_E, я не в коем случае не отрицаю того факта, что «Корректировка долга», лучший документ для подобных затей)) А операцию, я предложил всего лишь как вариант)) я и сам не однократно видел, как при помощи операции вели учет, при этом закрывали затратные счета, делая руками по 400-500 проводок.

    Reply
  12. Lukich66

    Рустам и Алексей. Хоть вы формально и правы, но учет по док.расчетов вещь спорная, данная методология в Бух имеет больше минусов , чем плюсов , а именно — необходимость многократных перепроведений этих самых доков для восстановления последовательностей и т.с. красоты закрытия.

    Недавно в Бух_2.0 на УСН нашел способ как отключить учет по документам , но при этом сохранил механизм учета регистра РасходыУСН , ради которого и нужны были ДР.

    Обработка по приведению в порядок 60,62 сч- нужна именно для определения «неудачного» закрытия ДР и перепроведения их в нужной последовательности , без тупого всеобщего перепроведения. За «метод» ручных операций — предлагаю отрывать эти самые «ручки».

    Reply
  13. Alex_E

    (12) Lukich66,

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

    — это вещь не спорная — а объективная реальность…ни итд. Способа отключить учет по документам без снятия конфигурации с поддержки нет, поэтому использование этой обработки пользователям типовых не поможет, а только навредит. По поводу необходимости многократного перепроведения — это опять же или не знание принципов ведения учета или не знание возможностей, например можно вообще не заморачиваться перепроведением, с точки зрения зачета авансов, если в документах выбирать способ зачета авансов — «Не зачитывать» и зачесть их «чохом» последним днём с помощью корректировок долга — но это — дело вкуса.

    Учет по документам, в принципе — это не только ценный мех, блин, УСН, но и как выше упоминалось, возможность отслеживать задолженность по срокам возникновения, а для некоторых организаций просто жизненная необходимость, когда клиент оплачивает не просто задолженность, а например, реализацию за январь, и июнь с июлем, а за февраль — май оплачивать по каким то причинам не хочет (пример реального учет в в ФГУПе где порядка 15 000 клиентов) (опять же режим расчетов по документам без аналитике в этом случае невозможен).

    Сам факт, что без перепроведения всех документов за месяц закрытие месяца (имеется ввиду корректное) невозможно, т.к. окромя зачетов авансов есть ещё стоимость списания ТМЦ (или партии, или НДС, если включен сложный учет) — это всё встает на место только после группового перепроведения (или придумать свои обработки, которые все эти аспекты учета исправят без перепроведения)…

    По итогам — поломать типовые механизмы можно, особенно, если нет их полного понимания, только сделать вместо их работоспособные свои — слишком хлопотно…

    Reply
  14. gutentag

    (4) Надо создавать не операцию а документ «Корректировка долга»(взаимозачет)

    Reply

Leave a Comment

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