Кассовая книга по подразделениям в Бухгалтерии 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='\

21 Comments

  1. Димча

    Можно установить Константу «ВестиУчетПоПодразделениям» в «Истина».

    Для счета «50.01» установить «УчетПоПодразделениям».

    Настроить обособленные подразделения в Справочнике «Подразделения».

    Тогда будут доступен имеющийся реквизит — «ПодразделениеОрганизации» в ПКО и РКО.

    Попробуйте.

    Reply
  2. ssvetusik

    Пробовала, может что не так делала, но у меня реквизит то появился в РКО и ПКО, только проводок по подразделениям не было(((

    Reply
  3. AlexeyPapanov

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

    еще подумайте, что будет, если вы отмените проведение? из регистра запись уйдет?

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

    если свойство «удаление движений» = автоматически, то при отмене проведения записи будут удаляться.

    Reply
  4. ssvetusik

    при отмене и пометки на удаление документов, запись из регистра уходит)

    «…и указываете в конструкторе движения по регистру» вот тут я не поняла, если я вызову конструктор движений у документа в процедуре ОбработкаПроведения все написанное сотрется же?

    Reply
  5. copti

    На самом деле, не всегда следует делать то, что можете сделать. Дело в том, что бухучет запрещает в одной организации вести несколько кассовых книг. Она должна быть одной по определению. Такими доработками вы подводите ваше предприятие под штраф за нарушение правил ведения кассовых операций по административному кодексу. Гипотетически вы можете заявить на предприятии несколько операционных касс, то только в этом случае придется в налоговой регистрировать несколько лимитов кассовых остатков. Это вряд ли устроит гл.буха. Хотя я встречал учителей русского языка, которые пишут с ошибками, наверно есть и гл.бухи, которые не знакомы с бухучетом…

    Reply
  6. AlexeyPapanov

    (4) все равно делается это именно так.

    обычно регистр подчиняется документу (-ам) — регистратору, который двигает этот самый регистр.

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

    ну или создание движений вставьте в эту процедуру — неважно в каком порядке.

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

    (5) copti, ну опять философия… считайте эту книгу упр. отчетом. если ставят задачу 1снику, его дело сделать. а про нюансы юридической стороны пусть думают те, кому положено.

    Reply
  7. ssvetusik

    (6) при создании регистра я указала каким документам он подчиняется, и в документах ПКо и РКО в движениях автоматом появляется данный регистр, обновляет базу сис админ, и ему проще будет с подпиской, чтобы каждый раз при изменении модуля объекта не вставлять дописанный кусок

    з.ы. для себя я всегда пользуюсь способом о котором вы говорите, так проще дописать процедуру ОбработкуПроведения)))

    спасибо за комментарии

    (5)я не писала что данная кассовая книга ведется для бух. учета. кассовая книга по всей организации никуда не делась и также функционирует

    это просто решение которое было необходимо предприятию, для внутренних нужд, и почему я подвожу под штраф? я исполнитель, и выполняю это не потому что мне взбрело в голову)

    Reply
  8. Гость

    Какой релиз платформы 8.3 использовали и какой релиз Бухгалтерии Предприятия 3.0 ?

    Reply
  9. ssvetusik

    (8) 1С:Предприятие 8.3 (8.3.5.1088)

    Бухгалтерия предприятия, редакция 3.0 (3.0.34.10)

    Reply
  10. WhiteOwl

    (1) ага, и еще разбанить установку значения в менеджере константы, а то там принудительно сбрасывается в «ложь». И ведь работает, только по головному и обособленному отдельно, а это же вроде не то, что нужно автору. А нашим бухам вообще не совсем понятно, что нужно, они и сами не знают 🙂

    Reply
  11. Ироида

    В общем модуле процедура вся на экран не поместилась, поправьте, пожалуйста

    Reply
  12. magic.rain

    Отчеты.сКассоваяКнигаПоПодразделениям.СформироватьОтчет(ПараметрыОтчета, АдресХранилища);

    сам метод СформироватьОтчет от типовой книги взят и переписан? а то ругается что нету метода..т.к отчёт внешний..

    Reply
  13. ssvetusik

    (11), попробую отредактировать чтоб все поместилось

    Reply
  14. ssvetusik

    (12), да все взято из стандартной типовой книги и переписано немного для внесенных изменений

    Reply
  15. mhs

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

    Reply
  16. mhs

    Если не сложно выложите текст процедуры в общем модуле … не вошел весь

    Reply
  17. simpleday87

    Повторюсь комментарием, выложите пож-та текс процедуры Процедура сПКОПроведениеОбработкаПроведения полностью

    Reply
  18. Dilovar9

    Есть более простой способ, сохранение поддержки конфигурации http://forum.infostart.ru/forum8/topic80906/message1759131/#message1759131

    Reply
  19. alegator

    Большая просьба (качал обработку — большое спасибо), Пвыложите пож-та текс процедуры Процедура сПКОПроведениеОбработкаПроведения полностью или на почту mov031274@yandex.ru

    Reply
  20. ssvetusik
    Reply
  21. SmArtist

    Для сохранения нумерации листов кассовой книги головного подразделения без доработки, можно сделать так: http://infostart.ru/public/645791/

    Reply

Leave a Comment

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