При импорте маркированной обуви из стран-участниц ЕАЭС (в частности, Республики Беларусь) пользователи программы 1С:Розница 2.3 часто сталкиваются со следующей проблемой. При попытке оформить документ ввода в оборот со способом «Ввоз из стран ЕАЭС» (внутренний идентификатор в системе — TRANSBORDER) программный комплекс 1С выдает ошибку несоответствия типа эмиссии (emissionType). При проверке кодов маркировки через API Честного Знака выясняется, что система возвращает статус FOREIGN (импорт), а не ожидаемый 1С статус CROSSBORDER.
Попытка переключить документ в режим обычного импорта (FOREIGN) заставляет программу требовать номера грузовых таможенных деклараций (ГТД). Однако при торговле внутри ЕАЭС таможенное оформление не производится, и никаких номеров ГТД у импортера нет по определению. В результате процесс оформления маркированного товара полностью блокируется.
В данной статье мы подробно разберем, почему возникает этот технический конфликт, как его трактует регулятор (ЦРПТ) и как исправить эту ошибку в 1С с помощью создания безопасного расширения конфигурации.
---
Для понимания природы ошибки проанализируем, какие типы эмиссии кодов маркировки (КМ) существуют в ГИС МТ («Честный Знак»):
TRANSBORDER).На ранних этапах интеграции национальных систем маркировки (в частности, российской ГИС МТ и белорусской «Электронный знак») коды маркировки, эмитированные белорусскими производителями для экспорта в РФ, ошибочно регистрировались в единой системе со статусом FOREIGN.
В типовых конфигурациях 1С, использующих Библиотеку интеграции с ИС МП (БИСМП), был заложен жесткий контроль: если пользователь выбирает операцию «Ввоз из ЕАЭС», система сверяет полученный по API тип эмиссии КМ. Обнаружив значение FOREIGN вместо ожидаемого CROSSBORDER, встроенный модуль проверки прерывает выполнение операции. Официальная служба поддержки ЦРПТ при этом подтверждает, что коды, эмитированные со статусом FOREIGN, юридически разрешено вводить в оборот как TRANSBORDER, однако логика 1С не позволяла провести документ без доработки кода.
---
Для обхода этой проверки разработчики часто прибегают к механизму расширения конфигурации. Рассмотрим вариант кода, предложенный в сообщении 6 на форуме. В нем выполняется перехват процедур проверки в общем модуле ШтрихкодированиеИСМПСлужебный с помощью аннотации &Вместо:
&Вместо("ПроверитьНаОшибкиСтрокиДерева")
Процедура Осипов_ПроверитьНаОшибкиСтрокиДерева(СтрокиДерева, ПравилаПроверкиНаОшибки, ПараметрыСканирования, ДанныеКодовМаркировок, ЕстьОшибки)
// Полностью скопированный код типовой процедуры с изменением одного условия:
...
Если ПравилаПроверкиНаОшибки.Свойство("КонтрольСпособаВводаВОборот") Тогда
Если ЗначениеЗаполнено(ПараметрыСканирования.ДопустимыйСпособВводаВОборот)
И СтрокаДерева.Статус <> Перечисления.СтатусыКодовМаркировкиИСМП.Неопределен
И СтрокаДерева.СпособВводаВОборот <> ПараметрыСканирования.ДопустимыйСпособВводаВОборот
// Исключаем контроль для трансграничной торговли, если пришел статус "Импорт"
И НЕ (СтрокаДерева.ДопустимыйСпособВводаВОборот = Перечисления.СпособыВводаВОборотСУЗ.ТрансграничнаяТорговля
И СтрокаДерева.СпособВводаВОборот = Перечисления.СпособыВводаВОборотСУЗ.Импорт)
Тогда
ЕстьОшибки = Истина;
ПравилаПроверкиНаОшибки.ContorlСпособаВводаВОборот.Добавить(СтрокаДерева);
КонецЕсли;
КонецЕсли;
...
КонецПроцедуры
В чем заключается критическая опасность такого подхода?
В сообщении 7 на форуме справедливо отмечается, что использование директивы &Вместо («InsteadOf») без вызова метода ПродолжитьВызов() является грубой ошибкой разработки. Полное замещение кода оригинальной процедуры приводит к следующим негативным последствиям:
---
Для того чтобы обойти проверку соответствия статусов и при этом не нарушить стабильность системы при будущих обновлениях, разработаем правильную архитектуру расширения. Наша задача — позволить стандартному механизму 1С выполнить все проверки в полном объеме, а затем точечно перехватить коллекцию обнаруженных ошибок и удалить из нее ложные предупреждения, вызванные несоответствием TRANSBORDER и FOREIGN.
Реализуем этот подход в расширении для общего модуля ШтрихкодированиеИСМПСлужебный:
&Вместо("ПроверитьНаОшибкиСтрокиДерева")
Процедура ИмяМетода_ПроверитьНаОшибкиСтрокиДерева(СтрокиДерева, ПравилаПроверкиНаОшибки, ПараметрыСканирования, ДанныеКодовМаркировок, ЕстьОшибки)
// Шаг 1. Передаем управление стандартному коду 1С
ПродолжитьВызов(СтрокиДерева, ПравилаПроверкиНаОшибки, ПараметрыСканирования, ДанныеКодовМаркировок, ЕстьОшибки);
// Шаг 2. Анализируем результаты проверки. Если обнаружены ошибки контроля способа ввода в оборот
Если ЕстьОшибки И ПравилаПроверкиНаОшибки.Свойство("КонтрольСпособаВводаВОборот") Тогда
КоллекцияОшибок = ПравилаПроверкиНаОшибки.КонтрольСпособаВводаВОборот;
ЭлементыДляУдаления = Новый Массив;
// Перебираем зафиксированные системой ошибки
Для Каждого СтрокаОшибки Из КоллекцияОшибок Цикл
// Если программа ругается на то, что ожидается "Трансграничная торговля",
// а Честный Знак прислал "Импорт" (FOREIGN), мы признаем эту ошибку некритичной
Если СтрокаОшибки.ДопустимыйСпособВводаВОборот = Перечисления.СпособыВводаВОборотСУЗ.ТрансграничнаяТорговля
И СтрокаОшибки.СпособВводаВОборот = Перечисления.СпособыВводаВОборотСУЗ.Импорт Тогда
ЭлементыДляУдаления.Добавить(СтрокаОшибки);
КонецЕсли;
КонецЦикла;
// Очищаем коллекцию от ложных ошибок
Для Каждого Элемент Из ЭлементыДляУдаления Цикл
КоллекцияОшибок.Удалить(Элемент);
КонецЦикла;
// Сбрасываем флаг наличия ошибок, если других нарушений не зафиксировано
Если КоллекцияОшибок.Количество() = 0 Тогда
ЕстьОшибки = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&Вместо("ПроверитьНаОшибкиОбработанныеШтрихкоды")
Процедура ИмяМетода_ПроверитьНаОшибкиОбработанныеШтрихкоды(ДанныеПоШтрихкодам, ПравилаПроверкиНаОшибки, ПараметрыСканирования, ЕстьОшибки)
// Шаг 1. Запускаем стандартную валидацию
ПродолжитьВызов(ДанныеПоШтрихкодам, ПравилаПроверкиНаОшибки, ПараметрыСканирования, ЕстьОшибки);
// Шаг 2. Корректируем ошибки контроля способа ввода в оборот для обработанных КМ
Если ЕстьОшибки И ПравилаПроверкиНаОшибки.Свойство("КонтрольСпособаВводаВОборот") Тогда
КоллекцияОшибок = ПравилаПроверкиНаОшибки.КонтрольСпособаВводаВОборот;
ЭлементыДляУдаления = Новый Массив;
Для Каждого КлючЗначение Из КоллекцияОшибок Цикл
ДанныеШтрихкода = КлючЗначение.Значение;
Если ПараметрыСканирования.ДопустимыйСпособВводаВОборот = Перечисления.СпособыВводаВОборотСУЗ.ТрансграничнаяТорговля
И ДанныеШтрихкода.СпособВводаВОборот = Перечисления.СпособыВводаВОборотСУЗ.Импорт Тогда
ЭлементыДляУдаления.Добавить(КлючЗначение);
КонецЕсли;
КонецЦикла;
Для Каждого Элемент Из ЭлементыДляУдаления Цикл
КоллекцияОшибок.Удалить(Элемент);
КонецЦикла;
Если КоллекцияОшибок.Количество() = 0 Тогда
ЕстьОшибки = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проанализируем преимущества представленного алгоритма. Мы используем вызов ПродолжитьВызов() в самом начале процедур. Это гарантирует, что при обновлении 1С весь новый функционал отработает штатно. Наш код вмешивается в процесс только на этапе постобработки результатов: мы "сглаживаем" строгость контроля программы исключительно для конкретной ситуации нестыковки импорта из ЕАЭС. Во всех остальных случаях (например, при попытке ввести локальный код под видом импортного) 1С отработает стандартно и заблокирует операцию.
---
Если вы сталкиваетесь с подобной ошибкой в актуальных версиях программных продуктов 1С, перед внесением изменений в код программного продукта обязательно проанализируйте изменения в законодательстве и техническом регламенте межоператорского обмена.
На сегодняшний день интеграция ГИС МТ («Честный Знак») и национального оператора Республики Беларусь «Электронный знак» (РУП «Белбланкавыд») полностью завершена. Процесс импорта обуви выглядит следующим образом:
Использование современных механизмов документооборота и актуальных версий БИСМП позволяет полностью избежать необходимости программных доработок и исключает возникновение ошибок несоответствия типов эмиссии.