Помощник корректировки остатков ЕГАИС в небольшом магазине. Розница 2.2




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

45 Comments

  1. user856756

    Здравствуйте! Мы работаем с 1С Предприятие 8.3.11.30.34 Розница 2.2.9.19! Вопрос по помощнику корректировки ЕГАИС — данную обработку нужно дорабатывать или она уже готова — открываем и работаем)!? И меня интересует фраза «надо подкорректировать запрос касательно формирования остатков алкогольной продукции»…. Что это значит!? Спасибо!

    Reply
  2. asdfgcom

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

    Reply
  3. asdfgcom

    Заметил особенность УТМ. Когда передавалось 2100 строк в Передачу рег. №2 УТМ вернул ошибку по размеру файла. Разбил документ на 4 части (примерно по 500-600 строк) — прошло успешно.

    Reply
  4. Natali-tech

    Здравствуйте! В описании указано «Выполните пересчет алкогольной продукции на складе (в торговом зале).»

    Обработка данные берет из документа «Пересчет» или же берет остатки ТМЦ на дату корректировки?

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

    Reply
  5. asdfgcom

    (4) Данные берутся из регистра накопления. Не из документа пересчет. Требуется выполнить списание, оприходование после завершения пересчета.

    Reply
  6. asdfgcom

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

    Упор на пересчет сделал из-за своей профдеформации (ко мне попадают, обычно, тяжелые случаи). )))

    Reply
  7. user856756

    С чем связана эта ошибка!?

    Reply
  8. asdfgcom

    (7) Вы указали соответствующий документ с остатками по регистру 1 или 2?

    Reply
  9. avangard1016

    У меня такая же ошибка, как и user856756. Инвентаризацию сделали. Привели в порядок складские остатки: оприходовали излишки и списали недостачи. С помощью вашей обработки перенес остатки регистра № 1 в регистр №2. Далее заново запросил остатки ЕГАИС, убедился, что в первом регистре пусто. В соответствующих ячейках выбрал необходимые актуальные документы по регистру 1 и регистру 2.

    Релиз 2.2.9.20, Платформа 8.3.11.2899

    Reply
  10. asdfgcom

    (7)(9) Не удается получить аналогичную ошибку. Если есть возможность, готов подключиться, чтобы проверить.

    Запустите через отладчик. В какой строке возникает ошибка?

    Reply
  11. asdfgcom

    (9) Не удается получить аналогичную ошибку. Если есть возможность, готов подключиться, чтобы проверить.

    Запустите через отладчик. В какой строке возникает ошибка?

    Reply
  12. asdfgcom

    Внесены изменения:

    1. Передача в регистр №2. Если размер превышает 500 строк, то создается несколько документов. Требуется провести и передать каждый.

    2. Добавлен фильтр по магазину. Требуется для организаций, где несколько филиалов.

    Reply
  13. asdfgcom

    (7) Ошибка: Значение не является значением объектного типа (ОстатокЕГАИС) связана с не сопоставленной номенклатурой!

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

    НСИ — Сопоставление номенклатуры ЕГАИС. Фильтр «Не связанные»

    Reply
  14. asdfgcom

    Ошибка: Значение не является значением объектного типа (ОстатокЕГАИС) связана с не сопоставленной номенклатурой!

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

    НСИ — Сопоставление номенклатуры ЕГАИС. Фильтр «Не связанные»

    Обновил обработку. Теперь формирует таблицу расхождений с пустыми полями, если номенклатура не связана с алкогольной продукцией. Скачавших обработку ранее прошу обратиться в ЛС с указанием e-mail.

    Reply
  15. asdfgcom

    Для самостоятельного исправления в модуле формы в процедуре: Процедура ЗаполнитьТаблицуНаСервере() Требуется внести изменения (строка 105-121):

    ………………….
    //Заполним таблицу остатками из массивов
    Для а = 0 По УчетныеОстатки.Количество()-1 Цикл
    Стр = ТабСоответствий.Найти(УчетныеОстатки[а].Номенклатура,»Номенклатура»);
    Стр.Остаток = УчетныеОстатки[а].Количество;
    КонецЦикла;
    
    Для а = 0 По ОстаткиЕГАИС.Количество()-1 Цикл
    Стр = ТабСоответствий.Найти(ОстаткиЕГАИС[а].АлкогольнаяПродукция,»АлкогольнаяПродукция»);
    Если НЕ Стр = Неопределено Тогда
    Стр.ОстатокЕГАИС = ОстаткиЕГАИС[а].Количество;
    Иначе
    Стр = ТабСоответствий.Добавить();
    Стр.ОстатокЕГАИС = ОстаткиЕГАИС[а].Количество;
    Стр.АлкогольнаяПродукция = ОстаткиЕГАИС[а].АлкогольнаяПродукция;
    Стр.Остаток = 0;
    КонецЕсли;
    КонецЦикла;
    ……………………
    
    

    Показать

    Так же установите АвтоотметкаНезаполненного на колонки «Номенклатура» и «Алкогольная продукция» ТЧ «СравнениеОстатков»

    Reply
  16. asdfgcom

    ВНИМАНИЕ. На последнем этапе корректировки фильтр по магазину должен быть заполнен. В противном случае колонка с фактическими остатками в магазине не заполнится. Т.е. сформируется полное списание всей алкогольной продукции ЕГАИС!

    Reply
  17. webandroid

    все же не понял есть ли выбор даты и времени получения остатков из регистра для корректировки. Допустим остатки ЕГАИС были получены месяц назад и именно той датой я хочу сделать корректировку. Естественно проверить результат ЕГАИС задним числом уже не получится. Или у вас остатки всегда текущие?

    Reply
  18. asdfgcom

    (17) Верно. Считаю, что за длительное время остатки могли «поплыть». Однако, сам столкнулся при корректировке с такой ерундой. Пересчитали, начали продавать. Хорошо, что товаровед зацепилась за цифры в остатках.

    Сегодня обязательно добавлю выбор даты-времени. Сделаю, также, обнуление столбца остатков для ИП, работающих по принципу «Что пришло — то ушло», хотя этого и не одобряю.

    Обработку с изменениями вышлю по запросу всем скачавшим.

    Reply
  19. asdfgcom

    Обновил обработку со следующими изменениями:

    1. Добавлена дата/время запроса остатков магазина. Теперь можно начинать торговлю сразу же после выполнения пересчета и запроса остатков в регистре №2.

    2. Добавил кнопку «Обнулить остаток».

    3. Пересчет в таблице в случае ручной корректировки.

    Reply
  20. user1061307

    Не загружается в

    1С:Предприятие 8.3 (8.3.13.1513)

    Розница, редакция 2.2 (2.2.9.20)

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

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

    Reply
  21. asdfgcom

    (20) Открывается через Главное меню-Файл-Открыть.

    Добавил возможность подключения через стандартный функционал. Версия 1.2.2.

    Прошу прислать Ваш e-mail.

    Reply
  22. Viar-x

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

    Reply
  23. asdfgcom

    (22) Сделано! Сортировка по всем полям в «Еще». Итоги в подвале. Пришлите Вашу почту в ЛС.

    Reply
  24. trofimka2007@MAIL.RU

    Добрый день. Как с вами можно связаться?

    Reply
  25. asdfgcom

    (24) ЛС

    Reply
  26. asdfgcom

    Внимание! На все предложения прислать обработку «иными способами» отвечу отказом!

    Reply
  27. user702718_vnataliam

    Добрый вечер, с учетом регистра 3 не делали доработку?

    Reply
  28. asdfgcom

    (27) Разбираюсь с 3м регистром. Когда будет готово, отпишусь.

    Reply
  29. asdfgcom

    ВНИМАНИЕ! Использование обработки в текущем виде для корректировки остатков при использовании регистра №3 для помарочного учета алкоголя в данный момент недопустимо! Обработку можно использовать только для корректировки немаркируемой АП.

    В данный момент ведется работа по корректировке АП с учетом регистра №3.

    Reply
  30. asdfgcom

    Комментарий.

    При приемке товара вся алкогольная продукция будет храниться на первом регистре, а информация по маркам, которые были отсканированы при приемке, будут храниться на Регистре № 3. То есть при приемке алкоголя с марками нового образца, уже не будет необходимости делать передачу на Регистр № 2.

    Следует так же отметить, что прием алкоголя со старыми акцизными марками не потерпела изменений. Так же, как и раньше, после подтверждения необходимо передавать данные по алкогольной продукции в Регистр № 2.

    Теперь нужно будет предусмотреть передачу в Регистр 2. В регистр 2 должны будут уходить только товары, не отраженные в регистре 3. Кроме того придется добавить списание с Регистра 1 и Регистра 3 пар АП, по которым выявлена недостача. Непонятно, что делать с пересортицей на Регистре 3.

    По хорошему, жду обращения за помощью в пересчете, чтобы разобраться в хитросплетениях регистров на практике.

    Reply
  31. Terve!R

    (30) сейчас Розница 2.2.11.24 как-то проверяет Справку 2 и ругается, что не может в регистр № 2 ее передать, может хотя бы доработать, чтобы можно было фильтровать номенклатуру с новыми марками по этому признаку? Актуально как раз всю прошлогоднюю номенклатуру из 1 во 2 регистр перекидывать, но отсечь с новыми марками. Могу помочь в доработке и тестировании на живом магазине)

    Странно еще, что в Рознице 2.2.11.24 на основании Поступления товаров можно ввести только Передачу в регистр № 2, но никак не Акт постановки на баланс, в котором можно выбирать в какой регистр передавать. Ваша обработка решила бы эту проблему, то есть могла бы автоматически раскидать поступление по двум актам во 2-й и 3-й регистры.

    Reply
  32. asdfgcom

    Согласен. Жду задание на проведение корректировки регистров. Все расслабились. После НГ не хотят считать ))

    Reply
  33. Natali-tech

    Здравствуйте! Подскажите, пожалуйста, на каком этапе доработка? У нас много магазинов, планируем до конца 1 квартала откорректировать остатки

    Reply
  34. RocKeR_13

    (31)

    Странно еще, что в Рознице 2.2.11.24 на основании Поступления товаров можно ввести только Передачу в регистр № 2, но никак не Акт постановки на баланс

    Новые марки (а также старые, но учтенные поштучно) не нужно ставить на 3 регистр после подтверждения ТТН: они автоматически отражаются на регистрах 1 и 3 после успешного подтверждения ТТН

    Reply
  35. asdfgcom

    (34) Если я правильно понимаю:

    1. При приемке помарочно (не партионно) передавать в регистр 2 нельзя?

    2. В этом случае продажа маркируемой продукции списывается непосредственно с регистра 1?

    Если все верно, то решение есть.

    1. При формировании таблицы расхождений добавлю еще 2 колонки:

    кол-во маркированной продукции на складе — Остаток Рег.1 / Кол-во партионной продукции — Остаток Рег.2. (так выявим несоответствия по каждому из регистров)

    2. При создании передачи в рег.1 — рег.2 будем передавать только продукцию принятую партионно.

    3. Остатки по регистрам 1,2 придется запрашивать дважды в процессе корректировки. Сначала, чтобы увидеть что «лишнего» на регистре 1. Потом, после передачи «Лишней» продукции с регистра 1 на регистр 2, для формирования корректировочных актов принятия на баланс и списания.

    Reply
  36. asdfgcom

    Возникает вопрос. Как осуществляется движение помарочного алкоголя по регистрам 1 и 3?

    Исправьте, где я не прав.

    1. Подтверждение «Помарочной» ТТН. Остаток в регистре 1.

    2. Продажа помарочного алкоголя. — остаток по регистру 1.

    Где регистр 3? В какой момент по нему происходит движение?

    Reply
  37. asdfgcom

    (33) Сделаем!

    Reply
  38. RocKeR_13

    (35) можно и партионную продукцию не передавать: в ходе приемки отсканировать все марки, а после подтверждения перейти в список актов постановки на баланс и на вкладке «К постановке регистр 3» оформить на партионную продукцию акт постановки на 3 регистр. Все равно когда-нибудь ФСРАР скажет всю продукцию с регистра 2 (кроме пива) перенести на регистры 1/3

    Reply
  39. Pavel5003

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

    Reply
  40. Pavel5003

    (36) а в 1 регистре хранится наименование и количество по каждому участнику оборота

    Reply
  41. firml

    Здравствуйте! Подскажите, пожалуйста, получилось сделать доработку для корректировки остатков при использовании регистра №3?

    Reply
  42. user1214939

    Доброе утро! Скажите как сделать пересчет алкогольной продукции с новыми марками в 1С далион.

    Reply
  43. tross

    (36) Подскажите альтернативные способы приобретения вашей обработки на tross@mail.ru

    Reply
  44. vvvalikvv

    можешь кинуть Помощник корректировки остатков ЕГАИС в небольшом магазине. Розница 2.2 на valikvv@rambler.ru , спасибо

    Reply
  45. asdfgcom

    (44) Прошу прощения. Этому препятствуют правила размещения разработок.

    Reply

Leave a Comment

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