Принципы проектирования справочников номенклатуры в 1С: Управление Предприятием 2 (ERP 2.4.6)




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

23 Comments

  1. MVK80

    «(т.е. каждый используемый элемент справочника «Типы номенклатура» следует повторить в справочнике «Виды номенклатуры»).» Типы номенклатуры — это перечисление.

    Reply
  2. HAMMER_59

    Открываем элемент справочника «Виды номенклатуры» читаем внимательно название закладки «Значения по умолчанию», делаем выводы, на всякий случай подсказываю под разные номенклатуру с разными ставками НДС, учетом ГТД и т.п. вовсе не обязательно создавать различные виды номенклатуры.

    Надеялся что в статье будет описано, где используется различная НСИ, т.е. — ввели мы «Вид номенклатуры», а дальше этот вид будет использован в качестве субконто, в каких-то отчетах и т.д. и т.п.

    Reply
  3. kolya_tlt

    разбавить картинками не помешало бы

    Reply
  4. Ibrogim
    условия, когда обязательно следует создать отдельный вид номенклатуры

    Отдельного вида номенклатуры требует номенклатура с общим набором свойств

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

    Reply
  5. roman72

    (1) Спасибо, поправил )

    Reply
  6. roman72

    (2) Весьма желательно давать отдельный вид. Но никак не обязательно, каждый решает сам, в зависимости от условий проекта. Но отдельный вид под разные ставки НДС — ну, на мой взгляд, маст хэв.

    «где используется различная НСИ» — ответ «везде». Как ещё ответить? Или конкретизируйте вопрос, если не сложно.

    Reply
  7. roman72

    (3) картинки места много съедят, а смысл не в них, а в тексте. Я даже не смог придумать что тут проиллюстрировать. И то Инфостарт заставил картинку справа вверху вставить.

    Reply
  8. roman72

    (4) Да, правильно. 1С сама в своей демо-конфигурации так справочник и конструирует.

    Reply
  9. Ibrogim

    (8)

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

    Reply
  10. roman72

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

    Reply
  11. kosmo0

    Немного о практике применения.

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

    зы. торопыжкам которые начнут приводить примеры — а вот у нас на предприятии…

    на конкретных предприятиях возможно все, но в целом примерно описанная ситуация — в номенклатуре и не полный бардак, но и не идеальная ситуация. Потому как прикладывать ОЧЕНЬ БОЛЬШИЕ усилия по «правильности» занесения просто не рентабельно.

    Reply
  12. Dragonim

    (11)

    Потому как прикладывать ОЧЕНЬ БОЛЬШИЕ усилия по «правильности» занесения просто не рентабельно.

    Как только начинается товарное планирование, автоматизация товарного обеспечения, анализ продаж, то «ОЧЕНЬ БОЛЬШИЕ» усилия окупаются сторицей. Те, кто не позаботился о правильном ведении номенклатуры начинают нести убытки от нерационального планирования и неправильных решений на основе анализа или узнают о том, что приведение справочника номенклатуры в порядок дело затратное и требует очень высококвалифицированного персонала по вашей тематике.

    Reply
  13. Aleskey_K

    Хорошо бы упомянуть системы MDM для ведения НСИ в рамках множества систем.

    Reply
  14. roman72

    (13) теории по MDM полно в интернете, а в статью всё ж не впихнёшь. Я старался изложить просто и практично доступный всем метод работы со справочниками..

    Reply
  15. 1977

    Прошу Совета, где хранить в базе 1с кода производителя товара. У нескольких производителей, код может быть одинаковым. Артикул уникальный.

    Reply
  16. roman72

    (15) Уточните, плиз, чем в вашей системе отличается код поставщика от артикула (поставщика)?

    В 1C ERP в карточке контрагента — поставщика на закладке «Номенклатура поставщика» в строках соответствия есть поле «Артикул» (поставщика).

    Поскольку устанавливается соответствие одна (наша номенклатура)-к-нескольким (номенклатурам поставщиков), то получается соответствие на один наш артикул — несколько артикулов (кодов) поставщиков.

    Производитель=поставщик.

    Подходит вам такой расклад?

    Или разговор об ещё одной аналитике «код производителя», который «может быть одинаковым у разных поставщиков»?

    Reply
  17. 1977

    Уточните, плиз, чем в вашей системе отличается код поставщика от артикула (поставщика)?

    У поставщика может быть свой артикул. Который не совпадает с артикулом нашем.

    Поскольку устанавливается соответствие одна (наша номенклатура)-к-нескольким (номенклатурам поставщиков), то получается соответствие на один наш артикул — несколько артикулов (кодов) поставщиков.

    Производитель=поставщик.

    Подходит вам такой расклад?

    Согласен.

    Или разговор об ещё одной аналитике «код производителя», который «может быть одинаковым у разных поставщиков»?

    Да, «код производителя» может быть у разных поставщиков.

    Reply
  18. undirecthands

    Роман, добрый день, не могу понять, как на этом сайте отправить личное сообщение, Вы не могли бы дать какой-либо контакт, хотелось бы задать пару вопросов, спасибо!

    Reply
  19. roman72

    (18) Я написал вам контакт в личку. Видите его там?

    Reply
  20. Margo1C

    Добрый день! А может есть у кого мысли, как лучше организовать номенклатуру? У меня коммерческое предложение считается в одной единице измерения (м2), а производится просто как комплект 1 штука. То есть я КП заказчику выставляю так: кол-во м2 * цену за м2, а в производство у меня уходит задание в количестве одной штуки. А объём работы я закрываю долями — допустим, в этом месяце я сделала 30% процентов от заказа. То есть закрываю 0,3 комплекта. Мне на это обязательно нужно заводить две разные номенклатуры? Ну чтобы завести их с разными единицами измерения?

    Reply
  21. parshin

    Добрый день!

    По использованию характеристик номенклатуры. «Товарными характеристиками могут быть размер одежды, длина заготовки…»

    1. Представим что длина заготовки может варьироваться от 1 м. до 6 м. с шагом 10 см. Тогда получается очень большой список характеристик и установка цен становится на такой быстрой. Но как-то где-то мы должны фиксировать длину заготовки. Есть варианты как это сделать? Желательно типовыми средствами.

    2. Характеристика (не знаю как правильно сказать) отражает количество товара. Например товар учитываем в тоннах, а хотим продать поштучно. Каждая характеристика в зависимости от длины заготовки имеет разный вес. Тогда не работает типовой механизм пересчета товара из одной единицы в другую т.к. коэфф. пересчета задается для номенклатуры а не для характеристики. Как быть в этом случае?

    Reply
  22. roman72

    (20) С чем связана передача в производство в штуках? Почему не в тех же метрах?

    Reply
  23. roman72

    (21) Товарные характеристики содержат разрез, который интересен для вашего клиента. Если ему интересны длины заготовок — значит длины должны быть в характеристиках. Такова «идеология» товарных характеристик.

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

    Reply

Leave a Comment

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