Интеграция библиотеки МДЛП в конфигурацию УНФ 1.6.
Доброго времени суток!
В соответствии с Федеральный законом от 27.12.2019 N 462-ФЗ "О внесении изменений в Федеральный закон "Об обращении лекарственных средств" и Федеральный закон "О внесении изменений в Федеральный закон "Об обращении лекарственных средств" обязательная маркировка лекарственных препаратов, перенесена с 1 января 2020 года на 1 июля 2020 года.
В связи с этим, считаю, что данная статья будет актуальна и полезна.
В этой статье я поделюсь опытом интеграции “Библиотеки интеграции МДЛП 1.1.2.7 ” с типовой конфигурацией “Управление нашей фирмой, редакция 1.6 (1.6.18.168)”.
В статье я не буду рассказывать о том, как зарегистрироваться в честном знаке, как отражать операции приема, вывода лекарственных препаратов, и прочих вещей, о которых можно с без проблем узнать на сайте честного знака.
Я расскажу непосредственно об интеграции блока МДЛП, на реальном примере, т.к. сам не смог найти подробной статьи. Также расскажу о проблемах, с которыми можно столкнуться и о способах их решения. Данная статья будет полезна не только для рассмотренной конфигурации, но и для любой другой, даже не типовой, в которых не реализован блок МДЛП.
Описание задачи: Клиент – аптека, основной вид деятельности розничная продажа лекарственных препаратов. Учет несколько лет ведется в конфигурации “Управление нашей фирмой”. Разработчики типовых конфигураций не планируют внедрять блок МДЛП в ряд конфигураций, в том числе и в эту. Клиенту было предложено интегрировать библиотек МДЛП в текущую конфигурацию, без переходов и обменов, и продолжать вести учет в ней.
О том, что такое “Библиотека интеграции с МДЛП” и ее основных возможностях, можно узнать из этой статьи:
//infostart.ru/journal/news/mir-1s/oznakomitelnaya-versiya-1s-biblioteki-integratsii-s-mdlp_713326/.
Чтобы ее загрузить, необходимо быть зарегистрированном на портале 1С, и иметь действующий договорит информационно-технологического сопровождения. Необходимо перейти в раздел “1С: Обновление программ” далее слева перейти по вкладке “Скачать обновления программ” и найти нужную нам библиотеку в разделе “Стандартные библиотеки”. В папке шаблонов конфигураций нас интересует файл 1Cv8.cf, именно с ним мы будем работать.
Открываем нашу рабочую базу в режиме конфигуратора, далее переходим на вкладку конфигурация – сравнить и объединить с конфигурацией из файла…, и из папки с шаблонами выбираем наш файл 1Cv8.cf, соглашаемся с постановкой на поддержку.
В окне сравнения конфигураций. Выбираем отметить по подсистемам файла. Выбираем две обязательные подсистемы “базовая функциональность” и “транспорт API”, остальные выбираем по мере необходимости. В нашем случае, хватит этих двух.
После этого в окне сравнения выбираем действия – установить режим для всех, взять из файла.
Объекты библиотеки перенесены, далее переходим к настройке перенесенных объектов библиотеки.
Определяемый тип ВладелецПрисоединенныхФайлов – в состав типа нужно добавить все документы библиотеки.
Определяемый тип МестоХраненияФункциональныхОпций - в состав типа добавитьконстанты ВестиСведенияДляМониторингаДвиженияЛекарственныхПрепаратов и ИспользоватьАвтоматическуюОтправкуПолучениеДанныхГИСМ.
Определяемый тип ПодписанныйОбъект - в состав типа добавить СправочникСсылка.МДЛППрисоединенныеФайлы.
Определяемый тип ПрисоединенныйФайл - в состав типа добавить СправочникСсылка.МДЛППрисоединенныеФайлы.
Определяемый тип ПрисоединенныйФайлОбъект - в состав типа добавить СправочникОбъект.МДЛППрисоединенныеФайлы.
Общий реквизит КонтрагентГИСМ – в него помещаются ссылки на контрагентов , в нашем случае это СправочникСсылка.Контрагенты.
Общий реквизит ОбъектМестаДеятельностиМДЛП - используется для хранения связки между идентификатором субъекта обращения МДЛП и лицензируемым местом деятельности. Необходимо определить составной тип - для собственной организации и сторонних контрагентов. В нашем случае это СправочникСсылка.СтруктурныеЕдиницы, СправочникСсылка.СтруктурныеЕдиницыМП.
Общий реквизит Номенклатура – содержит в себе список продаваемых товаров. В нашем случае это СправочникСсылка.Номенклатура.
Общий реквизит Характеристика – в нем содержатся характеристики продаваемых товаров. В нашем случае это СправочникСсылка.ХарактеристикиНоменклатуры.
Общий реквизит СерияНоменклатуры - справочник, содержащий перечень производственных серий товаров предприятия. В нашем случае это СправочникСсылка.СерийныеНомера, СправочникСсылка.ПартииНоменклатуры.
Общий реквизит ОрганизацияКонтрагентМДЛП - используется для хранения связки между идентификатором субъекта обращения МДЛП и контрагентом (или собственной организацией). Необходимо определить составной тип - для собственной организации и сторонних контрагентов.В нашем случае это СправочникСсылка.Организации, СправочникСсылка.Контрагенты.
Общий реквизит ОснованиеУведомленияОПриемкеМДЛП - используется для хранения ссылки на основание документа уведомления. В нашем случае это ДокументСсылка.ПриходнаяНакладная.
Общий реквизит ОснованиеУведомленияОПриемкеМДЛПОбъект - используется для вызова обработчика события ПриЗаписи для расчета статуса оформления документов конфигурации-приемника. В нашем случае это ДокументОбъект.УведомлениеОПриемкеМДЛП.
Общий реквизит Упаковка - используется для хранения ссылки на упаковку в документах библиотеки. В нашем случае это СправочникСсылка.КлассификаторЕдиницИзмерения, СправочникСсылка.ЕдиницыИзмерения.
Общий реквизит ХарактеристикаНоменклатуры - используется для хранения ссылки на характеристику номенклатуры в документах библиотеки. В нашем случае это СправочникСсылка.ХарактеристикиНоменклатуры.
Далее в состав плана обмена ОбновлениеИнформационнойБазы добавляем все объекты библиотеки.
В общий модуль ОбщегоНазначенияКлиентПереопределяемый , в процедуру
ПослеНачалаРаботыСистемы() пишем код:
// ИнтеграцияМДЛП+
ИнтеграцияМДЛПКлиент.ПодключитьОбработчикВыполненияОбменаНаКлиентеПоРасписанию();
// Конец ИнтеграцияМДЛП-
В общий модуль ПодсистемыКонфигурацииПереопределяемый, в процедуру
ПриДобавленииПодсистем() пишем код:
// ИнтеграцияМДЛП+
МодулиПодсистем.Добавить("ОбновлениеИнформационнойБазыМДЛП");
// Конец ИнтеграцияМДЛП-
В общий модуль РаботаСФайламиПереопределяемый, в процедуру
ПриОпределенииНастроекФайлов () пишем код:
// ИнтеграцияМДЛП+
ИнтеграцияМДЛП.ПриОпределенииНастроекФайлов(Настройки);
// Конец ИнтеграцияМДЛП-
В процедуру ПриОпределенииСправочниковХраненияФайлов() пишем код:
// ИнтеграцияМДЛП+
ИнтеграцияМДЛП.ПриОпределенииСправочниковХраненияФайлов(ТипВладелецФайла, ИменаСправочников);
// Конец ИнтеграцияМДЛП-
На этом настройки интеграции на основе официальной инструкции окончены)))
Дополнительно, клиент попросил, вести учет серийных номеров упаковок, и сроков годности, этот вопрос решается регистром накопления с соответствующими измерениями и обеспечения движений по ним основными товарных документов.
При этом, напоминаю, что наш клиент занимается продажей в розницу лекарственных препаратов, отсюда и напрашивается вопрос, а как же доработка РМК? Неужели такой интеграции хватит? Ответ: НЕТ.
Давайте разберем, как происходит отправка сведений в честный знак о продаже маркированных препаратов в розницу.
Отправка сведений, происходит по следующей схеме, в РМК сканируется DataMatrix код, оформляется продажа, и за отправку сведений в честный знак, отвечает непосредственно ОФД.
Но как ОФД должен понять, что это маркируемый товар?
А определяется это заполнением дополнительных тегов чека, подробнее можно прочитать по ссылке ниже
https://честныйзнак.рф/upload/iblock/644/Format-zapisi-dannykh-o-vybytii-LP-v-FFD-v2_6.pdf
Следовательно, нам надо дать программе понять, что перед ней маркируемый товар и зависимости от этого, заполнять дополнительные теги чека.
Для этого была придумана общая форма ввода номеров упаковок, которая называется по нажатию иконки в табличной части товаров.
Принцип такой, если номер упаковки заполнен, значит это маркируемый препарат и для этой строки товаров необходимо заполнить дополнительные реквизиты чека.
Для хранения серийный номеров для строки документа, нам необходимо добавить табличную часть _НомераУпаковокМДЛП с аналогичными реквизитами общей формы.
В документ чек ккм добавляем булев реквизит “_ЕстьМаркируемаяПродукцияМДЛП” а в процедуре ПередЗаписью() чека ККМ пишем следующий код:
// ИнтеграцияМДЛП +
// это необходимо чтобы при пробитии чека определять, что в списке есть маркированные препараты и нужно заполнить дополнительные теги чека, связанные с МДЛП
Если Не отказ и _НомераУпаковокМДЛП.Количество() > 0 Тогда
_ЕстьМаркируемаяПродукцияМДЛП = Истина;
КонецЕсли;
// ИнтеграцияМДЛП –
Далее в модуле менеджера документа чек ККМ, в процедуре ПодготовитьДанныеДляПробитияЧека() в конце, пишем код:
// ИнтеграцияМДЛП +
// заполнение допольнительного тега чека в целях МДЛП
Если ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.ЧекККМ") Тогда
Если ДокументСсылка._ЕстьМаркируемаяПродукцияМДЛП = Истина Тогда
ИдентификаторМестаДеятельности = ИнтеграцияМДЛП.ПолучитьИдентификаторМестадеятельностиДляПередачиЧерезОФД(ДокументСсылка);
ОбщиеПараметры.ДополнительныйРеквизитПользователя.Наименование = "mdlp";
ОбщиеПараметры.ДополнительныйРеквизитПользователя.Значение = "sid" + ИдентификаторМестаДеятельности + "&";
КонецЕсли;
КонецЕсли;
// ИнтеграцияМДЛП –
Функция общего модуля:
// возвращает идентификатор места деятельности для заполнения дополнительного реквизита чека требуемого при продаже маркированных препаратов
Функция ПолучитьИдентификаторМестадеятельностиДляПередачиЧерезОФД(ЧекККМСсылка) Экспорт
ПризнакИспользоватьМестаДеятельностиОрганизаций = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЧекККМТовары.Ссылка.Организация КАК Организация,
| ЧекККМТовары.Ссылка.СтруктурнаяЕдиница КАК Склад
|ПОМЕСТИТЬ тчТовары
|ИЗ
| Документ.ЧекККМ.Запасы КАК ЧекККМТовары
|ГДЕ
| ЧекККМТовары.Ссылка = &Ссылка
| И ЧекККМТовары.ор_СтатусЗаполненияУпаковок <> 0
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| тчТовары.Организация КАК Организация,
| тчТовары.Склад КАК Склад,
| ЕСТЬNULL(СубъектыОбращенияМДЛП.МестоДеятельности, ЗНАЧЕНИЕ(Справочник.МестаДеятельностиМДЛП.ПустаяСсылка)) КАК МестоДеятельности
|ПОМЕСТИТЬ втТаблица
|ИЗ
| тчТовары КАК тчТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СубъектыОбращенияМДЛП КАК СубъектыОбращенияМДЛП
| ПО тчТовары.Организация = СубъектыОбращенияМДЛП.ОрганизацияКонтрагент
| И (СубъектыОбращенияМДЛП.СобственнаяОрганизация)
//| И тчТовары.Склад = СубъектыОбращенияМДЛП.ОбъектМестаДеятельности
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втТаблица.МестоДеятельности.Идентификатор КАК Идентификатор
|ИЗ
| втТаблица КАК втТаблица";
Запрос.УстановитьПараметр("Ссылка", ЧекККМСсылка);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат "";
Иначе
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Идентификатор;
КонецЕсли;
КонецФункции
А в процедуру ДополнитьТоварамиПараметрыПриПробитииЧека() следующий код:
// ИнтеграцияМДЛП +
// если заполнены номера упаковок, заполняются теги чека в целях МДЛП
Если ТипЗнч(ДокументОбъект.Ссылка) = Тип("ДокументСсылка.ЧекККМ") Тогда
Если СтрокаТЧ.ор_СтатусЗаполненияУпаковок <> 0 Тогда
Отбор = Новый Структура();
Отбор.Вставить("ИдентификаторСтроки", СтрокаТЧ.ор_ИдентификаторСтроки);
НайденноеЗначение = ДокументОбъект.Ссылка._НомераУпаковокМДЛП.НайтиСтроки(Отбор);
Если НайденноеЗначение.Количество() > 0 Тогда
СтрокаПозицииЧека.ДанныеКодаТоварнойНоменклатуры.ТипМаркировки = Перечисления.ТипыМаркировкиККТ.ЛекарственныеПрепараты;
СтрокаПозицииЧека.ДанныеКодаТоварнойНоменклатуры.ГлобальныйИдентификаторТорговойЕдиницы = Лев(НайденноеЗначение[0].НомерКИЗ,14);
СтрокаПозицииЧека.ДанныеКодаТоварнойНоменклатуры.СерийныйНомер = Сред(НайденноеЗначение[0].НомерКИЗ,15);
СтрокаПозицииЧека.ДополнительныйРеквизит = "mdlp";
КонецЕсли;
КонецЕсли;
// ИнтеграцияМДЛП -
Таким образом, был реализован блок МДЛП в типовой конфигурации “Управление нашей фирмой, редакция 1.6 (1.6.18.168)”. Поставленные задачи были выполнены, интеграция прошла успешно.