Остатки 20 счета (НЗП) в разрезе статей затрат для Бухгалтерии 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='\

10 Comments

  1. kit

    Хорошая идея, счет двойник, конфигурация без изменений.

    Reply
  2. cleaner_it

    Плюс за идею. Мы четвертое субконто добавляли на 20 счетах. У нас не совсем статьи затрат, но ваша идея вполне хороша.

    Reply
  3. Brawler

    Вопрос: А что происходит при таких проводках? Или практика внутренних услуг не учтена?

    Дт 23 — Кт 60 — получили услуги извне

    Дт 23 — Кт 10 — списали мыло душистое

    Дт 25 — Кт 23 — оказали внутренние услуги по уборке помещений или еще какая лабуда

    Дт 20 — Кт 25 — распределились ОПР

    Дт 23 — Кт 25 — распределились ОПР — а отсюдава еще раз может уйти в Дт 25, но уже с другого подразделения и заказа разумеется

    Reply
  4. Brawler

    Я тоже когда-то думал обойтись забалансовыми счетами, налепить обработчиков событий проведений документов, которые бы сами формировали дебет на забалансовых счетах, но вопрос закрытия затрат был открыт и сильно, в итоге были воплощены в жизнь два документа «Акт списания затрат» (три вида операций: Дифференцированное списание затрат (можно детально расписать что куда), Пропорциональное списание (частичное), Полное пропорциональное списание) и «Регламентная операция списания затрат». Актов в месяце создается множество, а регламентная операция разумеется одна. При закрытии периода в первый раз, делается типовое закрытие 20, 23, 25, 26 счетов без указания НЗП (все затраты уходят на выпуск), потом в актах в полуавтоматическом режиме бухгалтер указывает суммы БУ, которые точно нужно списать по ряду статей затрат, некоторые статьи считаются фиксированными, а другие «пляшущими» от ЗП и рассчитываются пропорционально введенной ЗП, по всем статьям рассчитываются суммы НУ, ПР, ВР и БУ для рассчитанных от ЗП. Все рассчитывается опираясь на предположение, что все затраты ушли на выпуск, а в акте указывается сколько на самом деле должно быть списано. Потом в акте есть возможность автоматически рассчитать НЗП (весь выпуск за минусом сумм в акте) и прописать его в документе НЗП. Потом делается чистовое типовое закрытие 20, 23… счетов. И выполняется не типовая регламентная операция руководствующаяся актами списания затрат постатейными, и сторнирующая весь выпуск с последующим постатейным отражением как указано в актах. Конечно начинают лезть копейки отовсюду, так как параллельно распределяются множество статей затрат по множеству выпусков, так и суммы не только БУ, а еще НУ, ПР, ВР (в контроле фигамотина). Потом все это дело просчитывается, выявляется куда копейки не так упали, делается корректировка копеек.

    Мрак в общем)))

    И да, на 20, 20.01, 23 счетах субконто «Статьи затрат» сделаны сальдовыми.

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

    Reply
  5. Brawler

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

    Реализован мастер первоначально создающий все акты списания затрат на основании проведенного чернового закрытия 20, 23.. счетов.

    Этот же мастер позволяется произвести автоматическое перезаполнение актов с полным списание затрат, коих большинство.

    В самих актах есть мастера заполнения табличной части списания затрат с автоматическим просчитыванием сумм БУ, НУ, ПР, ВР.

    В итоге много работы берет на себя программа, а ранее весь выпуск прописывался вручную различного рода документами еще в БП 1.5.

    Reply
  6. Гость

    (5) Brawler, up

    Reply
  7. Гость

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

    Reply
  8. sshopin

    В заголовке написано, что для Бухгалтерии 3.0. Попробовал добавить в конфигурации БП 3.0 — выдается известная ошибка:

    Невозможно подключить дополнительную обработку из файла.

    Возможно, она не подходит для этой версии программы.

    Метод объекта не обнаружен (СведенияОВнешнейОбработке)

    Этот метод я добавлю (и если что еще нужно, то тоже), но главный вопрос в другом: совместимы ли она реально с БП 3.0 или придется серьезно переписывать?

    Reply
  9. Olerina

    Здравствуйте. На конфигурации 3.0.70.50 КОРП не запускается файл ФормированиеОбЗБ20. Ошибка «Метод объекта не обнаружен (ПереключитьТекущуюСтраницуВыбораПериода)

    Reply
  10. чингачгук

    Обработки хороши, спасибо! Немного доработал (в последних обновлениях, стал недоступен модуль работы с датами). Нужно было получить себестоимость в разрезе статей затрат, что типовыми средствами в 1с Бух нереально. В принципе что нужно получил, но все-же пришлось руками некоторые записи подгонять. Но потом набросал отчет который выводит то же самое из регистра «Расчет калькуляции себестоимости». Т.е. получил нужные данные из типового регистра. Но это конечно касательно моей задачи, она все-же несколько отличается от той для которой сделаны обработки. Но сама идея класс!

    Reply

Leave a Comment

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