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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *