Закрытие (обнуление остатков) регистров бухгалтерии, накопления (обработка заполнения табличных частей)




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

22 Comments

  1. tireal

    Обработка предназначена для заполнения документа «Корректировка записей регистров» кор. записями остатков выбранного списка регистров с отбором. В результате, остатки обнуляются.

    Перейти к публикации

    Reply
  2. husky

    Пригодилась, спасибо.

    Reply
  3. tchvlad

    Спасибо, пригодилась, немного подточил под свои нужды и в итоге сэкономил несколько часов 🙂

    Reply
  4. BarkinI

    Почему нельзя сделать отбор например по счету например 41.01, у которого остаток по количеству 0, а сумма есть, в разрезе субконто для этого счета?

    Reply
  5. BarkinI

    Вот такая ошибочка, во время заполнения. {Форма.Форма.Форма(34)}: Ошибка при вызове метода контекста (Записать): Запись не верна! Корреспонденция между балансовыми и забалансовыми счетами (Регистр бухгалтерии: Журнал проводок (бухгалтерский учет); Номер строки: 524)

    Reply
  6. tireal

    (4) BarkinI,

    Судя по описанию вы пытаетесь закрыть остаток балансового счета на забалансовый, ожидали другого результата?

    Reply
  7. BarkinI

    Сейчас разобрался. Может надо какие то проверки добавить.

    Reply
  8. Alex141516

    В случаях когда на остатке нет суммы, но есть количество — заполняет КЗР неверно.

    Не вникал сильно, но не это ли ошибка:

    ДтКт = ?(Строка.СуммаОстатокДт, «Дт», «Кт»).

    Суммы нет на Дт, а есть количество на Дт, а результат выражения будет Кт.

    Reply
  9. tireal
    Не вникал сильно, но не это ли ошибка:

    ДтКт = ?(Строка.СуммаОстатокДт, «Дт», «Кт»).

    верно, ведущим ресурсом принято сделать «Сумму» — остатки без суммы будут обрабатываться не правильно.

    Reply
  10. AlexO

    (0) т.е. данная обработка отбирает из РБ записи (согласно отбору) и делает списания по счетам?

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

    Reply
  11. tireal
    Таким образом — это равнозначно удалению записей?

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

    Reply
  12. AlexO

    (10) аналогия — в том, что можно, сохранив документы, полностью удалить по ним движения по РБ Хозрасчетный. :)))

    Reply
  13. 26178_mail.ru

    Спасибо огромадное!!! Вещь нужная в хозяйстве, легко и просто можно достигнуть нужного результата. например понадобилось занулить регистр НДС Косвенные расходы и удалось это легко сделать +++++++++++++++++++++++

    Reply
  14. Гость

    хорошая весчь

    Reply
  15. campa_vol

    Полезная. Спасибо! Вещь нужная!

    Reply
  16. tireal

    Немного подправил, добавил обнуление регистров накопления, так же можно обрабатывать регистры списком. Ошибка с количеством в рег. бухгалтерии тоже подправлена.

    Reply
  17. inda

    не закрывает небалансовые измерения регистра бухгалтерии

    75 строка форма, добавить:

    //НЕБАЛАНСОВЫЕ ИЗМЕРЕНИЯ
    //Валюта / Подразделения
    Для Каждого МДОбъект из МетаданныеОбъект.Измерения Цикл
    Если НЕ МДОбъект.Балансовый Тогда
    Движение[МДОбъект.Имя+»Дт»] = Строка[МДОбъект.Имя];
    КонецЕсли;
    КонецЦикла;
    

    Показать

    Reply
  18. Saifa

    Подскажите, для управляемого приложения подойдет?

    Reply
  19. AlexO

    (15) выложили бы пока здесь, чтобы не скачивать обновление снова за СМ )

    Reply
  20. ssn5810

    НЕТ и это не где не указано !!!!

    Reply
  21. John_Bel

    Спасибо! Отличная вещь!

    Reply
  22. zayden

    не открывается в упп

    Reply

Leave a Comment

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