Инвентаризация расходов будущих периодов ИНВ-11 для БП 3.0




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

23 Comments

  1. gull22

    За печатные формы инвентаризации — однозначно плюс. До сих пор удивляюсь, почему1с их не встраивает.

    Reply
  2. drozodvdmitriy@mail.ru

    все робит, супер, автор зачет

    Reply
  3. DeMorshe

    Спасибо автору — нужная форма.

    Пара замечаний…

    1) Не корректно считает остаточные суммы по 97-му счету если Регл.операция со временем 23:59:59, а отчет делается на эту же дату. Решает проблему передача в запрос не даты, а Границы с включением конца (для получения остатков по регистру бухгалтерии), только для этого нужен доп.параметр, т.к. в запросе есть расчет периодов от этой даты.

    2) И еще если весь подвал выводится на отдельной странице, то на ней необходимо выводить итоговую строку (ну как-бы подписи должны именно под ней стоять)).

    Могу скинуть подправленный вариант автору 🙂

    Reply
  4. mr.lynx

    (3) DeMorshe, Доработал с учетом ваших замечаний и обновил файл в публикации. Весьма благодарен, очень жаль, что сам не заметил.

    Reply
  5. koka

    Супер! Сразу заработало! Благодарность автору от меня и нашего Главбуха.

    Reply
  6. andron58

    Границу вы, товарищи, не правильно указали. Зачем там в границе Прошлый месяц смотреть??

    У вас так написано:

    Запрос.УстановитьПараметр(«КонПериодаГраница»,Новый Граница(ДобавитьМесяц(Объект.ДатаНачалаИнвентаризации,-1), ВидГраницы.Включая));

    Правильно будет так:

    Запрос.УстановитьПараметр(«КонПериодаГраница»,Новый Граница(КонецДня(Объект.ДатаНачалаИнвентаризации), ВидГраницы.Включая));

    За обработку спасибо, сэкономила моё время.

    Reply
  7. mr.lynx

    (6) andron58, все правильно заметили и товарищи быстро все исправили и даже уже опубликовали корректный отчет 🙂

    Reply
  8. rin0310

    Спасибо за отчет! Есть замечания: в макете указан ошибочный формат ячейки:

    в колонке 9 (СуммаКСписаниию) в строках Строка, Итого: формат даты (ДФ=dd.MM.yyyy) вместо формата числа;

    в колонке 11 (СписаноЗаМесяц) в строках Строка, Итого: формат года (ДФ=yyyy) вместо формата числа;

    Reply
  9. mr.lynx

    (8) rin0310, Файл обновил. Исправил формат и заодно выравнивание в числовых полях, теперь будет выравнивать по правому краю.

    Reply
  10. 010114

    у меня пишет ошибка методанных, (у нас БП 3 )

    Reply
  11. mr.lynx

    (10) 010114, нужно больше информации, а именно:

    • в какой момент появляется ошибка
    • подробное описание ошибки
    • версия платформы и конфигурации
    Reply
  12. OlgaK663300

    Колонка 4 формируется и спр. «Раходы будущих периодов». Это не верно, т.к. сумма, указанная в этом справочнике является справочной. Необходимо весь расчет строить на основе первоначальной суммы из Операций.

    Reply
  13. pas

    Спасибо. Так как в настоящее время учет страховок должен учитываться не на счете 97, а на счете 76.01.9, то для этих целей на основании данной разработки получилось легко создать новый вариант акта инвентаризации для счета 76.01.9.

    Reply
  14. GellaGel

    Спасибо большое за обработку, она мне так срочно нужна была, т.к. бухи в самый последний момент мне заявили о необходимости. Сидеть делать макет и выверять выборку не было времени.И на тебе! сходу нахожу вашу обработку, готовенькую! Никаких ошибок ни в форме, ни в выборке не нашла. Всё классно.

    Reply
  15. ron1

    Здравствуйте.

    Сергей, подскажите, пожалуйста, в текущей версии 3.0.47.33 обработка будет работать?

    Reply
  16. mr.lynx

    (15) Здравствуйте.

    Да, должно работать. Если не будет работать, тогда доработаю и выложу исправленную версию.

    Вам вышлю по почте новую версию, чтобы не скачивать два раза.

    Reply
  17. zaia

    Круто было бы, если бы отчет разрезал на листы с выводом шапки и промежуточных итогов на каждом, как в стандартных формах инвентаризации (например, ИНВ-1).

    А так получается, в силу того, что используется разный формат строк — в экселе очень трудоемко резать на листы и добавлять подвалы с промежуточными итогами в каждом.

    Reply
  18. mmmstr

    Здравствуйте!

    вчера купила Ваш отчет, но на почту ссылка не пришла. что делать в таком случае?

    Reply
  19. mr.lynx

    Если ссылка не приходит то этот вопрос лучше направить поддержку infostart.

    Reply
  20. mmmstr

    (19) спасибо!

    Reply
  21. user1030940

    Добрый день! Для Бух КОРП 3.0.67.67 подойдет, подскажите, пожалуйста?

    Reply
  22. user1030940

    И по счету 76.01.9 формирует отчет или только по 97?

    Reply
  23. mr.lynx

    Добрый день. Не знаю, не тестировал на этой конфигурации. Отчет формируется только по счету 97.

    Reply

Leave a Comment

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