УТ 11.1 Простые примеры: разрешить продажу по нулевой цене или 100%-ная скидка




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

43 Comments

  1. Special One

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

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

    Reply
  2. Yury1001

    (1) Special One, там же, чуть выше

    блок // ЗАКАЗ КЛИЕНТА

    строка МассивПроверок.Добавить(«КонтрольЗаполненияЦенСУчетомОтменнных»);

    Reply
  3. KSy

    Зачем Вы учите начинающих такому? Одно дело сделать подсистему, где пользователь сам опционально выбирает тип документа и отключить/включить возможность проведения документа с «нулевой» ценой. А тут так и хочется сказать: «опять костыли»…

    Reply
  4. Yury1001

    (3) KSy, цель серии публикаций показать простые примеры для сложной конфигурации.

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

    Обычно, подобные решения, помогают небольшим организациям сберечь время и деньги — всё равно на колхозят.

    P.S. А вот 1С сейчас посмотрит чего людям не хватает и сделает правильную подсистему, что бы никто в ней больше разобраться не мог)

    Reply
  5. KSy

    (4) Эту статью в другой раздел переместить что ли… Подобные методы деструктивны. Пусть «экономисты» платят спецам, а то наворотят подобных конструкций… Потом приходит спец и видит «такое». Вот так и плодятся истории об одноэсниках-индусах и какокодерах.

    Reply
  6. Yury1001

    (5) KSy,

    О_о

    так, а в какой же раздел ещё, если: Программирование — Практика программирования?

    Reply
  7. KSy

    (6) Это не программинг :). В life, думаю. И озаглавить именно что «Начинающим как НЕ надо делать. «Экономистам» как временно решить свои проблемы (пока ищут спеца для сотрудничества).» Так точнее будет, ИМХО 🙂

    Reply
  8. Yury1001

    (7) KSy, лайк)

    Reply
  9. more

    Считаю, что данные советы не корректны. Вместо того, что бы учить пользователя не продавать товар по 0 цене (Налоговый кодекс заставит покупателей платить налог на подарок, а поставщика налог на упущенную прибыл). т.е. от подарка появляется головники у бухгалтеров обеих компаний (я не говорю про ип Как любят шутить «Без образования» юр лица).

    Нужно убеждать клиентов, что бы они оформляли такие подарки по типу 3 по цене 2 и т.п. иными словами — выкручивайтесь ЗАКОННЫМИ решениями.

    1С всегда делает программные продуты в соответствии с законом РФ. и поэтому выкидывает подобное безобразие из своих конфигураций, а вы это безобразие снова вкидываете.

    ОЧЕНЬ ПЛОХОЙ СОВЕТ КАК С ПРОГРАММНОЙ ТОЧКИ ЗРЕНИЯ, ТАК И С НАЛОГОВОЙ.

    Reply
  10. Yury1001

    (9) more, Хорошо.

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

    Ситуация вторая: компания Пепси, Майский чай, Вико и т.д. проводят акцию, 5+1, при этом «один» нужно отдать бесплатно и отчитаться и предоставить номера накладных. Не выполнишь условия – не получишь промо-компенсацию.

    Ситуация третья: кафе, недовольный клиент, администратор соглашается с претензией и предлагает вычеркнуть блюдо из счёта, и как же по вашему быть?

    И таких ситуаций много.

    Без обид, но есть мнение, и не только моё, что рассуждаете вы как преподаватель учебного центра и к практике не имеете никакого отношения.

    P.S. Выкладываю идеи, которые применял неоднократно, кому не требуется — проходим мимо).

    Reply
  11. Yury1001

    (9) more, И, кстати, с точки зрения налоговой, были случаи полного оформления документов на бесплатные товары в массовом порядке (ТОРГ-12, Счёт-фактура, доп.соглашение) и никаких проблем не замечено!

    Reply
  12. Sykoku

    Есть ситуации(9) more,

    Бесплатный кулек заставьте клиента оприходовать этими методами. Потом, если сможете, попытаетесь рассказать, куда он Вас отправил. И учтите ситуацию, когда это не 1 кулек, а сразу штук 50-100 и Вы — дистрибьютор их отдаете дилеру. Чтобы он у себя в рознице их раздавал.

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

    Reply
  13. belochkaNN

    Еще пример, который и мы тоже решаем продажей по нулевой цене: «Покупаем 100 кг грибов по 100 р. за кг, через неделю грибы усыхают, их становится 98 кг., и реализуем мы только 98 кг, а на складе пусто. Директор говорит — раз пусто, значит 2 кг грибов продали по 0 руб., и хочет эти 2 кг видеть в отчете по продажам. И они должны участвовать в расчете себестоимости.» Как иначе выйти из такой ситуации, кроме продажи по 0 руб?

    Reply
  14. super_set

    Спасибо работает! Но если в поступлении есть расхождения и ставится галка в УТ 11 есть расхождения то документ не проводится. Ругается что нет цены на вкладке товары по факту

    Как эту проверку цен отключить на этой вкладке в документе поступление ту?

    (если галку не ставить то не ругается что цен нет)

    Reply
  15. Yury1001

    (14) super_set, в этом случае нужно исключить реквизиты Цена и Сумма из списка проверяемых реквизитов.

    При этом нужно учитывать, что тем самым мы нарушаем логику работу программы и в дальнейшем следует внимательно относится к результатам проведения документов и регламентным операциям!

    Reply
  16. super_set

    (15) Спасибо вам! А как это может и на что это может в дальнейшем повлиять? И есть ли альтернатива? Нам нулевые цены нужны для оприходования рекламной продукции и выдачи ее конечникам и отчетности перед поставщиком. Он присылает накладные нулевые. Делать 1 копейку не хотим т.к. это все равно через год работы начнет вылазить, учитывая количество рекламы и сувенирки.

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

    Reply
  17. super_set

    (15) Еще знаете какая проблема не проводится документ поступление ТУ с расхождениями без цен

    А по кнопке заполнить не заполняются расхождения — и все из за того что нет цен

    Если цену поставить на вкладке товары по данным постаущика — расхождения заполняются

    Без цен не заполняются

    Хотел вручную отредактировать, но почему то на вкладке РАСХОЖДЕНИЯ невозможно редактировать ничего ни количество ни цену ни сумму.

    1) Странно что расхождения заполняются по цене а не по количеству, может это можно исправить?

    2) Если нельзя исправить, может можно настроить возможность ручного редактирования на вкладке РАСХОЖДЕНИЯ?

    Reply
  18. Yury1001

    (17) super_set, с таким количеством вопросов лучше обратиться к специалисту очно.

    Reply
  19. spectre1978

    (10) эта задача решается скидками. Если вы продаете 1 бутылку и 1 отдаете бесплатно в качестве бонуса, то это то же самое что вы продаете 2 бутылки с 50% скидкой на каждую. При этом вы получаете корректные документы, с которыми никому не надо ломать голову как их провести.

    Reply
  20. spectre1978

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

    Ну вообще-то это классический возврат. Вернули блюдо на кухню по полной стоимости специальным документом или сделали сторно счета и ввели новый без данной позиции, или на худой конец тупо исправили счет задним числом, если это допустимо. А с клиента взяли меньше денег или вернули на карту/из кассы если денежная транзакция уже была. При чем тут нулевая продажа?

    Reply
  21. super_set

    (19) spectre1978, Это если 2 позиции одинаковых в документе. А если в одном документе краски платные 32 штуки, оксиды 12 штук. и бесплатные палитры 2 штуки. Какие тут скидки?

    Reply
  22. super_set

    (18) А заочно возможно на платной основе?

    Reply
  23. spectre1978

    (21) super_set, а компу-то какая разница, на две позиции цену пересчитывать или на двадцать?

    Пусть нормальная цена палитр 5 р, красок 10 р, оксидов 11 р.

    Краски 32х10 = 320

    Оксиды 12х11 = 121

    Палитры 2х5 = 10

    Всего выходит 451 р, но палитры у нас — бесплатные, поэтому мы должны взять с клиента 441 р.

    Соответственно мы 441 делим в пропорции на все позиции

    Т.е. сумма по краскам должна получиться 320*441/451=312.90,

    по оксидам 121*441/451=118.32,

    по палитрам 10*441/451=9.78.

    тут могут быть проблемы с округлением, ну как туда-сюда копейку кинуть, объяснять, думаю, не надо.

    Как цену посчитать из количества и суммы — тоже.

    Все, получаем нормальную накладную, которая нормально проведется и на которую ни у кого не возникнет претензий.

    Reply
  24. spectre1978

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

    Reply
  25. super_set

    (24) spectre1978, Ну это совсем не вариант. Вы взяли слишком простой вариант с 1 палитрой. У нас в накладной может быть 15-30 позиций для одного клиента и в добавок идет 2-5 позиций бесплатные.

    Плюс вы взяли 10 рублей за бесплатные палитры которые у нас бесплатные ВСЕГДА. У них нет нормальной цены.

    Но в то же время есть позиции у которых есть нормальная цена, например 5 лак в подарок при покупке 4 лаков. И вот это все может быть в 1 накладной.

    Вот пример:

    Краска 10 штук по 200 руб = 2000

    Оксиды 5 штук по 150 рук = 750 руб

    Лак 4 штуки по 800 руб = 3200 руб

    Лак бонусный 1 штука = 0 руб

    Мусс 2 штуки по 700 руб = 1400 руб

    Палитра 1 штука = 0 руб

    Каталог Бренда А 1 штука = 0 руб

    Каталог Бренда Б 1 штука = 0 руб

    Буклет 15 штук = 0 руб

    Ну и как тут разбить цену?

    Притом что товаров я привел с ценой 4 штуки всего, а реально их будет 15-30 штук.

    Слишком много неизвестных получается по нулевым ценам (целых 5 штук а не 1 как в вашем примере), а это уже в вашу формулу не уложить.

    Поэтому должна быть возможность ЕДИНСТВЕННАЯ — это отпускать по нулевым ценам.

    Другого не дано.

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

    Reply
  26. spectre1978

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

    Reply
  27. super_set

    (26) spectre1978, к сожалению или счастью бывает. Товар приходуем по накладным. В накладных цены нет и суммы нет. Поставщик кстати очень большой не шарага. Была бы хоть какая то цена мы бы конечно и списывали по себестоимости. А цены нет. И выдумывать ее не хотелось бы раз ее нет в накладных.

    Reply
  28. shard

    (10) Есть такое в УТ, «бонусные программы лояльности» называется. Но, к сожалению, реализованы только в чеке ККМ

    Reply
  29. Jimkaaa

    Спасибо. Мне нужно было понять как сделать поступление по 0 цене. Нашёл по аналогии с инструкцией.

    Reply
  30. egurskiy

    Данная схема весьма приемлема, такое впечатление что все кто хает продажу с 0 ценой не совсем знакомы например с конфигурацией БП и КА. Открою для них секрет, в БП и КА, нет проблем с продажей по 0 цене, А для примера где это использовать расскажу вам второй секрет, при продаже на экспорт, Белорусы требуют указывать «тару» в торг-12 (катушки под провод) с 0 ценой, но не должно быть информации что это тара (как это делает УТ при использовании функционала многооборотная тара), в таких случаях просто необходима 0 цена в продаже.

    Reply
  31. dron-s
    Открою для них секрет, в БП и КА, нет проблем с продажей по 0 цене

    и как оно в КА 2.03 решается, если даже указать скидку скидку 100%, программа пересчитывает и тут же выходит сообщение Не корректно настроены скидки (наценки). После расчета скидок (наценок) сумма в строке 1 равна нулю.

    и как с этим быть? подскажите?

    Reply
  32. Elected

    Спасибо. Очень помог. Долго и нудно искал примеры, как закупить товар по нулевой цене и только твой помог!!!

    Reply
  33. testik_vzv

    Спасибо.

    Аналогично понадобилось включить в УТ11 (старый релиз) продажу по нулевой цене в чеках ккм. Ничего не сломалось, себестоимость рассчитывается. Был удивлен, нафига было запрещено… Подумал, может я чего-то упускаю, но все ок.

    (30)

    Те, кто хает продажу по 0 цене, как раз и есть индусы-1с-ники. Ты им: «мне надо, чтобы было так». Он тебе: «А зачем тебе это? Сделай по-другому.»

    Reply
  34. user616330_Milve

    Прошу помочь, необходимо отключить контроль цен (нулевой цены) в форме заказ клиента и документе реализации. Все сделал, как написано выше. В модуле ПродажиСервер отключил модули в реализации и заказах. Но по-прежнему проверяет. Что я сделал не так?

    Reply
  35. delat

    Спасибо автору (не первый раз помогает), ERP 2.2 ок. Сэкономил массу времени.

    Reply
  36. tarassov

    В рознице 2.2 аналогично или нет? Кто-нибудь сталкивался ?

    Reply
  37. digorec88

    А для документа ЧекККМ где стоит контроль заполнения?

    Reply
  38. suvir

    (37)

    В конфигураторе.

    см. (15). Yury1001

    Reply
  39. Axe

    Давайте давайте, ломайте конфу )))) потом если, что обращайтесь. Перенос данных в новую базу 10к. Сделаю с удовольствием.

    А если серьёзно, то 0 цену всё-таки неправильно делать. Первое правило бухгалтерии: деньги не берутся ниоткуда и не уходят в никуда. Сами разработчики рекомендуют использовать 1 копейку.

    0 цена не вписывается ни в одну логику документооборота.

    10000 единиц товара по 1 копейке, это 100 рублей.

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

    Reply
  40. hanio

    не соглашусь с предыдущим постом потому что считаю скидочную модель вполне адекватной, ты сам же показал что даже при 1 копейке будет некая сумма а с нее сразу считай НДС и вот тут ты что налоговой будешь предоставлять? правильно входящую счет-фактуру допустим от организации работающей с НДС и тогда сразу возникает вопрос почему расходится сумма НДС и им пофиг что это бонус, акция, подарок. И еще сам себя же дополню — надо договорные обязательства по таким иметь взаимодействиям с клиентом и вот там указать для четкого понимания налоговой что да товар акционный и поставляется с 99,9% скидкой максимально за 1 копейку.

    Reply
  41. hanio

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

    Reply
  42. hanio

    кстати расширение может кто-то обходящие подобные проверки никто не встречал хотя бы для себя и упёртым клиентам )

    Reply
  43. Anthon

    Вообще бывают ситуации, когда это необходимо, например, при переносе из другой версии 1С или вообще другой учетной системы, где этот дебилизм отсутствует. На период адаптации данных цифры должны идти копейка в копейку, чтобы сверять результаты и крыжить эти чеки и прочие вещи. ВРЕМЕННО. Потом можно и аккуратно перевести огранизацию на 99.9999% скидки. Но ставить такие ограничения, что потом даже расширения не могут это выковырять, это просто свинство со стороны 1С. Раз уж написали километры пустышного кода, могли бы хоть еще одну функциональную опцию внести. Кстати, сейчас вышеприведенное решение не работает для чеков ККМ, так как они вынесли эту проверку на платформенный уровень. Приходится заменять процедуру ПровестиДокументы в расширении, хорошо, что она небольшая.

    Reply

Leave a Comment

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