Редактор счетов плана счетов для 1С: Бухгалтерия 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='\

16 Comments

  1. mszsuz

    Интересно, а приведенные примеры с 43 и 60 с 62 используются в реальной практике? Все механизмы конфигурации корректно отрабатывают?

    Reply
  2. Abbra

    (1) mszsuz,

    да, это реальные примеры из практики. Для них и делалась обработка.

    Еще некоторые ведут 42 счет не по складам (т.е. делаем субконто склады оборотным).

    Однако закрывается он тогда вручную, но всего одной проводкой.

    Reply
  3. Abbra

    Конечно, для ОСНО и НДС вариант вести без выделенных счетов авансов работать не будет.

    Reply
  4. Y_U_S

    Тоже думал идти по Вашему пути, но красиво обработкой не получается — сделал расширением (http://infostart.ru/public/447602/).

    Однако, разрешение изменения подчинённости счёта благоразумно закомментировал (оставил типовое) — желающие могут снять комментарий самостоятельно на свой страх и риск.

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

    Reply
  5. Alex_E

    Интересно, а можно застрелить за подобные советы? План счетов конечно не священная корова, но ежели не ИП, то однако баланс, да и др. регламентированная отчётность, а тама сальдо, по всем субконто, которые ВДРУГ становятся оборотными, пустячёк, конечно, но поменяв План счетов ИСЧЁ (как правильно пишется знаю, но тут токо так!!!) и переписать всю отчётность — тады да, была бы публикация, а так — ИМХО профанация ))))

    Reply
  6. Abbra

    (4) Y_U_S, Спасибо! А изменение подчиненности нужно для восстановления правильного положения счета. Были ситуации когда кто-то переподчинил счета и нужно было их вернуть на место.

    Reply
  7. Abbra

    (5) Alex_E, ну я же не предлагаю ВСЕ субконто ВСЕХ счетов сделать оборотными.

    Что касается тех счетов, о которых я писал: 42 и 43 попадают в баланс без учета субконто, 60.01,60.02,62.01,62.02 — берутся по субконто Контрагенты и Договоры (субконто Документы расчетов не участвует в расчете)

    Вообще-то я может бы и не писал примеры использования, но мне без них публикацию не утверждали.

    Reply
  8. Alex_E

    (7)

    Что касается тех счетов, о которых я писал: 42 и 43 попадают в баланс без учета субконто, 60.01,60.02,62.01,62.02 — берутся по субконто Контрагенты и Договоры (субконто Документы расчетов не участвует в расчете)

    — кто Вам это сказал? В активы и пассивы попадет САЛЬДО по ВСЕМ субконто ВСЕХ счетов, где это сальдо есть, в принципе всегда было так, или субконто уже в типовой будет оборотное. Хотите доказать обратное, внимательно выслушаю)))

    Reply
  9. Abbra

    (8) Alex_E, Сформируйте баланс и нажмите кнопку расшифровка по строкам 1230,1210,1520

    вы там увидите следующее

    Строка 1520 «Кредиторская задолженность», графа «На 30 июня 2016 г.»

    Положительное сальдо на конец периода по кредиту счета 60.01 по субконто «Контрагенты», «Договоры»

    + плюс

    Положительное сальдо на конец периода по кредиту счета 60.21 по субконто «Контрагенты», «Договоры»

    + плюс

    Положительное сальдо на конец периода по кредиту счета 60.31 по субконто «Контрагенты», «Договоры»

    + плюс

    Сальдо на конец периода по кредиту счета 60.03

    + плюс

    Сальдо на конец периода по кредиту счета 62.02

    + плюс

    Отрицательное сальдо на конец периода по дебету счета 62.01 по субконто «Контрагенты», «Договоры»…

    а по поводу

    В активы и пассивы попадет САЛЬДО по ВСЕМ субконто ВСЕХ счетов, где это сальдо есть

    — коллега, ну зачем же так подставляться ). В баланс не попадает много БАЛАНСОВЫХ счетов даже если по ним есть остатки, например 000,25,26,44…

    Reply
  10. Alex_E

    (9) 000 — счет с признаком балансовый, но таки служебный и в баланс не попадает по причине его отсутствия в Плане счетов бухгалтерского учета, а не присутствия в программе 1С — счет предназначен для ввода начальных остатков и не более того (иногда используется, когда нужно сделать проводки по НУ, ВР или ПР по балансовым счетам, но только для целей учёта налога на прибыль)

    25, 26 — закрытые счета, остатков по которым на конец месяца БЫТЬ В ПРИНЦИПЕ НЕ МОЖЕТ, если они есть — значит нет учёту)))

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

    по 60 и 62 сейчас попробую нарисовать пример в демке)))

    Reply
  11. Alex_E

    Итак: вот сальдо по 60 и баланс, таки документы учитываются)))

    Reply
  12. Alex_E

    (9)

    коллега, ну зачем же так подставляться ). В баланс не попадает много БАЛАНСОВЫХ счетов даже если по ним есть остатки, например 000,25,26,44…

    — коллега, а вы про бух. учёт чё нить слыхали? Козьма Прутков как то сказал, что если ты видишь на клетке со слоном надпись Бегемоот — не верь глазам своим….(за точность цитаты не ручаюсь, но смысл тот))))

    Reply
  13. Abbra

    (11) Alex_E,

    По поводу 44 счета я действительно ошибся.

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

    Так что есть вероятность, что кто-то из нас подрисовал баланс.

    Reply
  14. Alex_E

    (13) Создал новую организацию в ДЕМКе, сделал поступлене и операцию вручную, заполниол баланс. Наверное кто-то чё-то ещё подрисовал, но картинки именно такие получились…

    По поводу 44 счета я действительно ошибся.

    — тут я могу сказать что не только по поводу 44, но и по поводу 000, 25 и 26 то же)))), ладно, заблуждайтесь дальше, просто я уже спросил, по поводу бух.учёта у Вас как?

    Баланс строится по остаткам, остатки программа видит по аналитике, если в аналитике не оборотное субконто, то по нему есть сальдо, которое попадает в баланс и прочие отчёты. Ломать План счетов в этом случае можно, но только с одновременным переписыванием регламента (так было во времена 7.7, БП 1.0 под 8.0 итд итп), на слово не верите, ну и ладно, но за такую публикацию нужно убивать из рогатки сразу, пока такая зараза не расползлась среди населения)))))))))

    Reply
  15. Abbra

    (14) Alex_E,

    по поводу бух.учёта у Вас как?

    ну как не в совершенстве конечно

    век живи — век учись

    Reply
  16. Alex_E

    (15) Вот это правильно. Мой совет просто услышьте, если не понимаете, как работает программа, не стоит её модифицировать, потому как в одном месте всё будет красиво, а в другом …

    Расскажу одну притчу, впрочем на реальных фактах основанную (рассказала коллега, по приходу к новому клиенту):

    пришла, посмотрела, спрашивает, а чё так всё хреново, ответ был гениальным (ответила глав.бух):

    — Да программист хреновый попался!

    Искренне желаю Вам не попасть в такую ситуёвину))))

    Reply

Leave a Comment

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