Предлагаю вашему вниманию функции для использования в целях обмена данными с универсальным транспортным модулем ЕГАИС. При доработке учетной системы с целью интеграции с транспортным модулем ЕГАИС, я столкнулся с серьезной проблемой, связанной с тем, что внешняя компонента V7Plus, предназначенная для работы по протоколу HTTP, а также для разбора XML-файлов, поддерживает только команду GET протокола HTTP, в то время как для работы с УТМ требуется поддержка команд GET, POST и DELETE.
P.S. Обновлены все функции и обработки для поддержки XML-ответов больше 100Кб (теперь длина неограничена). Также добавлена обработка выгрузки расходной накладной. Добавлена загрузка приходной накладной, а также диапазона марок из справки А.
Внимание! добавлена полностью готовая к работе конфигурация для работы в ЕГАИС оптовых поставщиков. Реализованы следующие функции: автоматическая загрузка накладных и доп. форм из ЕГАИС, отправка актов подтверждения/отклонения/расхождения, загрузка справок А и Б, загрузка сведений о поставщике/производителе, загрузка справочников номенклатуры по ИНН производителя, постановка на баланс учтенного/не учтенного в ЕГАИС товара, штрихкодирование поступления/инвентаризации/реализации/постановки на учет (DataMatrix и PDF417), формирование партий на складе а также электронная выгрузка деклараций по формам 5,6,7,11,12.
В дальнейшем могу оказывать сопровождение
function sendclientinfoquery(inn) export
...<qp:Name>ИНН</qp:Name>...
есть атрибут названный по русски "ИНН". Не увидел преобразования кодировки текста в UTF-8 ?
Кажется что по умолчанию кодировка строковой переменной будет Windows...
(4) ivanov_alex, не проблема, сейчас как раз работаю над отправкой ТТН, отправкой акта подтверждения/отказа/расхождения поставщику, а также загрузкой справок формы A и B. Пишите в личку, что Вам надо, договоримся:)
(9) aximo, 1. REGB - это и есть справка Б
2. Требуется установка Curl, требуется формирование файла на диске, неудобно и избыточно, для работы моего кода не требуется установка дополнительных компонентов.
Кстати, заметил, что в тексте публикации не все функции, которые используются в обработках. Если кто-то уже скачал, извиняюсь за свой промах. Вечером выложу здесь файл с текстом глобального модуля в части, касающейся ЕГАИС.
(7) Yury1001, Добавлена строковая константа FSRAR_ID для установки идентификатора торговой точки, добавлено перечисление QueryType со значениями:
ForManufacturerInfo
ForProductsInfo
и добавлен справочник для хранения запросов queryegais следующей структуры:
Код - (нет)
Наименование - строка(42)
QueryType - Перечисление.QueryType
Status - Число(1)
inn - строка(20)
(13) rougudz, У Вас ошибка в XML-файле запроса, он у Вас неправильно сформирован. Возьмите мой вариант за основу, у меня все правильно сформировано. Например, что это за строка:
<ns:Document> (5.1)
Это точно не мой код. И делимитер для формы у меня формируется из случайных символов. Это не я писал.
(16)
на моей машине почету-то так отрабатывает getrandomstring
это я еще не разбирался.
своего я тут ничего не выдумывал, пробую ваше.
вот никак немогу понять в чем ошибка в запросе :(
(17) rougudz, У меня почему то есть, а у Вас само-собой пропало? Используйте мой код, в нем все работает, если вносите свои изменения, зачем ко мне претензии?
(19) НИКАКИХ претензий! боже упаси, сорри если мои слова воспринялись как претензии.
если посмотреть выше на список процедур (Запрос номенклатурного справочника производителя) то там нет такой строки "xmlns:oref="http://fsrar.ru/WEGAIS/ClientRef""
вот потому у меня ее и нету :)
а использую я ваш код это однозначно, все правки которые я делал в начале я убрал.
единственно пришлось таки поменять адрес на /opt/in/QueryPartner
потому что он видимо изменился со дня публикации...
добавил эту строку...
итоговый код запроса, а ошибка таже..
(17) rougudz, Прошу прощения, уже вижу, что запрос формировался по продукции, не заметил сразу, этой строки и не должно быть в запросе. Значит еще где-то ошибка.
(17) rougudz, В Вашем варианте в HTTP-заголовке для POST нет обязательных полей:
Content-Length
Content-Type (обязательно указывать поле boundary)
Возьмите мой код целиком, и все заработает! Скачайте функции глобального модуля, и вставьте в свой глобальный модуль, ничего не меняя в низкоуровневых функциях.
Прикрутил функции... работают.
Но по некоторым производителям при попытке забрать ответ на запрос с их продукцией, 1С-ина вылетает и при этом сохраняется пустой файл *.qry в папке КаталогИБ\queries\ Не знаете из-за чего это может быть?
(29) dm1860, увы, уже знаю. 1С вылетает при попытке передать/считать строку в COM-объект больше приблизительно 100 Кб, а также при работе со строками неограниченной длины в базе больше 100Кб. Вылетает в крэш. Пришлось поправить функции, сделать все таки загрузку из файлов, разрезать строку на кусочки по 80Кб при сохранении, использовать другой COM-объект для записи/считывания данных в кодировке UTF. Исправленные функции и модули сейчас выложу.
(31) victuan, ничего подобного, я без проблем загружаю файлы 11-12 Мб (справочники продукции) - без всякого CURL. Просто нужны прямые руки:) Скачайте глобальный модуль - и убедитесь.
Игорь, можно вопрос по поводу подтверждение акта разногласия
- мне через УТМ пришло два уведомления: первое что акт принят и второе что накладная проведена
а где же подтверждение от поставщика, что он согласен на уменьшение количества согласно акта?
как у вас реализовано?????
спасибо
(33) ya.vladi.mir, По поводу подтверждения сам еще не в курсе, нигде не нашел такой информации. 2..12.2015 будет семинар в москве по ЕГАИС, там надеюсь получить ответ на этот вопрос. Пока решили просто отклонять полностью накладную, и получать переделанную от поставщика.
(38) sf002, Нигде, максимум что Вы можете получить - это диапазоны серийных номеров марок, которыми маркирована продукция (это маленькие коды DataMatrix) для всей выпущенной партии производителя. Согласно официальной схеме, они должны быть включены в справку А ЕГАИС, но по факту ни в одной полученной справке я их не видел. Но это код марок, а не штрихкод PDF-417. Так что придется штрихкодировать каждую бутылку как при получении, так и при отгрузке.
(39) штриховать придется рознице или опту? я так понял что оптовик отправляет только то что получил в приходной накладной. и идентифицировать бутылку никак нельзя. в табличной части там только рег.номер справки А + рег.номер справки Б + код ЕГАИС бутылки + код ЕГАИС производителя.
это значит штрихкодированием будет заниматься только розница? ведь только они должны печатать спец.чек и отпускать товар по 2-м кодам EAN(свой) и PDF417(с акц.марки). то есть оптовке не нужно ничего штрихкодировать? в справке А есть диапазоны марок и оптовик по приходу проверяет на соответствие каждой бутылки - этой справке А. и также при отгрузке указывает конкретную справку А и справку Б.
(40) sf002, как в оптовой торговле без кодирования, как партии товаров различать, которые поступили от производителя/поставщика? Или держать их на разных полках? Предположим, мы от фонаря отгрузили в розницу бутылку водки из другой партии, при продаже информация о бутылке поступит в ЕГАИС, а там сведения, что эта бутылка продана ИП Пупкину. Значит в этом магазине торгуют контрафактом!
как в оптовой торговле без кодирования, как партии товаров различать, которые поступили от производителя/поставщика?
можно обклеить ящики текстовой информацией о партии: (номер партии, диапазон марок), затем при отгрузке в розницу - подбирать по этим 2-м параметрам. а номера регистрации справок А и Б брать из номера партии. конечно если обклеить ящики/бутылки штрихкодами - то все будет быстрее. меня просто интересует алгоритм. я верно прикинул?
сам отвечу.
получается оптовик отправляет данные в розницу лишь диапазоном марок (указанный в справке А) - все как раньше на бумажках
розница отпускает продукцию считанную по PDF417 (наименование, код ЕГАИС, крепость, емкость, производитель, дата розлива) с точностью до конкретного номера марки считанного с DataMatrix.
зачем тогда обязательная маркировка EAN? или бывают повторения в комбинации PDF417+DataMatrix?
(41) sf002,
> зачем тогда обязательная маркировка EAN? или бывают повторения в комбинации PDF417+DataMatrix?
Так в розничных учетных системах нет возможности идентификации товара по алкогольному штрихкоду. Во первых, в существующих учетных системах нет информации о коде ЕГАИС номенклатуры конкретного товара. Во вторых, не так то просто извлечь код товара из штрихкода, он там зашифрован в 36-разрядной системе. В третьих, один и тот же товар разных производителей имеет разный штрих-код, а это неудобно при назначении дисконта или наценки на конкретный товар.
Скачал все ваши обработки,заточил под себя все отлично, а вот с обработкой "Выгрузка расходной накладной в ЕГАИС", затык, отладил все ошибки в наших данных, и теперь зашел в тупик при отправке выдает одну и ту же "обезличенную" ошибку.
<A><error>org.xml.sax.SAXParseException; cvc-pattern-valid: Value '' is not facet-valid with respect to pattern '\S+(.*\S+)*' for type 'NoEmptyString50'.</error><ver>2</ver></A>
А какое именно поле пустое не могу понять уже все поля в готовом файлике xml запроса проверил на 10 рядов + добавил транспортный раздел. Так же по схеме попытался найти какие поля типа "NoEmptyString50" там судя по схеме их всего 3 шт это "NUMBER" (номер ТТН), "Pack_ID" (упаковка), "Party" (партия), все эти поля еще раз перепроверил, все заполнены. Подскажите пожалуйста в каком направлении копать.
(46) ital, Это поля адреса производителя/поставщика. Если адрес не соответствует требованиям МНС, в файле выгрузки появляются пустые поля (город, код страны, улица и т.д.), которые должны содержать как минимум один символ, как максимум 50. Я для себя решил эту проблему тем, что завел в карточке контрагента все дополнительные поля, как они есть в схеме ЕГАИС (все части адреса отдельно, плюс поле description, плюс полное и краткое наименование ЕГАИС).
(48) Novicad, Добавил обработку выгрузки акта постановки на баланс, и обработку штрихкодирования прихода по накладной. Выложил готовую и протестированную конфигурацию для платформы 1С 7.7.
Функция loadxml() объекта Msxml.DOMDocument крэшится при попытке загрузить из строки очень большой длины (к примеру ответ на запрос справочника алкогольной продукции производителя по его ИНН). Как вы обошли эту проблему?
(51) сами создаете себе трудности, чтобы потом их успешно преодолевать? даю наводку ;) раз уж используете MSXML, то вовсе нет нужды гонять данные через текстовую строку туда-сюда responsetext -> loadxml()
когда есть ResponseXML
(52) Palmer1976, Я вообще то в курсе, как работает MSXML, учить меня не надо. Вы спросили, как решить проблему обмена длинными строками в 1С - я вам объяснил. Или чего хотели?
(52) Palmer1976, У меня все файлы ответов хранятся на диске, чтобы всегда можно было посмотреть ответ/список ответов в карточке запроса, для последующей обработки. Чтобы с диска файлы считывать тоже ResponseXML предлагаете?
Что имеется ввиду? Идентификация номенклатуры и контрагента производится по уникальному идентификатору ЕГАИС
я спрашивал про первичное сопоставление, например, получили номенклатуру поставщика из ЕГАИС, естественно надо сопоставить со своей, вот эта функция реализована?
(58) beard1, Конечно, в обработке загрузки номенклатуры можно сопоставить загруженную номенклатуру со своей вручную, если элемент не найден в справочнике либо по коду ЕГАИС, либо по наименованию.
Еще один момент... акт постановки на баланс, (в который сканируются марки) создает xml более 600 kb (около 8 тысяч марок в одном документе) и при попытке отправки в ЕГАИС вашими функциями завершает работу 1С... :( с такой проблемой не боролись?
(60) dm1860, В теме уже отвечал (51) - если передавать во внешний COM-объект очень длинные строки - 1С вылетает по ошибке. Сохраняйте строку в файл и из неё загружайте.