Установка Единиц Хранения и Измерения Номенклатуры (обработка для 1С 8.1)




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

28 Comments

  1. ghostishe

    А чем не устраивает Универсальный подбор и обработка? небольшой произвольный алгоритм написать и все.

    Reply
  2. Serg O.

    Да, конечно можно и Универсальный подбором то же самое сделать, только надо иметь ввиду, что Единицы Хранения — это отдельный справочник, подчиненный Номенклатуре, а не реквизит!

    Я быстренько написал эти две обработки для передачи в магазин, где Юзер бы нажал кнопочку и ему все сделалось и показалось… + есть новички в программировании, которым эта обработка может быть полезной.

    А так, конечно можно написать запрос, а потом шагать по выборке, создавать элемент этого справочника, получать объект номенклатуры и записывать в него…короче кто умеет, тот сделает любым способом, а это для тех кому надо 😀

    Reply
  3. halushka

    Удобная весчь. Сам при написании правил переноса с упп в комплексную косякнул и номенклатура частично без остатков перенеслась. 👿

    Клиент чухнул тока через неделю !!!! Вот с универсальным подбором ничего и не получилось !!! Пришлось через редактор реквизитов менять единицу остатков и потом только универсальным подбором и обработкой допинывать.

    Юзер убил 2 дня.

    Reply
  4. ladoga

    Буквально вчера 3 часа убила по этой теме. Загрузили номенклатуру из Excel, а она только с базовыми единицами. Пока вашу обработку не проверяла, но если это работает — огромное спасибо. (УТ только осваиваю)

    Reply
  5. Serg O.

    как говорил ghostishe,

    действительно можно использовать спец.обработку с диска ИТС, но это для тех, у кого есть под рукой ИТС-диск 🙂 — УниверсальныеПодборИОбработкаОбъектов.epf

    как ее применить для текущей темы — очень подробно написано еще в 2007г. !!!

    http://www.1c-pro.ru/lofiversion/index.php/t9540.html

    Reply
  6. nikser

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

    Reply
  7. Glenas

    Спасибо, очень помогла

    Reply
  8. Trogvar

    Хорошая обработка и гланое полезная, недавно такуюже писал для перегрузки.

    Reply
  9. bes-kkm

    Спасибо, очень полезная обработка.

    Reply
  10. bes-kkm

    Удобно ккогда нужно сразу у многий позиций изменить единицы измерения и хранения.

    Reply
  11. Babinka

    Спасибочки!!! Очень пригодилась обработка! Нужная штучка!

    Reply
  12. olexandr

    Спасибо, хорошая полезная обработка — помогла справится с последствиями стандартного удаления дубликтов 🙂

    Reply
  13. Acasta

    Спасибо за обработку!

    Reply
  14. sirm

    Очень помогла при загрузке Номенклатуры из Exel.

    Спасибо!

    Reply
  15. mrd_84

    Эта штука очень помогает, особонно начинающим программерам. Спасибо Вам ребята за то, что делитесь опытом!!!)))

    Reply
  16. overloader

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

    Reply
  17. phen1x

    Огромное спасибо за обработку, раньше мучились руками…

    Reply
  18. w22u

    Научил приятеля импортировать номенклатуру из Excel файла. Теперь ему без этой обработки точно не обойтись )))

    Reply
  19. Гость

    Спасибо за обработку, пригодилась

    Reply
  20. Гость

    Было — бы весьма актуально, если-бы еще и ЕДЕНИЦЫ ХРАНЕНИЯ МЕСТ обработало. А иначе как? Можно проконтролировать загрузку или коррекцию с помощью http://infostart.ru/public/97415/

    СсылкаНоменклатуры = Справочники.Номенклатура.НайтиПоКоду(ТекущиеДанные[«Владелец»]);
    //БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду(796);
    Сообщить(СсылкаНоменклатуры.Наименование);
    Если Строка(СсылкаНоменклатуры.Наименование)<>Строка(ТекущиеДанные[«Владелец»]) Тогда
    Если (ПустаяСтрока(Строка(СсылкаНоменклатуры.Наименование)))<>истина Тогда
    Сообщить(«———————— вносятся лишние изменения: «+СсылкаНоменклатуры.Наименование+»   по коду   «+ТекущиеДанные[«код»]+» необходимо проверить :»);
    КонецЕсли;
    КонецЕсли;
    
    
    
    

    Показать

    Reply
  21. Deniz200

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

    Reply
  22. goldenolga

    Отлична обработка

    Reply
  23. sirm

    Уже два года пользуюсь! Классная штука!

    Особенно при переходе от одной конфы к другой!

    Reply
  24. bes-kkm

    При конвертирования из 8.0 в 8.1 сохраненных в 8.0 только справочников

    (Справочник номенклатуры, справ. ед. из, классиф. ед изм, валюты и т.п )

    получилась ситуация

    Элемент номенклатуры

    — базовая единица заполнена.

    — Табличная часть (единиц измерения) заполнена.

    НО ЕдиницаДляОтчетов -не выбрана

    ЕдиницаХраненияОстатков — не выбрана

    т.е. поъхоже ссылки на ед. из. утерены при конфертировании.

    Задача проставить каждом элементе номенклатуры в соответствие

    ЕдиницаДляОтчетов и ЕдиницаХраненияОстатков Базовую еденицу Измерения

    Делаю так

    Ссылка = Справочники.Номенклатура.НайтиПоКоду(» Код элемента»);

    Элемент = Ссылка.ПолучитьОбъект();

    Запрос2 = Новый Запрос;

    Запрос2.Текст = «ВЫБРАТЬ

    | ЕдиницыИзмерения.Ссылка,

    | ЕдиницыИзмерения.Владелец,

    | ЕдиницыИзмерения.Код,

    | ЕдиницыИзмерения.Наименование,

    | КлассификаторЕдиницИзмерения.Ссылка КАК Ссылка1,

    | КлассификаторЕдиницИзмерения.Код КАК Код1

    |ИЗ

    | Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения

    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КлассификаторЕдиницИзмерения КАК КлассификаторЕдиницИзмерения

    | ПО ЕдиницыИзмерения.ЕдиницаПоКлассификатору = КлассификаторЕдиницИзмерения.Ссылка

    |ГДЕ

    | ЕдиницыИзмерения.Владелец = &Владелец

    | И ЕдиницыИзмерения.ЕдиницаПоКлассификатору.Код = &ЕдиницаИзмПоКл»;

    Запрос2.УстановитьПараметр(«Владелец»,Справочники.Номенклатура.НайтиПоКоду(Ссылка.Код).Ссылка);

    Запрос2.УстановитьПараметр(«ЕдиницаИзмПоКл»,Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду(Элемент.БазоваяЕдиницаИзмерения.Код).Ссылка );

    Результат2 = Запрос2.Выполнить();

    ВыборкаЭЛ = Результат2.Выбрать();

    Если ВыборкаЭЛ.Количество()=1 Тогда

    Сообщить («Правим этот элемент»,СтатусСообщения.БезСтатуса);

    Элемент.ЕдиницаДляОтчетов = ВыборкаЭЛ.ЕдиницыИзмерения.Ссылка;

    Элемент.ЕдиницаХраненияОстатков = ВыборкаЭЛ.ЕдиницыИзмерения.Ссылка;

    КонецЕсли;

    Элемент.Записать();

    Где я не прав?

    Подскажите пожалуйста!! Горю на работе….

    Reply
  25. Foxux

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

    Reply
  26. Serg O.

    🙂

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

    Reply
  27. ВеснушкаК

    Спасибо! Для УТ 10.3 без ошибок отработало.

    Reply
  28. romku

    Все бы ничего, но вложенные папки не обрабатывает. Пришлось поменять «выбрать» на «выбратьиерархически».

    Reply

Leave a Comment

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