Тюнинг Бух 7.7: Установка цен номенклатуры по документам




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

54 Comments

  1. natali_sch

    😳 Спасибо большое… Не знаю как благодарить… Если бы можно было — 10 плюсов поставила бы!

    Reply
  2. natali_sch

    Посмотрела… Такая фигня: документы не анализаруются (приход это или реализация) — цены все тупо устанавливаются в выбранный тип цены. А надо, чтобы из приходов заносились цены закупочные, а из продаж — цены реализации. 😥 так можно?

    Reply
  3. Maks_Alexey

    (2) можно 😉 если нужно, могу переделать

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

    а я вообще сделал может и не очень красиво, но проще…

    я вставил в модули проведения документов заполнение справочника цен

    при проведении поступления заполняется справочник цен «закупочная» на дату документа, причем если документ снять с проведения — заполнение аннулируется 😉 так в некоторых смыслах удобнее

    хотя если потом обновлять то ведь данный кусок нужно будет переносить ))) так что поэтому и не очень красиво вышло )))

    если нужна помощь — пишите, решим все проблемы

    Reply
  4. Арчибальд

    (2) Нет, не тупо. При приходе ТипЦен берется из документа. А при реализации такого реквизита нет, поэтому проставляется выбранный на форме. Кстати, если на форме тип не выбирать, обрабатывается только поступление.

    Reply
  5. Ish_2

    Всё подарочки даришь ? Ну-ну.

    Reply
  6. Шёпот теней

    … истинно женское отношение к подаркам … ВОТ …

    … любимая женская месть — перевЁртышь …

    … наслаждайся, Арчибальд …

    … ВОТухВОТ …

    Reply
  7. Арчибальд

    (5) Их есть у меня…

    (6) 😳

    Reply
  8. natali_sch

    (4) Т. е. документ реализация в вашей обработке совсем не рассматривается как вариант для заполнения цен? При реализации в документе «Отгрузка товаров, продукции» тип цен присутствует, если значение константы «Использовать типы цен номенклатуры» — «Да» (у меня как раз этот случай).

    Наверное надо так: заполнять цены реализации по проставленным в текущем документе, и по типу, указанному в документе. Может быть в обработке сделать выбор конкретного документа, из которого брать цены?

    …я ведь не прграммист — не судите строго…

    Вообще-то в Бухгалтерии 7.7 есть какая-то непонятная обработка «Установка цен» в справочнике «Номенклатура». Но вот как она работает, я — хоть убей — не могу понять. То ли я туплю, то ли лыжи не едут… Может к ней как привязаться?

    Reply
  9. natali_sch

    (6) Вы немного неадекватно ситуацию воспринимаете… Никакая это не месть, просто конструктивный разговор по существу проблемы…

    Reply
  10. natali_sch

    (3) Спасибо за предложение помощи. Судя по всему, в наше время не все на такое способны… Особенно безвозмездно — еще и поёрничают… 🙁

    Reply
  11. Арчибальд

    (8) Сейчас выложил второй вариант — где при реализации ТицЦен тоже берется из документа… 💡

    А где эта обработка? Я что-то не видел такой. Мы не торгуем 😐

    А, нашел. Сейчас гляну.

    Reply
  12. Арчибальд

    (8) Нашел эту обработку — она делает отбор по видам/группам номенклатуры и типу цен. Сами цены должны проставляться вручную. Вряд ли это то, что требуется…

    Reply
  13. Ish_2

    (10)

    «Судя по всему, в наше время не все на такое способны… Особенно безвозмездно — еще и поёрничают… »

    Ага. Ерничаем.

    Способность к безвозмездности кроме зависти и неприязни ничего не вызывет. Это нормально.

    Reply
  14. tango

    ну, любит чел программировать, чего уж тут

    Reply
  15. Арчибальд

    (13) Не нервничай. Балет создан для того, чтобы было чем занять глаза при прослушивании музыки. Микроотчетики появляются, когда я о чем-то думаю, и надо руки занять. Не грызть же ногти 😳

    Reply
  16. Ish_2

    (15) Я тебя вижу насквозь.

    Так вот : микроотчетики пишутся ,чтобы не думать ни о чём грустном.

    Reply
  17. natali_sch

    Продолжение разговора…

    Очередное тестирование показало, что в обработке при выборе периода (например, месяц) и типа цены «Закупочная» в карточку «Номенклатуры» заносится реквизит (или как это у вас там называется) «Закупочная цена», а значение ее берется из последнего документа за этот период, где идет ссылка на данную номенклатурную позицию.

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

    Такая же картина, если выбирается в обработке тип цены «Отпускная цена» — значением ее становится любая цена из самого последнего документа по этой позиции номенклатуры (по фиг, что это приход или продажа).

    Не учтено то, что за выбранный период по данной номенклатурной позиции может быть несколько приходов (с разными ценами поступления) и несколько реализаций тоже по разным ценам… И из каждого прихода на каждую дату поступления товара должна быть занесена в справочник цена поступления, а из каждой реализации на каждую дату — цена реализации (если конечно они отличаются от предыдущего значения того же типа цены). Причем ЦЕНА ПОСТУПЛЕНИЯ и ЦЕНА РЕАЛИЗАЦИИ — это разные типы цен для одной и той же номенклатурной позиции.

    А у тебя по ходу все в одну пишутся — в ту, что выбрана в обработке, или, если ничего не выбрано — в цену поступления.

    Фууууух… Тяжко объясняться бухам с программерами… На разных языках разговариваем видно…

    Вот такая задачка вобщем… 😳

    Reply
  18. Ish_2

    (17) Наталья, долбежку поддерживаю. Так держать !

    Reply
  19. natali_sch

    … И еще… а создать в номенклатуре новый тип цен, если там, например, не занесены типы цен на момент заполнения нельзя? Из поступления — закупочную, а из реализации -отпускную… А то ругается: Не заполнен тип цен в Отгрузка товаров, продукции 911/252 (02.11.09). Но в самом документе тип цен выбран, видимо в справочнике номенклатуры — нет… 🙂

    Reply
  20. natali_sch

    (18) Да не долбежка это… 😐 Тебе надо угол зрения сменить…

    Просто есть разный тип людей — «одни сидят на трубах, а другим нужны деньги» (- вспомнишь откуда цитата — плюсану 😉 ).

    Арчибальд любит программировать, а я люблю бухгалтерией заниматься, причем продуктивно, а не биться головой об стену, выполняя тупую нудную работу. Но при этом я же не брошу (из-за необходимости заполнять эти долбаные справочники вручную) сведение баланса на середине… А если есть человек, который решил помочь, и я чувствую, что ему интересно добить идею (ведь иначе он бы не предложил), так я ему даю все карты в руки…

    Поразмысли над следующим:

    … Много ли бухгалтеров посещает этот сайт и в состоянии самостоятельно подключить даже элементарную .ERT-шную обработку в программу?

    (может когда ответишь на этот вопрос, сможешь и поступки Арчибальда понять?)

    Reply
  21. Ish_2

    (20) В гугле нашел название фильма. Не смотрел, слава Богу.

    Всё остальное в Вашем ответе радует !

    Reply
  22. Abadonna

    (20)

    … Много ли бухгалтеров посещает этот сайт и в состоянии самостоятельно подключить даже элементарную .ERT-шную обработку в программу?

    Есть тут одна мадам, чистый бухгалтер, но она еще и программит сама для себя в 8.1 😉

    Reply
  23. Арчибальд

    (17)(19) Претензии приняты. Мой косяк — сам забыл вытащить/посмотреть ТипЦен из расходной накладной, и сам ругаюсь. Уже исправился — второй файл правильный теперь.

    Итак, если тип цен в документе не указан, документ пропускается. Если у номенклатурной позиции цена с типом цен, указанным в документе, отсутствует, то в справочнике цен создается новый элемент с нужным типом. Цена — периодический реквизит — пишется столько раз, сколько было документов с этим типом цен с датой документа. Естественно, если было несколько документов с одной датой, актуальным будет только последний по времени.

    Reply
  24. Арчибальд

    (18)(20) Предвзятое отношение Ish_2 к моим собеседницам вполне предсказуемо, хотя и не имеет четкого объяснения 😀

    Reply
  25. natali_sch
    Цена — периодический реквизит — пишется столько раз, сколько было документов с этим типом цен с датой документа

    😥

    Блин! Ну не пишется она столько раз сколько было документов! Либо я чего-то не понимаю…

    Пишется одна цена на каждую номенклатурную позицию — по последнему за период документу и с последней датой документа: если это был приход, то только закупочная, если это была реализация, то только отпускная. Или надо такую обработку запускать за каждый день?

    …Ну потому, что не получается за месяц много цен с разными типами в истории…

    Предчувствую реакцию — «ВСЮ ПЛЕШЬ ПРОЕЛА — ЗАЧЕМ ТОЛЬКО СВЯЗАЛСЯ» … если надоело — пойму… 🙁

    Reply
  26. Ish_2

    (25)

    Да всё нормально, Наталья.

    Другая бы плюнула давно и затихла.

    Неудобно ведь — конь-то дарёный… А мне такой подход нравится — трезвый и деловой.

    Reply
  27. ZOMI

    Посмотрел я чужому «даренному коню » …. а конь то — того )))

    Поправленный файл прикрепляю — так взлетит )))

    Свои вставки закомментил

    Но замечание такое — если по товару несколько приходов за день- то и останется в истории одна цена !!! Потому что не документом установлена !!!!

    Если нужно вести истории изменений в день — то верно в (3)

    по расходу таже картина // Но в (25) справедливые возмущения — первоначальная обработка и 2-я версия неправильные ….

    Reply
  28. Арчибальд

    (25) Позор на мою седую бороду 🙁

    Правильно в (27) ❗

    Поменял…

    Reply
  29. Maks_Alexey

    (4) Запамятовал 🙂 у меня немного переделанная бухгалтерия, для жены писал, добавил тип цен в реализации, перемещения (потому как в перемещении еще и наценка производится)

    и еще несколько документов, потому и не так написал 🙂 а вообще бухгалтеру трудно без программиста жить… хоть на меня любимая частенько ругается, но ведь всё равно без перекройки стандартной конфигурации уже не может, одни только автоматические заполнения облегчают работу в разы…

    Так что мы Вас, дорогие Бухгалтера, любим и ценим 🙂

    Reply
  30. Maks_Alexey

    (8) точно, не добавлял я её ))) просто используются несколько типов цен, а не просто закупочные и отпускные )))

    Reply
  31. Maks_Alexey

    (8) а по данной обработке, жене ужасно не понравилось то, что это не документ )))) поэтому вставил в конфигурацию документ — установка цен

    он создает движения по заполнению справочника, а при отмене проведения записи исчезают ))) вроде пользуются с удовольствием

    Reply
  32. Арчибальд

    (31) Этот подход правилен. В документе перед проведением можно еще и подкорректировать при желании табличную часть + привязать периодическое значение к строке документа для последующих разборок.

    Заодно можно еще и запретить ручную установку цен, либо фиксировать это в логе.

    Reply
  33. Арчибальд

    (25) Все нормально! Взялся за гуж — полезай в кузов 😉

    Reply
  34. Maks_Alexey

    (32) ну вторым шагом после ввода доп. документов было введение автора в документы 🙂 чтобы знать кому по шапке давать если что 😀 причем не влезая в журнал регистрации, ибо не всегда удобно ))))

    Reply
  35. Арчибальд

    (34) Хотелось бы не только наказывать, кого надо, но и исправлять последствия. Тут уж журналить надо как-то

    Reply
  36. natali_sch

    (33) 🙂 УРА! Заработало! Пока больше косяков не нашла… Поживем увидим 😉

    Ой, мальчишки, какие же вы все-таки молодцы!!!! :{}

    Бухгалтер счастлив — программисты удовлетворены…

    Всем участвующим огромнейшее спасибо! 😀 (26)…даже скептикам…

    Reply
  37. natali_sch

    (31) Да, так было бы удобнее, но на данный момент меня и эта обработка очень порадовала — столько тупой работы ушло! Ведь, в конце концов, для того и созданы компьютеры и программисты, чтобы освобождать нас от рутины. А что касается усовершенствований, так это бесконечная песня… 🙂 Сколько волка не корми… 😉

    Reply
  38. natali_sch

    Всем: если какие вопросы по бухгалтерии возникнут ( я сам предмет имею ввиду) — обращайтесь — с удовольствием помогу, чем смогу… Долг платежом красен ❗

    Reply
  39. Ish_2

    (38) Как принимавший посильное участие в обсуждении и настройке продукта с удовольствием буду считать Вас задолжавшей.

    А что касается Арчибальда , то : «Его пример другим наука».

    Reply
  40. Abadonna

    (39)

    А что касается Арчибальда , то : «Его пример другим наука».

    Что касается Арчибальда, то он яркое подтверждение гениального тезиса: «Ни одно доброе дело не останется базнаказанным!» 😀

    Reply
  41. natali_sch

    (39) (40) Что касается Арчибальда, то чисто по человеческим качествам вам до него далеко… (без обид) 🙂 Злые вы…

    Reply
  42. Ish_2

    (41) Не возражаю.

    Reply
  43. Арчибальд

    (41) Не, они не злые. Они оба задушевные, и даже где-то сентиментальные, но по молодости лет скрывают это 😎

    Reply
  44. Арчибальд

    (38) Хочу профессиональный комментарий к http://infostart.ru/public/61847/

    🙂

    Reply
  45. natali_sch

    🙁 К сожалению, я не сильный профессионал в управленческом учете… как, впрочем и любой бухгалтер. И производство у меня очень специфичное и, пожалуй самое простое: производство бетона (простое потому, что без незавершенки). И работаю бухом на производстве только год как… Но может поконкретнее вопрос можно сформулировать… Вообще-то у нас начинающее малое предприятие, ни вспомогательного, ни обслуживающего производств нет пока — не доросли… 🙂 А вот в торговле опыт достаточный…

    Reply
  46. Арчибальд

    (45) Ага, сначала пальцы гнем, потом на попятный 😎

    А вопрос такой: имеет ли бухгалтерское содержание (то есть: какая осуществляется хозяйственная операция) при «подгонке» себестоимости. Или иначе: соответствует ли математическая модель (решаемая система уравнений) бухгалтерской модели.

    Reply
  47. natali_sch

    (46) Как я поняла, задача прежде всего призвана обеспечить оперативность оценки реальной себестоимости, максимально приближенной к полной. Но на основании бухгалтерского учета вряд ли получится в режиме реального времени расчитывать себестоимость производства, пусть даже и вспомогательного. Общеизвестен факт: бухгалтерский учет — это посмертный учет. Проводки делаются на основании первичных документов, которые порой приходят зачастую с большим опозданием. Кроме того, в расчете себестоимости участвует и зарплата персонала обслуживающих производств, а ее (вместе с налогами) тоже расчитывают только по окончании месяца, а не каждый день. А смысл расчета себестоимости состоит в закрытии счетов, на которых предварительно полностью собраны все затраты, относящиеся к данному конкретному виду вспомогательного производства. Кроме того, есть полная и сокращенная себестоимость, и каждое предприятие само решает, как им удобнее ее учитывать.

    А по поводу математической модели — это перебор… Нелегко найти бухгалтера, который оперирует еще и такими понятиями… Да и я, хоть и училась когда-то на физмате, но уже ужасно далека от всех этих систем уравнений и т. п. … не обессудьте. 🙁

    P.S. Да… 😀 и пальцы мы еще не гнули… если че…

    Reply
  48. KSV

    Очень понравилось, спасибо! А вы можете сделать установку цен по выбору? Например, по клиентам? Чтоб в диалоге выбиралась отгрузка по выборочным контрагентам и по этим документам устанавливать выбираемую в диалоге цену?

    Reply
  49. Арчибальд

    (48) Чуть попозже посмотрю. Проблем особых не вижу.

    Reply
  50. KSV

    Не ожидала, что вы так быстро мне ответите. Спасибо, буду теперь ждать.

    Reply
  51. Арчибальд

    (50) Получай!

    Reply
  52. KSV

    Как мне это было нужно!!! Жалко, что плюсики можно ставить только один раз. Теперь у меня самый красивый справочник цен в мире) Очень сильно вам благодарна.

    Reply
  53. Abadonna

    Арчи, столько лет прожил, а одну истину не уяснил:

    Ни одно доброе дело не останется безнаказанным!
    Reply
  54. KSV

    , но есть и приятные исключения. «Хорошими делами прославиться нельзя!» — старуха Шапокляк была неправа!

    Reply

Leave a Comment

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