Заполнение алкогольных реквизитов Номенклатуры из классификатора ЕГАИС (Розница 2.х)




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

36 Comments

  1. stsv12006

    А как бы в полное наименование добавить объем в литрах?

    Reply
  2. supermacho

    (1) stsv12006, спасибо за рацпредложение! На самом деле очень важная вещь, так как в ЕГАИС все на одно лицо. Добавлю в течение пары дней.

    Reply
  3. stsv12006

    (2) спасибо. Предложение №2, надо бы переносить производителя в стандратное поле производителя номенклатуры, а не только в «сведения об алкогольной продукции». Почему? Потому что при формировании «Отчет по расхождениям реквизитов ЕГАИС» данные о производителе читаются из поля производителя номенклатуры а не алкопродукции. Это не совсем правильно, потому что логично чтобы 1с читала их из «сведений алкогольной продукции», но заполнение стандартного поля лишним не будет.

    Reply
  4. stsv12006

    (2) Предпложение №3 http://infostart.ru/public/338984/ для розницы. Только заполнять при этом не только код и наименование, но и «вид лицензии» и признак «маркируемый». Декларант можно взять здесь http://www.fsrar.ru/files/DeclarantSetup.zip

    Reply
  5. stsv12006

    (2) Предложение №4, 2 настройки(заполнять полное наименование, заполнять короткое».

    Reply
  6. supermacho

    (3) stsv12006, (5) stsv12006, добавил! Спасибо за пожелания.

    (4) stsv12006, не совсем понятен сценарий использования справочника. При работе с ЕГАИС он заполняется автоматически.

    Reply
  7. stsv12006

    ..

    Reply
  8. modeus666

    Неплохо было бы добавить автоматическое создание недостающих контрагентов производителей и импортёров из справочника ЕГАИС, при их отсутствии в справочнике Контрагенты.

    Reply
  9. supermacho

    (8) modeus666, хорошее предложение. Добавлю в ближайшее время.

    Reply
  10. 5404250

    1с Розница 2.2.2.15 Базовая выдает ошибку при установке обработки:\r

    Невозможно подключить дополнительную обработку из файла.

    Возможно, она не подходит для этой версии программы.

    Метод объекта не обнаружен (СведенияОВнешнейОбработке)

    Что делать?

    Reply
  11. supermacho

    (10) 5404250, Воспользуйтесь меню Файл -> Открыть.

    Reply
  12. All_1972

    Есть возможность доработать обработку?

    Необходимо подтянуть реквизиты,

    Вид алк. продукции. объём в декалитрах, и крепость.

    Reply
  13. modeus666

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

    Reply
  14. mms76

    (13) modeus666, есть стандартная обработка в конфигурации

    Reply
  15. sancho86

    При нажатии на кнопку выходит ошибка «Индекс находится за границами массива».

    Пробовал на 2.2.4.12 и на последней 2.2.4.30

    Reply
  16. supermacho

    (15) sancho86, проверено на многих релизах. Скорее всего что-то не так с данными в ИБ. Проверьте, пожалуйста, что у вас заполнен регистр сведений Соответствие номенклатуры ЕГАИС.

    Reply
  17. sancho86

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

    Reply
  18. supermacho

    (17) sancho86, в таком случае должно работать . Возможно, у вас есть записи в регистре сведений Соответствие номенклатуры ЕГАИС, где не заполнена Алкогольная продукция. Если это так, то удалите их.

    Reply
  19. sancho86

    (18)Забыл отписаться что в этом и была проблема.

    Плохо что обработка не умеет об этом говорить и пропускать такие записи.

    Также очень не хватает предупреждалки о нескольких карточках номенклатуры ошибочно сопоставленных с одной АП.

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

    Reply
  20. lefthander

    Можно свои пять копеек? Хорошо бы по документу Остатков из ЕГАИС заполнить номенклатуру.. Вот ситуация — создали базу, она чистая, загрузили остатки, нажали кнопку и по остаткам документа появилась номенклатура и контрагенты… мечты… Однако попробую.

    Reply
  21. AlexPRN

    Всем доброго дня! При нажатии кнопки «Заполнить реквизиты» выдается ошибка: «Недопустимое значение параметра (параметр номер ‘1’). что можно с этим сделать? Конфигурация 2.2.5.22

    Reply
  22. supermacho

    (21) Протестировал на двух базах релиза 2.2.5.23 — работает. Попробуйте проверить содержимое регистра сведений Соответствие номенклатуры ЕГАИС на наличие пустых полей.

    Reply
  23. Protman

    В классификаторе ЕГАИС бывает Краткое наименование = Полному наименованию. Для примера (100 зн.): Вино защищенного наименования места происхождения региона Кахетия красное полусладкое «Киндзмараули»

    Исходя из ограничения на 100 символов в «кратком наименовании» мы не сможем добавить литраж и прочее, производителя для примера.

    1. Может стоит использовать общепонятные сокращения как это использовано на марках и удалять из краткого названия не критичные данные? Для примера: «сух. кр. п/сл п/сх и т.д.» Выше указанный пример тогда станет таким (52 зн.): Вино региона Кахетия кр. п/сл. «Киндзмараули» 0,75л.

    0,75

    2. Объем в литрах к наименованию номенклатуры добавлять не только в краткое наименование но и в полное.

    3. Добавлять в наименование производителя т.к. часто с разными алкокодами есть одинаковые наименования. Для примера: Вино столовое белое сухое «Ркацители» производится несколькими десятками фирм.

    p.s. Предложения 2 и 3 добавлять не только в краткое наименование но и в полное.

    Reply
  24. tulapc

    на 2.2.6.22 перестало работать

    Reply
  25. hulkulya

    Присоединяюсь к Олегу Пастухову (tulapc) — на 2.2.6.22 перестало работать

    Вообще беда с обновлениями на 2.2.6…

    Сейчас клиент как обычно все делал, работая с ТТН, при нажатии на кнопку <требуется оформить>, начала ругаться «в документе найдены несопоставленные элементы классификаторов ЕГАИС. сопоставить классификаторы?», нажимаешь сопоставить, а все сопоставлено, заходишь в ттн, а там на всех позициях горит красным <не сопоставлено>, вот думал обработка поможет….

    Reply
  26. Tereza

    (25)

    Для Розницы 2.2.6.22 зарегистрирована ошибка:

    Код ошибки: 00-00122112

    Статус: Принята к исправлению Зарегистрирована: 06.07.2017

    Описание:

    Во входящих ТТН сопоставленная номенклатура отображается как несопоставленная, если в документе заполнен идентификатор упаковки, а в сопоставлении упаковка не указана.

    Способ обхода:

    В сопоставлении заполнить идентификатор упаковки

    Reply
  27. user798450

    Вопрос разработчику у меня версия я думаю последняя розницу ( 2.2 (2.2.6.33)). На ней будет работать.??

    Reply
  28. user798450

    Не работает для последней версии розницы 2.2 (2.2.7.32) на свежей платформе 1С:Предприятие 8.3 (8.3.11.2867) . Пишет «Таблица не найдена регистр соответствия орган ЕГАИС. Левое соединение …. » скриншот приложен. Просьба исправить. Уже заплатил чтобы скачать это приложение.

    Reply
  29. user599429_saity2011

    Здравствуйте, я тоже приобрел, но на 2.2.7.42 не работает. Пишет «Таблица не найдена регистр соответствия орган ЕГАИС. Левое соединение …. Как в предыдущем посте.

    Reply
  30. supermacho

    (29)

    (28)

    (24)

    Вышла новая версия обработки 1.4 с поддержкой Розницы 2.2.6, 2.2.7, 2.2.8

    Reply
  31. modeus666

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

    Reply
  32. supermacho

    (31) Можно скачать версию 1.4 на текущей странице.

    Reply
  33. 57rus

    Розница 2.2.9.20. Ошибка:

    {ВнешняяОбработка.ЗаполнениеРеквизитовАП.Форма.Форма.Форма(42)}: Ошибка при вызове метода контекста (ЗаполнитьЗначенияСвойств)

    ЗаполнитьЗначенияСвойств(НоменклатураОбъект, РеквизитыАлкогольнойПродукции,, СтрокаПереносимыхРеквизитов);

    по причине:

    Недопустимое значение параметра (параметр номер ‘1’)

    Reply
  34. 57rus

    Проблема была в регистре сведений Соответствие номенклатуры егаис. Все работает отлично. Полезная обработка.

    Reply
  35. user1001734

    Добрый день! Куплю за рубли.

    Reply
  36. hulkulya

    Доброго времени суток! Работает ли данная обработка с последней рознице 2.2.13.12?!

    Reply

Leave a Comment

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