Перенос торговых операций в бухгалтерию БП 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='\

15 Comments

  1. CheBurator

    Если вы по «свернутой» бухгалтерской проводке сможете достаточно быстро выдать развернутые цифры, то вполне нормально. если же нет — это большая сильная бяка. а скорее всего будет «нет» — так как для выдачи развернутой информации потребуются либо обмены либо что-то еще, что не работает без участия технического специалиста. Наличие полных данных в бухбазе — не требует присутствия технического специалиста для их обработки (просмотра, выдачи на печать и прочее типовое). Вдобавок — свернутые проводки в бухбазе — не дают возможности прозрачно сопоставить данные с первичкой. тупо например выяснить, что является налогооблагаемой базой в сделке с товаромА по реализации-накладнойБ — без наличия «паралельной» базы в виде УТ/иной — трудно решаемая/нерешаемая задача.

    Вообщем, как всегда — выиграв в одном, мы проигрываем в другом.

    Reply
  2. lvictor58

    Вполне очевидно из описания, что никаких развернутых цифр в бухгалтерии нет. Вся детализация в УТ (или как у моих клиентов — в ТиС). Там же выписывается и вся первичка. Свернутых данных для бухгалтерии достаточно для формирования налоговой отчетности. Отнесение к затратам в УСН, не вдаваясь в подробности) это оприходование ТМЦ и оплата, что вполне реально оценивается программой в разрезе поставок — для поставщиков и оплаты отгруженного товара покупателями. И всех это устраивает.

    Reply
  3. Rustig

    (0) задача у вас «типовая» и «часто встречаемая»…

    пожелания бухгалтеров оправданы и имеют место быть…

    я пока не касаюсь вашего решения…

    Reply
  4. Rustig

    (0)

    «Комплектация номенклатуры». Здесь проблема возникла в части разукомплектации: для указания партий раздербаниваемых комплектов одного реквизита может оказаться недостаточно – может быть списано несколько партий по одной операции. Поэтому пришлось добавить еще одну табличную часть «Комплекты» с тремя колонками «Количество», «Документ оприходования» и «Себестоимость». Ну и перелопатить модуль проведения.

    я пока не касаюсь вашего решения в целом, пока напишу что мне не нравится добавленная вами табличная часть в документе «Комплектация ном-ры». Проблемы известны : в момент записи у вас определяется одна партия, при закрытии месяца другая по причине что документы довезли и допориходовали… при этом придется перезаполнять табличную часть Комплектации или по всем документам при закрытии месяца или при каждом проведении документов приходов….

    в принципе у вас основная задача — это определить корректно себестоимость списания. она решается другим способом, не надо плодить табличные части в Комплектациях….

    Reply
  5. Rustig

    (0) почему пришлось переписывать алгоритмы проведения? как у вас обмен происходит? с помощью типовых правил обмена? пробовали просто переопределить в правилах обмена выгружаемую номенклатуру на ПредопределнныйВашТовар? почему этого не достаточно?

    Reply
  6. h00k

    (5) Rustig,

    почему этого не достаточно? 

    Скорее всего потому, что при таком подходе НДС «плывет» при типовом проведении.

    Reply
  7. Rustig

    (6) поясните пож-та

    Reply
  8. lvictor58

    (5) Попробую пояснить, но не знаю насколько доходчиво это получится. Для начала просто попытайтесь врубиться в элементарные вещи. В одной реальной поставке товары имеют различную себестоимость и различную наценку. Это не овощная лавка, где на приход от поставщика накручивается процент наценки и товар по этой цене выставляется в торговый зал. Поэтому какие бы то ни было расчеты — пересчеты по «сводной» позиции номенклатуры исключаются. Все данные берутся из УТ или ТиС (давайте далее будем считать что это УТ) после оформления и перероведения там всех документов (восстановления последовательности) и закрытия месяца по торговым операциям. И даже если партия по какой-то причине там отсутствует, то в БП мы все равно должны указать документ и себестоимость хотя бы 1 копейку — что бы исключить пересчет. Потому и пришлось переписывать алгоритмы проведения в тех документах где разработчиками эти условия не выполнялись. В возврате товаров от покупателя можно было указать только документ сделки т.е. продажи. Представьте себе, что это это «Отчет о розничных продажах» на 100 000 рублей с себестоимостью на 70 000 рублей. и общим количеством N штук, килограммов, квадратных метров. Возвращают какую-то фмговину стоимостью 20 рублей и с/с 10. И если этого не указать, то программа тупо подставит первую по дате прихода партию и списанную по ней с/с разделит на списанное по ней же кол-во. И вместе с «копеечным» товарам вернет нам 1000 рублей себестоимости. Или наоборот с «дорогим» вернет копейки. И неизвестно, что хуже. Но в любом случае косяки в учете обеспечены, и чем дальше — тем будет хуже. Поэтому и пришлось «допиливать» конфигурацию, что бы в УТ и БП все было 1:1 и реальные данные а не черте что! Аналогично и при разукомплектации, которой подвергается конкретный товар, поступивший к нам по конкретной поставке и по четко обозначенной себестоимости которые в стандартном документе засунуть некуда.

    Типовые правила обмена тоже пришлось допиливать подменой товарных позиций и выполняя свертку по поставкам.

    (6) Не понимаю как НДС вообще куда-то может плыть. Тем более, что в УСН он вообще отсутствует.

    Reply
  9. Rustig

    (8) я согласен с тем, что конфигурация УТ полностью не автоматизирована в этом вопросе. Есть, где развернуться внедренцам.

    У БП 2.0 есть механизм «не рассчитывать себестоимость самой, а брать из УТ» — и я так понимаю, вы это используете? Остается только допилить корректный расчет себестоимости в УТ и обмен из УТ в БП….

    Хотел бы разобраться вот с чем: у вас в документах кто выбирает ключ «ДокументОприходования»: сама программа автоматически или человек-оператор?

    и еще, пока не ясно, у вас «чистое» ФИФО или «доработанное» ФИФО ?

    непонятно как так может быть:

    на 100 000 рублей с себестоимостью на 70 000 рублей. и общим количеством N штук, килограммов, квадратных метров. Возвращают какую-то фмговину стоимостью 20 рублей и с/с 10. И если этого не указать, то программа тупо подставит первую по дате прихода партию и списанную по ней с/с разделит на списанное по ней же кол-во. И вместе с «копеечным» товарам вернет нам 1000 рублей себестоимости. Или наоборот с «дорогим» вернет копейки.

    ведь по ФИФО все четко — пришел товар за 10р, продали за «все равно за сколько», возвращают его, должен сесть приход соразмерно возвращаемому кол-ву и себестоимости 10р… напишите пож-та пример сложного учета себестоимости товара, из которого следуют ваши выводы.

    Reply
  10. lvictor58

    (9) В УТ ничего допиливать не надо. Там программа все считает правильно. При переносе в БП я переношу не тупо документы из УТ, а с учетом их движений по регистру «Партии товаров на складах» откуда и беру значения документов оприходования и себестоимости. И операторам на этом заморачиваться не только не нужно (у них другие задачи), но и вредно даже: такого накосячат, что мама родная, только дай им волю.

    В ФИФО все четко, когда четко указан товар, а когда вместо него и приходуется и продается то, что вы назвали «ПредопределнныйВашТовар» вся четкость пропадает. И все приходится указывать конкретно. Попробуйте это самостоятельно осмыслить. Или посмотреть в УТ как там проводится возврат от покупателя, введенный на основании реализации. И сопоставить с тем, о чем я писал в предыдущем посте.

    Reply
  11. Rustig

    (10)

    В УТ ничего допиливать не надо. Там программа все считает правильно. При переносе в БП я переношу не тупо документы из УТ, а с учетом их движений по регистру «Партии товаров на складах» откуда и беру значения документов оприходования и себестоимости. И операторам на этом заморачиваться не только не нужно (у них другие задачи), но и вредно даже: такого накосячат, что мама родная, только дай им волю.

    ясно, за пояснение спасибо, сразу и непонятно

    В ФИФО все четко, когда четко указан товар, а когда вместо него и приходуется и продается то, что вы назвали «ПредопределнныйВашТовар» вся четкость пропадает. И все приходится указывать конкретно. Попробуйте это самостоятельно осмыслить. Или посмотреть в УТ как там проводится возврат от покупателя, введенный на основании реализации. И сопоставить с тем, о чем я писал в предыдущем посте.

    Приходуется и продается товар в УТ, а в не в БП! В УТ ФИФО корректно считается — ваши слова. Остается только перенести все в БП с привязкой к документам партиям. Мне не нравится что вы сворачиваете строки в документах БП по документам партиям — отсюда проблемы с ФИФО. В проводках БП надо не рассчитывать стоимость списания, а брать из табличной части документа, которая заполняется из УТ в момент обмена.

    Reply
  12. lvictor58

    (11) Rustig,

    «В проводках БП надо не рассчитывать стоимость списания, а брать из табличной части документа, которая заполняется из УТ в момент обмена» так я про то же самое говорю. Но: в возврате от покупателя отсутствовал реквизит «Документ оприходования» и при проведении программа расчетным путем его определяла. Когда я его добавил и начал заполнчть данными из УТ — все стало работать нормально. Аналогичная ситуация и с разукомплектацией. Кажется, что мы с Вами воду в ступе толочь начинаем.

    Расскажите лучше, как вы цитаты в текст своего ответа вствляете, чтобы они выделялись?

    Reply
  13. StAsya_1C

    Подход неплох, тоже в одном проекте думали над ним, но потом отказались по следующим причинам:

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

    — себестоимость из УТ штука интересная, особенно, например для УТ 10.3. Вся себестоимость либо с НДС, либо вся без НДС. И если есть несколько юр лиц, часть на ОСН, часть на УСН — то не забудьте при обмене добавить/убрать НДС тем, кому он нужен/не нужен, и с учетом ставок 10 или 18 (в принципе, на этапе выгрузки УТ кривовато, но можно определить, какой был НДС и был ли он).

    Остановились на варианте все же переносить номенклатуру, но не тянуть документы партии и себестоимость. И там, где можно, в БП поставить учет МПЗ по-средней.

    Reply
  14. Rustig

    (12)

    Расскажите лучше, как вы цитаты в текст своего ответа вствляете, чтобы они выделялись?

    когда оформляете сообщение, над окном ввода текста должны присутствовать кнопки — среди них есть «кавычки» — оформление текста в виде цитаты — между тегами вставляйте скопированный текст, или сначала выделите его в чужом сообщении, а затем жмите оформить в виде цитаты, веб-страница сама подставит в ваше сообщение цитату

    Кажется, что мы с Вами воду в ступе толочь начинаем.

    Нет, не начали, это только вам кажется — вы эту проблему несколько лет «сопровождаете», поэтому в статье «проглотили» часть мысли… я восполнил некоторые пробелы.

    и все-таки осталось не ясно:

    1) вы сворачиваете ТЧ в документах БП? чем аргументируете?

    2) у вас до сих пор проблемы с тем, что

    на 100 000 рублей с себестоимостью на 70 000 рублей. и общим количеством N штук, килограммов, квадратных метров. Возвращают какую-то фмговину стоимостью 20 рублей и с/с 10. И если этого не указать, то программа тупо подставит первую по дате прихода партию и списанную по ней с/с разделит на списанное по ней же кол-во. И вместе с «копеечным» товарам вернет нам 1000 рублей себестоимости. Или наоборот с «дорогим» вернет копейки.

    Reply
  15. lvictor58

    (14)

    1) вы сворачиваете ТЧ в документах БП? чем аргументируете?

    Товар везде один и тот же (для исключения каких-либо недоразумений он подставляется в параметрах выгрузки поиском по коду) и сворачиваем табличную часть в разрезе документов поставки. Какие тут еще аргументы нужны?

    по второму тегу: тут тоже проблем никаких нет. Надо просто обязательно указывать документ поставки и себестоимость (определяются, как я уже говорил, при выгрузке данных в БП). Указанные суммы по указанным поставкам списываются при проведении документов с 41 счета без каких-либо пересчетов и подмены указанных значений. А описанная мной проблема, на которую Вы и ссылались возникала в типовом (от 1С) возврате от покупателя с отсутствующем в ТЧ реквизите «Документ оприходывания».

    Reply

Leave a Comment

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