Остатки по счетам




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

15 Comments

  1. cs25

    Вот бы под БП 8.0 такую штуковину !!! А так +1 !!!

    Reply
  2. teflon

    +1

    полезная вещь.

    Reply
  3. mihenius

    Если ее немного доработать и добавить субконто в ТЧ получится универсальная 😉

    Не только для переноса остатков, а так же для корректировки текущего сальдо по субконту

    Reply
  4. Dolly_EV

    А вот мой вариант http://infostart.ru/profile/14620/projects/1938/

    Типа реклама))

    Reply
  5. ron1

    Сформировала. Это +.

    «После заполнения документ достаточно перебросить в новую базу любыми доступными средствами и сформировать проводки»

    А подскажите хоть одно средство. Плиииз.

    Reply
  6. Strange Device

    Самое простое Import77.ert и Export77.ert с ИТС, для продвинутых пользователей поможет конфигурация «Конвертация данных», а также можно использовать целую кучу обработок с данного сайта по выгрузке-загрузке…

    Reply
  7. kairinishad

    Может я чего-то не понимаю, но как мне ЭТО в мою базу запихнуть?

    Reply
  8. Strange Device

    Скачиваешь, распаковываешь файл из архива с расширением *.md в отдельную папку, прописываешь в окне запуска 1С 7.7 путь к этой папке после чего заходишь в полученную базу с единственным документом в режиме конфигуратора, открываешь эту конфигурацию, в ветви документы, позиционируешься на единственном документе и копируешь его (Ctrl-C) в буфер обмена. Не закрывая эту конфу открываешь в конфигураторе базу, в которую надо вставить документ, заходишь в ветвь документы рабочей базы, и вставляешь в нее скопированный документ (Ctrl-V). Закрываешь базу с сохранением изменений. Да, перед тем как проделать описанную процедуру не забудь сохранить базу (меню «Администрирование») чтобы в случае сбоя или неправильного понимания описанного процесса всегда можно было вернуться к старому варианту базы…

    Reply
  9. Shaman342

    Strange Device, а как быть с этим… при проведении?

    глСообщениеПроведения<<?>>(ТекстСообщения, ТекущийДокумент(), 1);

    {Документ.ОстаткиПоСчетам.Модуль Документа(24)}: Процедура не обнаружена (глСообщениеПроведения)

    Операция.ПервичныйДокумент = глПредставлениеПервичногоДокумента<<?>>(Контекст);

    {Документ.ОстаткиПоСчетам.Модуль Документа(38)}: Функция не обнаружена (глПредставлениеПервичногоДокумента)

    глСообщениеПроведения<<?>>(ТекстСообщения, ТекущийДокумент(), 0);

    {Документ.ОстаткиПоСчетам.Модуль Документа(76)}: Процедура не обнаружена (глСообщениеПроведения)

    глПриПроведении<<?>>(ТекущийДокумент());

    {Документ.ОстаткиПоСчетам.Модуль Документа(77)}: Процедура не обнаружена (глПриПроведении)

    Reply
  10. Strange Device

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

    Reply
  11. min2

    Поюзал данный документ. Суммы в валюте на счетах

    60.6, 60.11, 62.6 — не перенеслись. (в рублях всё ок)

    Есть мысли как это побороть?

    Reply
  12. Famza

    (11) min2, а сформировались в бухсправке?

    Reply
  13. Strange Device

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

    Reply
  14. Serge_ASB

    Скажите, если в базе нет док. Бух. справка, то его можно просто создать у себя, или же можно заменить чем-то другим?

    Второй вопрос — при попытке переноса со счета 41 (товары) выдает нулевые суммы.

    Reply
  15. Strange Device

    (14) Serge_ASB, Здесь два варианта переноса остатков, первый, старый с документом ввода остатков, этот документ надо добавить в конфигурацию (причем, поскольку я добавлял его на сайт достаточно давно, то скачать его с сайта можно совершенно бесплатно), второй сделал позже (поэтому сайт за него требует денег в колечестве 1 бабка :-)), чтобы не заморачиваться добавлением новых объектов в конфигурацию обработка, которая формирует остатки на документах бухгалтерская справка. Если в Вашей конфигурации нет документа Бухгалтерская справка, то скорее всего у Вас некая неизвестная мне самописная конфигурация, потому что во всех известных мне типовых российских бухгалтериях такой документ есть уже больше десяти лет. Можно попытаться скопировать этот документ из типовых конфигураций, но в этом случае будьте готовы, то ряд процедур глобального модуля придется добавлять в Вашу конфигурацию руками — подобные вопросы уже были выше.

    Что касается второго вопроса, то, в принципе остатки по 41-му счету в типовом варианте, увы, не содержат суммовых остатков по складу 🙁 , в этом можете убедиться посмотрев более подробно настройки второго субконто «МестаХранения», я, конечно, пытался в ряде случаев получать эти остатки распределением сумм пропорционально количеству, но вполне может быть, что такое распределение не во всех случаях работает корректно, иными словами возможность получения остатков сильно зависит от настроек субконто для текущего счета и в некоторых случаях не может быть корректно получено 🙁

    Reply

Leave a Comment

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