Установка цен в 1С:Управление торговлей 11. Произвольный запрос к данным ИБ




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

48 Comments

  1. cleaner_it

    (0) Маловато будет)

    Reply
  2. karpik666

    (1) cleaner_it, Какие есть предложения по расширению статьи?=)

    Reply
  3. grfru

    Маловато. Было бы отлично с подробным разбором и примером.

    Reply
  4. karpik666

    (3) grfru, хорошо, как будет возможность, добавлю в статью разбор типового запроса цены и на ее основе создам свой.

    Reply
  5. karpik666

    Так как к статье нельзя крепить файлы, то вот готовая схема СКД цены из статьи

    Reply
  6. aramius

    Подскажите, какой Запрос сделать, чтобы из Цены Дилер, получить расчетную цену «Дилер без НДС»,

    Просто делить на 1.18 нельзя, т.к. у всех товаров НДС разный.

    Reply
  7. karpik666

    (6) aramius, на вскидку можно из номенклатуры взять саму ставку, а затем в запросе через Выбор прописывать процент на который делится. Например

    ЦенаДилера / Выбор Когда Номенклатура.СтавкаНДС = Значение(Перечисление.СтавкиНДС.НДС18) Тогда 1.18
    Когда Номенклатура.СтавкаНДС = Значение(Перечисление.СтавкиНДС.НДС10) Тогда 1.1
    Иначе 1 Конец
    Reply
  8. vit1c

    Какой будет запрос для определенного вида цены?

    Reply
  9. vit1c

    Что -то типа?:

    ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Характеристика,
    ЦеныНоменклатурыСрезПоследних.Цена,
    ЦеныНоменклатурыСрезПоследних.Валюта,
    ЦеныНоменклатурыСрезПоследних.Упаковка,
    1 КАК Коэффициент
    ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних

    Показать

    Reply
  10. karpik666

    (9) vit1c, ее не нужно получать, при расчетах вид цены берется из документа установки цен, и сам автоматически подставляется в ее расчет.

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

    Reply
  11. azovgsm

    Подскажите пожалуйста почему в при выборе типового запроса «Цены поступления» в некоторых случаях вставляется Цена без НДС а в некоторых Цена с НДС. Заранее благодарен!

    Reply
  12. karpik666

    (11) azovgsm, может у вас в самой номенклатуре указано, что она «без ндс», поэтому и цена без нее.

    Reply
  13. azovgsm

    Спасибо за ответ. Действительно, так и есть. В справочнике номенклатура стоит Цена Без НДС, но если ставить НДС к примеру 10%, то ничего не изменяется, в документ установка цен все равно попадает цена — НДС.

    Reply
  14. karpik666

    (13) azovgsm, а посмотрите еще в документе поступления, там цена с ндс или без указан

    Reply
  15. Кошкин Василий

    УТ11.1

    Вопрос такой:

    Можно ли сделать так, чтобы вид цен РекомендуемаяЦена заполнялся по формуле

    РекомендуемаяЦена = цена поставщика Завод , (Завод — это партнер(поставщик) из справочника)

    не на основании Заказа поставщику или Поступления , а просто в документе Установка цен или в с рабочего места Цены(Прайс-лист)

    Поясню.

    От поставщика» Завод» мы получаем прайс на товар с ценой «Рекомендуемая». По этой цене мы продаем нашим клиентам товар, делая различные сложные скидки. А также по этой же Рекомендуемой цене мы покупаем товар у поставщика Завод, но скидки, конечно, Завод нам делает гораздо большие и они тоже сложные. Скидки разные на разные товары (от 10 до 50%). Скидки зависят от того, предоплата или отсрочка. сколько дней отсрочка, какой товар, и проч. в общем сложные скидки. Скидки у нас настроены, все нормально.

    Но, мы вынуждены заводить (обновлять) регулярно объемный прайс Рекомендуемой цены.ВРУЧНУЮ ДВАЖДЫ.

    Один раз — создавая Цены поставщика (Прайс-лист), колонка цены (вид цены) — Рекомендованная, поставщик — Завод.

    Второй раз — Создавая свой Цены (прайс-лист), колонки прайс-листа (вид цен) РекомендуемаяЦена.

    Нам не хочется заводить одни и те же цифры (Рекомендованный прайс Завода) в наш прайс и в прайс поставщика. Хочется сначала заполнить один прайс поставщика, а из него — автоматически -прайс наш.

    Reply
  16. karpik666

    (15) Кошкин Василий, здравствуйте, попробуйте настроить вторую цена, как рассчитываемую на основании первой, в проценте надбавки указать 0

    Reply
  17. InWith

    (0) Спасибо за статью, очень полезно.

    Задался настройкой данного механизма. Смог настроить произвольным запросом один вид цен (ВидЦен1). Сделал установку цен для ВидЦен1. Теперь хочу другим произвольным запросом рассчитать ВидЦен2 по формуле, например ВидЦен1 * x (где x — получаю из БД). Пытался получить ВидЦен1 как у (9), в конструкторе запрос работает как нужно, но в виде цен — не работает.

    Уважаемый karpik666, было бы не плохо, если бы Вы объяснили как вид цен рассчитанной произвольным запросом, в другом виде цен, который настраивается произвольным запросом… )))

    Reply
  18. karpik666

    (17) InWith, здравствуйте, к сожалению сейчас с управлением торговлей не работаю, поэтому как-то подробней тему не смогу раскрыть.

    Reply
  19. Spacer

    Добрый день! Хорошая статья.

    Не подскажете как можно сделать следующее:

    В документ реализации нужно включать стоимость доставки. Стоимость доставки рассчитывается как 10% от стоимости всего заказа.

    Хотелось бы реализовать такую схему типовыми средствами.

    Создаю номенклатуру «Доставка товара» с типом услуга. В типовом соглашении об условиях продаж на закладке «Уточнение цен по товарам»

    добавляю номенклатуру «Доставка товара» указываю вид цены «Доставка».

    В карточке этого вида цены указываю: использовать «при продаже клиентам»; способ задания цены «произвольный запрос к данным ИБ».

    В поле схема компоновки данных «произвольный».

    И вот теперь вопрос: как в этой схеме получить стоимость доставки путем суммирования стоимости всех товаров в заказе и умножения этой стоимости на 10%.

    Возможно ли это? Или может я пошел не тем путем и лучше реализовать все это как то по другому?

    Reply
  20. h00k

    (19) Spacer,

    Или может я пошел не тем путем и лучше реализовать все это как то по другому?

    Правильней, да и проще, реализовать обработкой заполнения для документа.

    Reply
  21. kassbar

    Reply
  22. kassbar

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

    Reply
  23. karpik666

    (21) kassbar, здравствуйте, пришлите мне в сообщении сам запрос, все ли в нем верно.

    Reply
  24. kassbar

    (23)

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


    Reply
  25. karpik666

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

    Reply
  26. karpik666

    Должно быть Валюта.Ссылка КаК Валюта, и Номенклатура.Ссылка КАК Номенклатура.

    Reply
  27. kassbar

    я уже по-всякому писал, и ссылка, и с фигурными скобками и без, не считает все равно

    Reply
  28. karpik666

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

    Reply
  29. kassbar

    Спасибо )

    Добавьте пож-та в статью этот пункт «А в прайс-листе когда будете рассчитывать цены — при заполнении ничего не проставится и нужно нажать «Рассчитать вычисляемые».

    Собственно в нем и была вся загвоздка, просто по нажатию кнопки «сформировать» расчета цены не происходит, только заполняется колонка ном-ры.

    Все работает, супер !

    Reply
  30. karpik666

    (29) kassbar, пожалуйста, публикацию обновлю и добавлю данную информацию. Если же статья понравилась, то ставь плюс, очень мотивирует.

    Reply
  31. Prizrak8000

    Привет. Помоги разобраться. Не как ни могу запустить выдаёт ошибку. Ошибка в схеме компоновки данных

    по причине:

    Ошибка получения информации набора данных

    по причине:

    Ошибка в запросе набора данных

    по причине:

    {(67, 59)}: Неверные параметры «Справочник.УпаковкиНоменклатуры.ПустаяСсылка»

    КОГДА ЦеныНоменклатурыСрезПоследних.Упаковка = ЗНАЧЕНИЕ(<<?>>Справочник.УпаковкиНоменклатуры.ПустаяСсылка)

    Reply
  32. karpik666

    (31) Здравствуйте, судя по данной ошибке, в конфигурации нет справочника «УпаковкиНоменклатуры», проверьте может он был переименован на «Упаковки», либо его вообще убрали

    Reply
  33. Prizrak8000

    Здравствуйте, проверил такого справочника нету, что теперь делать? Спасибо.

    Reply
  34. karpik666

    (33) поправить текст запроса

    Reply
  35. Prizrak8000

    Вы поможете с поправкой текста. Если вам не сложно. И то я этого не понимаю

    Reply
  36. user810065

    Добавьте пож-та в статью этот пункт «А в прайс-листе когда будете рассчитывать цены — при заполнении ничего не проставится и нужно нажать «Рассчитать вычисляемые».

    Собственно в нем и была вся загвоздка, просто по нажатию кнопки «сформировать» расчета цены не происходит, только заполняется колонка ном-ры.

    Все работает, супер !

    Reply
  37. Zakuskin

    Доброго времени суток. А есть возможность в типовой произвести наценку таким образом:

    Закупочная цена от 0р до 999р — наценка 50%

    Закупочная цена от 1000р до 10000р — наценка 40% и т.п.?

    Конфигурация КА2

    Reply
  38. karpik666

    (37) Здравствуйте, давно работал с УТ 11, поэтому могу не помнить. но разве в типовом функционале нельзя задать шкалу с уловиями и размером наценки без программирования формулы в СКД?

    Reply
  39. Zakuskin

    (38)

    ром наценки без программирования формулы в СКД?

    Возможно, что есть такая возможность, но за последнюю неделю я ее не смог найти. К тому же, на сколько я понял, в КА2 есть только 1 вид цен — Прайс-лист или я ошибаюсь?

    Reply
  40. karpik666

    (39) внутри справочника можно завести разные виды цен

    Reply
  41. Zakuskin

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

    Но как включить наценку по диапазонам? Вычитал на форуме, что можно это сделать с помощью документа «Установка диапазонов базовых цен», но в конфигурации не могу найти ничего похожего на этот документ.

    Reply
  42. Zakuskin

    Проблема решена, всем спасибо за участие.

    Итак, мой вариант решения проблемы, может кому будет полезно.

    Имеем необходимые диапазоны наценок от закупочной цены:

    От 0 р. до 100 р. — 100%

    От 100 р. до 500 р. — 50%

    От 500 р. до 1000 р. — 40%

    От 1000 р. до 5000 р. — 35%

    От 5000 р. до 10000 р. — 30%

    От 10000 р. до 20000 р. — 25%

    От 20000 р. до 30000 р. — 20%

    Свыше 30000 р. — 15%

    Создаем вид цены «Закупочная» со способом задания цены «Произвольный запрос к данным ИБ» со схемой компановки данных «Цена поступления»

    Создаем вид цены «Розничная» со способом задания цены «Произвольная формула от других видов цен», саму же формулу нужно писать под определенные условия, в моем случае формула получилась следующая:

    ?([Закупочная] <= 100,[Закупочная] * 2,?([Закупочная] > 30000,[Закупочная] * 1.15,?([Закупочная] <= 500,[Закупочная] * 1.5,?([Закупочная] > 20000,[Закупочная] * 1.2,?([Закупочная] <= 1000,[Закупочная] * 1.4,?([Закупочная] > 10000,[Закупочная] * 1.25,?([Закупочная] <= 5000,[Закупочная] * 1.35,[Закупочная] * 1.3)))))))

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

    Согласен, решение кривовато, но всё таки это решение:)

    Reply
  43. ColaLee
    Reply
  44. ColaLee

    Разобрался!

    Нужно было переменную &ВидЦены назвать по другому. В эту передается обрабатываемая цена. Я назвал &ВидЦены_Закуп, добавил в параметры и присвоил цену закупа. Вот рабочий вариант:

    ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    ВЫБОР
    КОГДА ЦеныНоменклатурыСрезПоследних.Номенклатура.Ссылка В ИЕРАРХИИ (&Игрушки)
    ТОГДА ЦеныНоменклатурыСрезПоследних.Цена + ЦеныНоменклатурыСрезПоследних.Цена * 0.6
    КОГДА ЦеныНоменклатурыСрезПоследних.Номенклатура.Ссылка В ИЕРАРХИИ (&Одежда)
    ТОГДА ЦеныНоменклатурыСрезПоследних.Цена + ЦеныНоменклатурыСрезПоследних.Цена * 0.55
    ИНАЧЕ ЦеныНоменклатурыСрезПоследних.Цена
    КОНЕЦ КАК Цена,
    ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
    ЦеныНоменклатурыСрезПоследних.Упаковка КАК Упаковка,
    ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
    1 КАК Коэффициент
    ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаДокумента, ВидЦены = &ВидЦены_Закуп) КАК ЦеныНоменклатурыСрезПоследних
    

    Показать

    Reply
  45. zemskov

    Доброго времени суток!

    Вдохновился статьёй, но до конца недопонял.

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

    С уважением, Земсков В.К.

    Reply
  46. softgarant

    смутила меня такая трактовка

    &ДатаДокумента – принимает значение либо дату документа установки цен, либо если идет расчет прайса, то дату в форме, если дата не заполнена, то принимает значение ТекущаяДата()

    с этим

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

    я согласен, закодировал проверку на дату и поигрался датой документа установки цен (скрины прикрепил)

    но, с этим

    если идет расчет прайса, то дату в форм

    во первых, у меня это не работает, неважно какая дата прайса, цена с установки такая как в документе Установки цен

    Reply
  47. ma-mon-t

    Здравствуйте, не понимаю как работают стандартные СКД при способе задания цены «Произвольный запрос к данным ИБ». Выбираю, например, «минимальные цены поставщиков», нажимаю «редактировать». Добавляю в отбор «виды цены поставщика», выбираю конкретную цену поставщика, сохраняюсь. В Прайс-листе рассчитываю вычисляемые. Что за цена выскакивает, непонятно. На данный товар единожды устанавливалась цена поставщика. Оптовая -27290 и розничная — 34110, но в прайсе появляется 28425., что это за цифра, это и не средняя, ни минимальная, почему не работает отбор? Какую бы я ни использовал стандартную СКД использующую цену поставщика появляется -28425.Они, что не настроены на самом деле?

    Reply
  48. ma-mon-t

    Разобрался, НДС надо было проставить во всех ценах, и в ценах поставщиков и в настраиваемых.

    Reply

Leave a Comment

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