Обновление базы для маркировки ЛС
Материал из wiki.standart-n.ru
Версия от 18:34, 18 марта 2021; Agk (обсуждение | вклад)
Содержание
- 1 Заменить версию Менеджера
- 2 Выполняем скрипт
- 3 Поправить VW_DOCS и VW_DOC_DETAIL_ACTIVE
- 4 Дополнительно обновить процедуры
- 5 Проверить, что в "Менеджере групп" группа "ЖНВЛС" вверху списка по группам
- 6 Настроить сетки в активных документах и журнале документов
- 7 ТМС Проведение с авторасходом (пока не тестировалось, не накатывать пока)
- 8 конвертор
- 9 возможные проблемы
- 10 Добавление предприятия -10 (МДЛП)
- 11 Фильтр "Документы, отправленные в МДЛП"
- 12 Старая схема отправки маркированной накладной по почте на примере подпрограммы "Переотправить документ"
- 13 Настройка под работу с УСН (2 предприятия)
- 14 Подключение регистратора выбытия (РВ, регистратор выбытия)
- 15 запрет на снятие группы МДЛП для остатков (не обязательно ставить)
- 16 Инструкции
Заменить версию Менеджера
Заменить ManagerXP2.exe на версию 274_47_8 от июля 2020 г. или более новую.
НЕ ОБНОВЛЯТЬ ТРИГГЕРЫ, ЕСЛИ 2 ПРЕДПРИЯТИЯ!!!
Выполняем скрипт
SET TERM ^ ; create or alter procedure PR_COPY_MARK_DETAIL ( DOC_ID_IN integer, DOC_ID_OUT integer) as begin INSERT INTO MARK_DETAIL (DOC_ID, PART_ID, MARK_DATA, QUANT, COMMITDATE, INSERTDT, DOCNUM, DOC_DATE, DDA_ID, PLACE_ID_IN, PLACE_ID_OUT, GTIN, SERIES_NUMBER, EXPIRATION_DATE, ACTIVEPOS, SERIA, KIZ, SSCC, ACCEPTED) select :DOC_ID_OUT, PART_ID, MARK_DATA, -QUANT, COMMITDATE, INSERTDT, DOCNUM, DOC_DATE,(select first 1 id from doc_detail_active dd where dd.doc_id=:doc_id_out and dd.part_id=md.part_id), PLACE_ID_IN, PLACE_ID_OUT, GTIN, SERIES_NUMBER, EXPIRATION_DATE, 2, SERIA, KIZ, SSCC, ACCEPTED from MARK_DETAIL md where doc_id = :DOC_ID_IN ; end^ SET TERM ; ^ SET TERM ^ ; create or alter procedure PR_DOC_CANCEL ( DOC_ID type of DM_ID, DOC_CANCEL type of DM_STATUS, AUDIT_ID type of DM_ID, OWNER_ID type of DM_ID) returns ( CANCEL_RESULT integer) as declare variable DELETED_DOC_ID bigint; declare variable DOC_STATUS type of DM_STATUS; declare variable CONTRACT_ID DM_ID; begin /* cancel_result: 0 - удаление проведенного документа 1 - удаление рабочего/отложенного документа 2 - откладываем рабочий документ 3 - отложенный документ делаем рабочим */ select STATUS, CONTRACT_ID, DELETED_DOC_ID from DOCS where ID = :DOC_ID into :DOC_STATUS, :CONTRACT_ID, :DELETED_DOC_ID; if (DOC_STATUS = 1) then --если документ проведен begin delete from DOC_DETAIL where DOC_ID = :DOC_ID; update DOCS set STATUS = -1, COMMITSESSION_ID = :AUDIT_ID where ID = :DOC_ID; if (CONTRACT_ID <> 0) then begin execute procedure PR_CREDITCOMMIT(:CONTRACT_ID); end CANCEL_RESULT = 0; end else if (DOC_STATUS in (0, 2)) then --документ рабочий или отложенный if (DOC_CANCEL = 1) then --документ отменяем begin insert into DOCS_CANCELED (ID, PARENT_ID, DOC_TYPE, STATUS, AGENT_ID, DOCNUM, DOCDATE, CAPTION, RGUID, INSERTDT, POSTDT, AUDIT_ID, VNUM, VSHIFT, CREATER, OWNER, COMMITDATE, PACKET, DEVICE_NUM, SUMMA, SUMMA_O, SUM_NDSO, SUM_NDSR, CALCSUMMA, COMMENTS, SUMM1, SUMM2, SUMM3, SUMM4, CHECKDATA, COMMITSESSION_ID, SUM_DSC, CASHDATA, PRICE_TYPE, CURRENCY_ID, BASE_AGENT_ID, CONTRACT_ID, LINK_ID, DELETED_DOC_ID, OPLATA, DATE_OPL, MAKE_ID, DOC_PAY_DATE, BONUS, D$UUID, D$SRVUPDDT) select ID, PARENT_ID, DOC_TYPE, STATUS, AGENT_ID, DOCNUM, DOCDATE, CAPTION, RGUID, INSERTDT, POSTDT, AUDIT_ID, VNUM, VSHIFT, CREATER, OWNER, COMMITDATE, PACKET, DEVICE_NUM, SUMMA, SUMMA_O, SUM_NDSO, SUM_NDSR, CALCSUMMA, COMMENTS, SUMM1, SUMM2, SUMM3, SUMM4, CHECKDATA, COMMITSESSION_ID, SUM_DSC, CASHDATA, PRICE_TYPE, CURRENCY_ID, BASE_AGENT_ID, CONTRACT_ID, LINK_ID, DELETED_DOC_ID, OPLATA, DATE_OPL, MAKE_ID, DOC_PAY_DATE, BONUS, D$UUID, D$SRVUPDDT from DOCS where ID = :DOC_ID; insert into DOC_DETAIL_ACTIVE_CANCELED (ID, PARENT_ID, DOC_ID, PART_ID, PART_PARENT_ID, DOC_DETAIL_ID, PRICE, NAC, QUANT, DISCOUNT, SUMMA, SUMMA_O, DCARD, WARE_ID, PRICE_O, PRICE_Z, PRICE_R, BARCODE, BARCODE1, GODENDO, SERIA, NDS, SUM_NDSO, SUM_NDSR, SERT, DATESERT, KEMVSERT, SDSERT, REGN, NGTD, EDIZM, NAME_ID, IZG_ID, COUNTRY_ID, ORIG_CODE, ORIG_NAME_ID, ORIG_IZG_ID, ORIG_COUNTRY_ID, Z_ID, SKLAD_ID, SNAME, SIZG, SCOUNTRY, SORIG_NAME, SORIG_IZG, SORIG_COUNTRY, INSERTDT, INFO, KOEF, MOTHERPART_ID, DEP, BCODE_IZG, HUMAN_QUANT, SUM_DSC, CUSTOMDRAW, STATUS, PART_TYPE, BASE_AGENT_ID, GROUP_ID, PACKET, VPART_ID, GNVLS, MAKE_ID, MNN, ACCOMP_ID, MOTHERPART_UUID) select ID, PARENT_ID, DOC_ID, PART_ID, PART_PARENT_ID, DOC_DETAIL_ID, PRICE, NAC, QUANT, DISCOUNT, SUMMA, SUMMA_O, DCARD, WARE_ID, PRICE_O, PRICE_Z, PRICE_R, BARCODE, BARCODE1, GODENDO, SERIA, NDS, SUM_NDSO, SUM_NDSR, SERT, DATESERT, KEMVSERT, SDSERT, REGN, NGTD, EDIZM, NAME_ID, IZG_ID, COUNTRY_ID, ORIG_CODE, ORIG_NAME_ID, ORIG_IZG_ID, ORIG_COUNTRY_ID, Z_ID, SKLAD_ID, SNAME, SIZG, SCOUNTRY, SORIG_NAME, SORIG_IZG, SORIG_COUNTRY, INSERTDT, INFO, KOEF, MOTHERPART_ID, DEP, BCODE_IZG, HUMAN_QUANT, SUM_DSC, CUSTOMDRAW, STATUS, PART_TYPE, BASE_AGENT_ID, GROUP_ID, PACKET, VPART_ID, GNVLS, MAKE_ID, MNN, ACCOMP_ID, MOTHERPART_UUID from DOC_DETAIL_ACTIVE where DOC_ID = :DOC_ID; delete from DOC_DETAIL_ACTIVE_MMBSH where DOC_ID = :DOC_ID; delete from DOC_DETAIL_ACTIVE where DOC_ID = :DOC_ID; delete from DOCS where ID = :DOC_ID; if (DELETED_DOC_ID > 0) then begin update DOCS set STATUS = 1, COMMITSESSION_ID = :AUDIT_ID where ID = :DELETED_DOC_ID; insert into DOC_DETAIL (PART_TYPE, PARENT_ID, DOC_ID, PART_ID, QUANT, DCARD, SUMMA, SUMMA_O, NAC, DISCOUNT, SUM_NDSO, SUM_NDSR, SUM_DSC) select (select PART_TYPE from PARTS where ID = DDD.PART_ID), PARENT_ID, :DELETED_DOC_ID, PART_ID, QUANT, DCARD, SUMMA, SUMMA_O, NAC, DISCOUNT, SUM_NDSO, SUM_NDSR, SUM_DSC from DOC_DETAIL_DELETED DDD where DOC_ID = :DELETED_DOC_ID; delete from DOC_DETAIL_DELETED where DOC_ID = :DELETED_DOC_ID; end CANCEL_RESULT = 1; end else if (DOC_CANCEL = 0) then --откладываем либо возвращаем документ if (DOC_STATUS = 0) then --откладываем рабочий документ begin update DOCS set STATUS = 2, COMMITSESSION_ID = :AUDIT_ID where ID = :DOC_ID; CANCEL_RESULT = 2; end else --возвращаем отложенный документ begin update DOCS set STATUS = 0, AUDIT_ID = :AUDIT_ID, OWNER = :OWNER_ID where ID = :DOC_ID; CANCEL_RESULT = 3; end else exception EX_WRONGDOCSTATUS; --передали неправильный статус execute procedure PR_UPDBLOCKINFO_BY_DOC(:DOC_ID, :DOC_STATUS); execute procedure PR_DOEVENT('EV_DOCCANCEL'); --Удаляме данные из mark_detail при отмене документа --AVO теряем данные delete from mark_detail where doc_id = :doc_id; suspend; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER TRIGGER DOCS_CANCELED_BI_DISTR FOR DOCS_CANCELED ACTIVE BEFORE INSERT POSITION 0 AS begin if (new.d$uuid is null) then begin new.d$uuid=UUID_TO_CHAR(GEN_UUID()); new.d$srvupddt='2000-01-01'; -- update or insert into g$distribute (TABLENAME,UUID,SOPER,FROM_PROFILE_ID) values ('DOCS_CANCELED',new.d$uuid,0,null) matching (TABLENAME,UUID); end end ^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER TRIGGER AGENTS_CHANGE_MARK_TYPE_BU FOR AGENTS ACTIVE AFTER UPDATE POSITION 0 AS begin update doc_detail_active dd set dd.accepttype=new.mark_type where dd.doc_id in (select d.id from docs d left join doc_detail_active dd1 on dd1.doc_id=d.id where d.agent_id=new.id); end ^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER TRIGGER DOC_DETAIL_ACTIVE_MARK_BI FOR DOC_DETAIL_ACTIVE ACTIVE BEFORE INSERT OR UPDATE POSITION 0 AS begin if (new.marking is null ) then new.marking=0; if (exists (select 1 from group_detail gd where gd.group_id=-43 and gd.grouptable='PARTS' and gd.grouptable_id=new.part_id)) then new.marking=1; --if (new.accepttype is null) then new.accepttype=(select a.mark_type from docs d join agents a on d.agent_id=a.id where d.id=new.doc_id); end ^ SET TERM ; ^ INSERT INTO PARAMS (PARENT_ID, PARAM_ID, PARAM_CAPTION, PARAM_TYPE, PARAM_VALUE, AUDIT_ID, IMAGEINDEX, STATUS, SORTING, PARAM_TYPE_DATA) VALUES (199, 'NEW_MARK_TWOFIRM', 'Разведение маркированного товара на два предприятия (Новый)', 14, '0', 1124, 0, 0, 99, 'FIXEDITEMS SHOWONLYVALUES RETURNNAME 0=Выключено 1=Включено'); update PARAMS set PARAM_VALUE='0' where PARAM_ID='MARK_TWOFIRM'; COMMIT WORK; SET SQL DIALECT 3; SET TERM ^ ; CREATE OR ALTER TRIGGER AIU_MARK_GROUP FOR GROUP_DETAIL ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS begin /*add avo 16/12/2020 and d.id>0*/ if ((new.grouptable='DOC_DETAIL_ACTIVE')) then begin if (new.group_id=-43) then begin --21/10/2020 смотрим на параметр и в зависимости от него снимаем/ставим предприятие и ставку НДС новую if (((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) and ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1)) then update doc_detail_active dd set dd.marking=1, dd.base_agent_id=-10, dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id desc ) where dd.id=new.grouptable_id; --03/09/2020 смотрим на параметр и в зависимости от него снимаем/ставим предприятие и ставку НДС новую else if ((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) then update doc_detail_active dd set dd.marking=1, dd.base_agent_id=-10 where dd.id=new.grouptable_id; --21/10/2020 смотрим на параметр и в зависимости от него снимаем/ставим ставку НДС новую else if ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1) then update doc_detail_active dd set dd.marking=1, dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id desc ) where dd.id=new.grouptable_id; else update doc_detail_active dd set dd.marking=1 where dd.id=new.grouptable_id and dd.marking<>1; end end if (new.grouptable='PARTS') then begin if (new.group_id=-43) then begin --21/10/2020 смотрим на параметр и в зависимости от него снимаем/ставим предприятие и ставку НДС новую if (((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) and ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1)) then update doc_detail_active dd set dd.marking=1, dd.base_agent_id=-10, dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id desc ) where dd.part_id=new.grouptable_id; --03/09/2020 смотрим на параметр и в зависимости от него снимаем/ставим предприятие и ставку НДС новую else if ((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) then update doc_detail_active dd set dd.marking=1, dd.base_agent_id=-10 where dd.part_id=new.grouptable_id; --21/10/2020 смотрим на параметр и в зависимости от него снимаем/ставим ставку НДС новую else if ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1) then update doc_detail_active dd set dd.marking=1, dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id desc ) where dd.part_id=new.grouptable_id; else update doc_detail_active dd set dd.marking=1 where dd.part_id=new.grouptable_id and dd.marking<>1; end end end ^ SET TERM ; ^ DROP TRIGGER GROUP_DETAIL_AIU0; DROP TRIGGER GROUP_DETAIL_AD0; SET TERM ^ ; CREATE OR ALTER TRIGGER AD_MARK_GROUP FOR GROUP_DETAIL ACTIVE AFTER DELETE POSITION 0 AS begin /*add avo 16/12/2020 and d.id>0*/ if ((old.grouptable='DOC_DETAIL_ACTIVE')) then begin if (old.group_id=-43) then begin --03/09/2020 смотрим на параметр и в зависимости от него снимаем/ставим предприятие if (((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) and ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1)) then update doc_detail_active dd set dd.marking=0, dd.base_agent_id=0, dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id ) where dd.id=old.grouptable_id; else if ((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) then update doc_detail_active dd set dd.marking=0, dd.base_agent_id=0 where dd.id=old.grouptable_id; else if ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1) then update doc_detail_active dd set dd.marking=0, dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id ) where dd.id=old.grouptable_id; else update doc_detail_active dd set dd.marking=0 where dd.id=old.grouptable_id and dd.marking<>0; end end if (old.grouptable='PARTS') then begin if (old.group_id=-43) then begin --03/09/2020 смотрим на параметр и в зависимости от него снимаем/ставим предприятие if (((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) and ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1)) then update doc_detail_active dd set dd.marking=0, dd.base_agent_id=0, dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id ) where dd.part_id=old.grouptable_id; else if ((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) then update doc_detail_active dd set dd.marking=0, dd.base_agent_id=0 where dd.part_id=old.grouptable_id; else if ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1) then update doc_detail_active dd set dd.marking=0, dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id ) where dd.part_id=old.grouptable_id; else update doc_detail_active dd set dd.marking=0 where dd.part_id=old.grouptable_id and dd.marking<>0; end end end ^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER TRIGGER SET_MARKING_GROUP FOR DOC_DETAIL_ACTIVE ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS begin /*add AVO 04/09/2020 Для позиций проверяем, если товар маркированный, то ставим группу маркировки принудительно */ if (new.marking=1) then begin -- 20/10/2020 для корректировки выходим без определения группы if ((select d.doc_type from docs d where d.id=new.doc_id) in (7,8,17,18,23)) then exit; --Проверяем есть ли группа, если есть уже - выходим if (((select count(id) from GROUP_DETAIL where GROUP_ID =-43 and GROUPTABLE='DOC_DETAIL_ACTIVE' and GROUPTABLE_ID=new.id)>0) OR ((select count(id) from GROUP_DETAIL where GROUP_ID =-43 and GROUPTABLE='PARTS' and GROUPTABLE_ID=new.part_id)>0)) then exit; if ((not exists(select id from GROUP_DETAIL where GROUP_ID=-43 and GROUPTABLE_ID=new.id and GROUPTABLE='DOC_DETAIL_ACTIVE'))) then UPDATE OR INSERT INTO GROUP_DETAIL (GROUP_ID, PARENT_ID, GROUPTABLE_ID, GROUPTABLE) VALUES (-43, 0, new.id, 'DOC_DETAIL_ACTIVE') MATCHING (GROUP_ID, PARENT_ID, GROUPTABLE_ID, GROUPTABLE); end end ^ SET TERM ; ^ /* Privileges of triggers */ GRANT SELECT ON DOCS TO TRIGGER SET_MARKING_GROUP; GRANT UPDATE, REFERENCES ON DOC_DETAIL_ACTIVE TO TRIGGER SET_MARKING_GROUP; GRANT SELECT, INSERT, UPDATE ON GROUP_DETAIL TO TRIGGER SET_MARKING_GROUP; CREATE INDEX MARK_DETAIL_IDX4 ON MARK_DETAIL (DDA_ID); CREATE INDEX MARK_REQUESTS_IDX1 ON MARK_REQUESTS (DOCNUM); SET TERM ^ ; create or alter procedure PR_MARK_COUNT ( DDA_ID DM_ID) returns ( CNT DM_TEXT, CONCATENATION DM_TEXT) as declare variable DOC_TYPE DM_ID; declare variable DOC_ID DM_ID; declare variable Q1 DM_ID; declare variable Q2 DM_ID; declare variable QUANT DM_ID; declare variable MARKING DM_STATUS; begin --В активном документе select QUANT,doc_id, coalesce(marking,0) from DOC_DETAIL_ACTIVE DD where DD.ID = :DDA_ID into QUANT,:doc_id,:marking; if (marking is null) then marking=0; if (marking=0) then begin CONCATENATION=''; CNT=''; suspend; exit; end select d.doc_type from docs d where d.id=:doc_id into :doc_type; --на приход select cast(count(M.MARK_DATA) as DM_ID) from MARK_DETAIL M where M.DDA_ID = :DDA_ID and M.ACTIVEPOS = 1 into Q1; --на расход select cast(count(M.MARK_DATA) as DM_ID) from MARK_DETAIL M where M.DDA_ID = :DDA_ID and M.ACTIVEPOS = 2 into Q2; if (:doc_type not in (8,58)) then begin if (QUANT > 0) then begin select 'Кол-во: ' || :QUANT || ' / Неверных: ' ||(:QUANT - :Q1), :Q1 from RDB$DATABASE into :CONCATENATION, :CNT; end else begin select 'Кол-во: ' ||(:QUANT * -1) || ' / Неверных: ' ||((:QUANT * -1) - :Q2), :Q2 from RDB$DATABASE into :CONCATENATION, :CNT; end end else --Переоценка begin select 'Кол-во: ' ||(:QUANT ) || ' / Неверных: ' ||((:QUANT ) - :Q2), :Q2 from RDB$DATABASE into :CONCATENATION, :CNT; end suspend; end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_MARK_COUNT; GRANT SELECT ON DOCS TO PROCEDURE PR_MARK_COUNT; GRANT SELECT ON MARK_DETAIL TO PROCEDURE PR_MARK_COUNT; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE PR_MARK_COUNT TO VIEW VW_DOC_DETAIL_ACTIVE; GRANT EXECUTE ON PROCEDURE PR_MARK_COUNT TO SYSDBA; SET TERM ^ ; create or alter procedure PR_DOC_DETAIL_ACTIVE_MMBSH_COMM ( DOC_ID type of DM_ID) as declare variable GROUPTABLE type of DM_METADATANAME; declare variable GROUP_ID type of DM_ID; declare variable TABLE_ID DM_ID_NULL; declare variable NAME_ID type of DM_UUID_NULL; declare variable IZG_ID type of DM_UUID_NULL; declare variable COUNTRY_ID type of DM_UUID_NULL; declare variable ORIG_NAME_ID type of DM_UUID_NULL; declare variable ORIG_IZG_ID type of DM_UUID_NULL; declare variable ORIG_COUNTRY_ID type of DM_UUID_NULL; begin for select m.group_id, m.detail_id, g.grouptable, da.name_id, da.izg_id, da.country_id, da.orig_name_id, da.orig_izg_id, da.orig_country_id from DOC_DETAIL_ACTIVE_MMBSH m left join groups g on m.group_id=g.id left join doc_detail_active da on m.detail_id=da.id where m.doc_id=:doc_id and m.status=0 into :group_id, :table_id, :grouptable, :name_id, :izg_id, :country_id, :orig_name_id, :orig_izg_id, :orig_country_id do begin if (trim(grouptable)='PARTS') then if (not exists (select 1 from group_detail where GROUPTABLE='DOC_DETAIL_ACTIVE' and group_id=:group_id and GROUPTABLE_ID=:table_id)) then insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE'); if (trim(grouptable)='PARTS.NAME_ID') then begin if ( (:name_id='0') or (:name_id='') ) then insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE'); else begin if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :name_id) is null) then insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:name_id); end end if (trim(grouptable)='PARTS.IZG_ID') then begin if ( (:izg_id='0') or (:izg_id='') ) then insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE'); else begin if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :izg_id) is null) then insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:izg_id); end end if (trim(grouptable)='PARTS.COUNTRY_ID') then begin if ( (:country_id=0) or (:country_id='') ) then insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE'); else begin if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :country_id) is null) then insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:country_id); end end if (trim(grouptable)='PARTS.ORIG_NAME_ID') then begin if ( (:orig_name_id=0) or (:orig_name_id='') ) then insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE'); else begin if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :orig_name_id) is null) then insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:orig_name_id); end end if (trim(grouptable)='PARTS.ORIG_IZG_ID') then begin if ( (:orig_izg_id=0) or (:orig_izg_id='') ) then insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE'); else begin if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :orig_izg_id) is null) then insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:orig_izg_id); end end if (trim(grouptable)='PARTS.ORIG_COUNTRY_ID') then begin if ( (:orig_country_id=0) or (:orig_country_id='') ) then insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE'); else begin if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :orig_country_id) is null) then insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:orig_country_id); end end end end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT ON DOC_DETAIL_ACTIVE_MMBSH TO PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM; GRANT SELECT ON GROUPS TO PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM; GRANT SELECT ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM; GRANT SELECT,INSERT ON GROUP_DETAIL TO PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM TO STANDART; GRANT EXECUTE ON PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM TO SYSDBA; SET SQL DIALECT 3; SET TERM ^ ; CREATE OR ALTER TRIGGER GROUP_DETAIL_AD0 FOR GROUP_DETAIL ACTIVE AFTER DELETE POSITION 0 AS begin if ((old.group_id=-43) and (old.grouptable='DOC_DETAIL_ACTIVE')) then begin update doc_detail_active dd set dd.marking=0 where id=old.grouptable_id; end end ^ SET TERM ; ^
Поправить VW_DOCS и VW_DOC_DETAIL_ACTIVE
- заменить первую строку в VW_DOCS (для больниц)
на
iif(docs.doc_type=60,1, (select MARKING_STATUS from PR_MARK_STATUS(docnum))),
- заменить в VW_DOC_DETAIL_ACTIVE вызов pr_mark_count
на
iif(da.marking=1, (select concatenation from pr_mark_count(da.id)),null),
Дополнительно обновить процедуры
!!!Файл:PR NEW PART 20210318.txt !!!Файл:PR DOC PRIHOD COMMIT RECURSE 20210318.txt !!!Файл:PR EDITCUSTOMDOC 16032021.txt !!!Файл:PR CORRECTPART типовая.txt
!!! аккуратнее, возможна остановка торговли
25/11/2020 обновленный вариант процедур проведения документа с записью в таблицы информации о маркированном товаре для версии менеджера 274.49.32 и выше здесь Обновление процедур проведения документа - маркировка после этого перекомпилировать процедуру PR_DOC_COMMIT Старые версии без сохранения информации о маркировке: !!!Файл:PR DOC DETAIL INSERT типовая.txt !!!Файл:PR DOC PRIHOD COMMIT RECURSE типовая 20201126.txt для БезНДСников закомментировать поле SUM_NDSR! !!!Файл:PR DOC RASHOD COMMIT типовая.txt
после этого перекомпилировать процедуру PR_DOC_COMMIT
Проверить, что в "Менеджере групп" группа "ЖНВЛС" вверху списка по группам
Настроить сетки в активных документах и журнале документов
- Поле VW_DOC_DETAIL_ACTIVE.MARK_BARCODE (datamatrix)
- Поле VW_DOCS.MARK_STATUS (статус документа в ЧЗ)
ТМС Проведение с авторасходом (пока не тестировалось, не накатывать пока)
Для того, чтобы в авторасход автоматически копировались datamatriх коды, нужно:
1) добавить копирование кодов в расходный документ
EndIBTransaction(trn1,1); STARTIBTRANSACTION(trn1,1); try query3:=ExecIBQuery(trn1,'execute procedure PR_COPY_MARK_DETAIL('+doc_id2+','+comdoc2+');',1); //провел расход перемещения except EndIBTransaction(trn1,0); exit; end;
2) убрать автоматическое проведение документа
Теги: маркировка, МДЛП
конвертор
В накладные в ОЗ были добавлены, такие же нужно добавить в поля в конвертор
MARKING tinyint(4) NULL; --Маркировка: Признак маркировки: 0 – не маркированный товар, 1- маркированный, 2- Короб SSCC GTIN varchar(20) NULL; --Маркировка: GTIN код упаковки GTIN_SUBJ varchar(20) NULL; --Маркировка: ID места деятельности GSERNUM varchar(20) NULL; --Маркировка: Серийный номер упаковки ACCEPTTYPE tinyint(4) NULL; --Маркировка: Тип акцепта: 0 – обратная, 1- прямая DATEPROD double NULL; --Маркировка: Дата производства
возможные проблемы
- ошибка типа conversion error MARK_DETAIL_BIU0
ALTER TABLE MARK_DETAIL ALTER COLUMN SERIES_NUMBER TYPE DM_TEXT;
- тормозит добавление в активные документы прихода/расхода, особенно на больших накладных
CREATE INDEX MARK_DETAIL_IDX4 ON MARK_DETAIL (DDA_ID);
- тормозит журнал документов при открытии
CREATE INDEX MARK_REQUESTS_IDX1 ON MARK_REQUESTS (DOCNUM);
Добавление предприятия -10 (МДЛП)
INSERT INTO AGENTS (ID, CAPTION, FULLNAME, ADDR_ID, FACTADDR_ID, STATUS, INSERTDT, INN, DIRECTOR_NAME, BUH_NAME, EMAIL, PHONENUMBERS, DELETEDT, DOVER_FACE, DOLZHNOST, DOVERKA, DOVERKA_DT, BASE_AGENT_ID, ADDR, FACTADDR, BIK, BANK, RS, KS, KPP, KREDITDAY, BANK_ID, FOLDER_ID, GOR, KORSHET, CREDIT_DEPTH, EGAIS_ID, EGAIS_COUNTRY_ID, EGAIS_REGION_ID, FILEMASK, GLOBAL_AGENT_ID, MARK_TYPE, PARENT_ID, AGENT_PLACE_ID, TRUSTED, OGRN) VALUES (-10, 'Маркировка', 'МДЛП', 0, 0, 0, '14-SEP-2020 13:28:39.944', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL); INSERT INTO GROUP_DETAIL (GROUP_ID, PARENT_ID, GROUPTABLE_ID, INSERTDT, GROUPTABLE) VALUES (-7, 0, '-10', '14-SEP-2020 13:28:40.007', 'AGENTS');
Фильтр "Документы, отправленные в МДЛП"
mark_status > 0
Старая схема отправки маркированной накладной по почте на примере подпрограммы "Переотправить документ"
program GroupProgram; var query, con: cardinal; trn, query1: cardinal; t,adr_otprav,adr_poluch,f,katalog, docnum,docdate,organization,doc_id, adr_smtp,adr_port,adr_psw,ssl, sUser,ORG_MD: string; i,mb_res,base_type: integer; function SS_filename(ss: string):string; begin result:=StringReplace(ss, '''', '', 1); result:=StringReplace(result, '"', '', 1); result:=StringReplace(result, ':', '', 1); result:=StringReplace(result, '`', '', 1); result:=StringReplace(result, ',', '.', 1); end; begin doc_id:=inttostr(m_docarchive.FOCUSEDID); trn:=CREATEIBTRANSACTION; STARTIBTRANSACTION(trn,1); t:='select dt.base_type,d.vnum,d.commitdate from docs d left join doc_types dt on d.doc_type=dt.id where d.id='+doc_id; query1:=ExecIBQuery(trn,t,1); if not IBQUERY_EOF(query1) then begin base_type:=IBQuery_FieldByName_i(query1, 'base_type'); docnum:=IBQuery_FieldByName_s(query1, 'vnum'); docdate:=IBQuery_FieldByName_s(query1, 'commitdate'); end; if base_type <> 2 then exit; t:='select PARAM_VALUE from PARAMS where PARAM_ID=''PARAMS_TEMP_PATH'''; query1:=ExecIBQuery(trn,t,1); if not IBQUERY_EOF(query1) then katalog:=IBQuery_FieldByName_s(query1, 'PARAM_VALUE')+'\'; deletefilemask(katalog+'*.dbf'); t:='select PARAM_VALUE from PARAMS where PARAM_ID=''PARAMS_SMTP'''; query1:=ExecIBQuery(trn,t,1); if not IBQUERY_EOF(query1) then adr_smtp:=IBQuery_FieldByName_s(query1, 'PARAM_VALUE'); t:='select PARAM_VALUE from PARAMS where PARAM_ID=''PARAMS_PORT'''; query1:=ExecIBQuery(trn,t,1); if not IBQUERY_EOF(query1) then adr_port:=IBQuery_FieldByName_s(query1, 'PARAM_VALUE'); t:='select PARAM_VALUE from PARAMS where PARAM_ID=''PARAMS_PSW'''; query1:=ExecIBQuery(trn,t,1); if not IBQUERY_EOF(query1) then adr_psw:=IBQuery_FieldByName_s(query1, 'PARAM_VALUE'); t:='select PARAM_VALUE from PARAMS where PARAM_ID=''EMAIL'''; query1:=ExecIBQuery(trn,t,1); if not IBQUERY_EOF(query1) then adr_otprav:=IBQuery_FieldByName_s(query1, 'PARAM_VALUE'); t:='select PARAM_VALUE from PARAMS where PARAM_ID=''ORG_NAME_NAKL'''; query1:=ExecIBQuery(trn,t,1); if not IBQUERY_EOF(query1) then organization:=IBQuery_FieldByName_s(query1, 'PARAM_VALUE'); ssl := ''; t:='select PARAM_VALUE from PARAMS where PARAM_ID=''PARAMS_AUTOTLS'''; query1:=ExecIBQuery(trn,t,1); if not IBQUERY_EOF(query1) then begin if (IBQuery_FieldByName_s(query1, 'PARAM_VALUE')='Да') then ssl := ssl + 'AUTOTLS'; end; t:='select PARAM_VALUE from PARAMS where PARAM_ID=''PARAMS_FULLSSL'''; query1:=ExecIBQuery(trn,t,1); if not IBQUERY_EOF(query1) then begin if (IBQuery_FieldByName_s(query1, 'PARAM_VALUE')='Да') then ssl := ssl + ' FULLSSL'; end; t:='select PARAM_VALUE from PARAMS where PARAM_ID=''ORG_MD'''; query1:=ExecIBQuery(trn,t,1); if not IBQUERY_EOF(query1) then ORG_MD:=Trim(IBQuery_FieldByName_s(query1, 'PARAM_VALUE')); t:='select a.email from docs d left join agents a on d.agent_id=a.id where d.id='+doc_id; query1:=ExecIBQuery(trn,t,1); if not IBQUERY_EOF(query1) then adr_poluch:=IBQuery_FieldByName_s(query1, 'EMAIL'); if (trim(adr_otprav)<>'') and (trim(adr_poluch)<>'') then mb_res:=application.messagebox(PChar('У контрагента быд обнаружен электронный адрес.'+#13#10+'Отправить докумен как электронную накладную?'),'',$00000004+$00000020) else exit; if mb_res<>6 then exit; con:=CreateADOConnection('Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;User ID=Admin;Password=;Data Source='+katalog); if not FileExists(katalog+'temp.dbf') then begin t:='CREATE TABLE temp (DOCNUM CHAR(50),DOCDATE DATE,TOVAR CHAR(250),ORIG_TOVAR CHAR(250),SER CHAR(100),'+ 'QUANT NUMERIC(18,5),PRICE_Z NUMERIC(18,5),PRICE_O NUMERIC(15,5),NDSO NUMERIC(18,5),SUM_NDSO NUMERIC(18,5),'+ 'PRICE_R NUMERIC(18,5),IZG CHAR(250),SERT CHAR(250),SDSERT DATE,KEMVSERT CHAR(250),REGN CHAR(250),DATESERT DATE,'+ 'GODENDO DATE,NGTD CHAR(250),STRANA CHAR(250),PRICE NUMERIC(18,5),BARCODE CHAR(250),GNVLS CHAR(10),'+ 'ORIG_CODE CHAR(100),PART CHAR(10),SUM_NDSR NUMERIC(18,5),SKLAD_ID CHAR(150),MARKING CHAR(10),'+ 'ACCEPTTYPE CHAR(10),GTIN_SUBJ CHAR(50))'; //m_manager.Logit(t); ExecADOQuery(con, t); end t:='select abs(dd.summa_o) as summa_o,abs(dd.price*quant) as summa, d.vnum,cast(d.commitdate as dm_date) as commitdate,'+ 'dd.sname,dd.seria,abs(dd.quant) as quant,iif(dd.price_z is null,0,dd.price_z) as price_z,'+ 'iif(dd.price_r is null,0,dd.price_r) as price_r,dd.nds,-dd.sum_ndso as SUM_NDSO,dd.price_r,dd.sizg,'+ 'dd.sert,iif(dd.sdsert is null,''01.01.2000'', cast(dd.sdsert as dm_date )) as sdsert,dd.kemvsert,dd.regn,'+ 'iif(dd.datesert is null,''01.01.2000'',cast(dd.datesert as dm_date )) as datesert,'+ 'iif(dd.godendo is null,''01.01.2000'',cast(dd.godendo as dm_date )) as godendo,dd.ngtd,dd.SCOUNTRY,dd.price,dd.BCODE_IZG,dd.part_id,'+ 'iif(dd.mmbsh containing ''ЖНВЛС'',1,0) as gnvls,iif(dd.mmbsh containing ''делим'',1,0) as part,dd.MARKING, '+ '(select (select a.caption from agents a where a.id=pr.agent_id) from PR_GETMOTHERPART(dd.part_id) pr) as sklad_id '+ 'from vw_doc_detail_active dd left join vw_docs d on dd.doc_id=d.id where d.id='+doc_id; ExecADOquery(con, 'delete from temp.dbf'); //m_manager.Logit(t); query1:=ExecIBQuery(trn,t,1); while not IBQUERY_EOF(query1) do begin t:='insert into temp (DOCNUM,DOCDATE,TOVAR,ORIG_TOVAR,SER,QUANT,PRICE_Z,PRICE_O,NDSO,SUM_NDSO,PRICE_R,' +'IZG,SERT,SDSERT,KEMVSERT,REGN,DATESERT,GODENDO,NGTD,STRANA,PRICE,BARCODE,GNVLS,ORIG_CODE,PART,SUM_NDSR,SKLAD_ID,MARKING,ACCEPTTYPE,GTIN_SUBJ) values ('; t:=t+''''+DOCNUM+''','; try if length(DOCDATE) < 5 then t:=t+'''0:0:0'',' else t:=t+''''+stringreplace(DOCDATE,'''','',1)+''','; except t:=t+'''0:0:0'','; end; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'sname'))+''','; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'sname'))+''','; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'seria'))+''','; try if IBQuery_FieldByName_s(query1, 'quant') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'quant'),',','.',1)+','; except t:=t+'0,'; end; try if IBQuery_FieldByName_s(query1, 'price_z') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'price_z'),',','.',1)+','; except t:=t+'0,'; end; try if IBQuery_FieldByName_s(query1, 'SUMMA_O') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'SUMMA_O'),',','.',1)+','; except t:=t+'0,'; end; try if IBQuery_FieldByName_s(query1, 'NDS') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'NDS'),',','.',1)+','; except t:=t+'0,'; end; try if IBQuery_FieldByName_s(query1, 'SUM_NDSO') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'SUM_NDSO'),',','.',1)+','; except t:=t+'0,'; end; try if IBQuery_FieldByName_s(query1, 'price_r') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'price_r'),',','.',1)+','; except t:=t+'0,'; end; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'sizg'))+''','; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'sert'))+''','; try if length(IBQuery_FieldByName_s(query1, 'sdsert')) < 5 then t:=t+'''0:0:0'',' else t:=t+''''+stringreplace(IBQuery_FieldByName_s(query1, 'sdsert'),'''','',1)+''','; except t:=t+'''0:0:0'','; end; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'KEMVSERT'))+''','; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'REGN'))+''','; try if length(IBQuery_FieldByName_s(query1, 'DATESERT')) < 5 then t:=t+'''0:0:0'',' else t:=t+''''+stringreplace(IBQuery_FieldByName_s(query1, 'DATESERT'),'''','',1)+''','; except t:=t+'''0:0:0'','; end; try if length(IBQuery_FieldByName_s(query1, 'GODENDO')) < 5 then t:=t+'''0:0:0'',' else t:=t+''''+stringreplace(IBQuery_FieldByName_s(query1, 'GODENDO'),'''','',1)+''','; except t:=t+'''0:0:0'','; end; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'NGTD'))+''','; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'SCOUNTRY'))+''','; try if IBQuery_FieldByName_s(query1, 'price') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'price'),',','.',1)+','; except t:=t+'0,'; end; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'BCODE_IZG'))+''','; try if IBQuery_FieldByName_s(query1, 'gnvls') = '' then t:=t+'0,' else t:=t+IBQuery_FieldByName_s(query1, 'gnvls')+','; except t:=t+'0,'; end; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'part_id'))+''','; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'part'))+''','; t:=t+'0,'; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'SKLAD_ID'))+''','; t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'MARKING'))+''','; t:=t+'1,'; t:=t+''''+stringreplace(ORG_MD,'''','',1)+''')'; //m_manager.Logit(t); ExecADOquery(con, t); IBQUERY_NEXT(query1); end FreeADOConnection(con); f:=katalog+organization+' №'+docnum+' от '+docdate+'.dbf'; m_manager.Logit('Пробуем отправить по почте файл '+f); copyfile(katalog+'temp.dbf',f,true); sUser := Copy(adr_otprav, 1, Pos('@', adr_otprav)-1); //m_manager.Logit(sUser); t:=ssl+' host='+adr_smtp+' port='+adr_port+' User='+sUser+' Pass='+adr_psw+' FROMEMAIL='+adr_otprav+' TOEMAIL='+adr_poluch+' SUBJ="Электронные накладные" BODY="Электронные накладные" file0="'+f+'"'; m_manager.logit(katalog+'VGMCSend.exe '+t); i:=ShellExecute(0, 'open',katalog+'VGMCSend.exe', t, '', 5); if i<32 then begin showmessage('Ошибка отправки почты: '+ShellExecuteError(i)); exit; end //deletefile(f); m_manager.logit('Электронная накладная от '+adr_otprav+' с вложением "'+organization+' №'+docnum+' от '+docdate+'.dbf" для '+adr_poluch+' отправляется, через 5-10 минут отобразиться у получателя'); end.
Настройка под работу с УСН (2 предприятия)
Выполнить скрипт
Файл:МДЛП - настройка под УСН для точки-.txt
Настроить кассовое место
- перезапустить кассира
- для предприятия -10 скопировать настройки
- настроить режим работы с УСН
- скопировать настройки для всех пользователей
Подключение регистратора выбытия (РВ, регистратор выбытия)
Файл:Подключение регистратора выбытия.doc
запрет на снятие группы МДЛП для остатков (не обязательно ставить)
SET SQL DIALECT 3; SET TERM ^ ; CREATE OR ALTER TRIGGER GROUP_DETAIL_982164_BD0 FOR GROUP_DETAIL ACTIVE BEFORE DELETE POSITION 0 AS begin --ставим запрет на снятие группы МДЛП, т.к. по непонятным причинам эта группа снимается if ((old.group_id = -43) and (old.grouptable='PARTS')) then if (exists(select id from mark_detail m where m.part_id = cast(old.grouptable_id as dm_id) )) then exception EX_WRONG_OPER ' Позиция маркирована. Сброс группы запрещен. (Партия '||old.grouptable_id||')'; end ^ SET TERM ; ^