Получить CARDCODE после создания документа

Medoc Man
Повідомлень: 739
З нами з: 07 червня 2018, 14:28
Звідки: Kiev

Re: Получить CARDCODE после создания документа

Повідомлення Medoc Man » 17 грудня 2019, 16:25

PetroP писав:
17 грудня 2019, 15:42
Каким образом найти именно тот новосозданный, если может существовать в медке несколько дублей?
Если Вы создаёте документ программно, то Акт сверки с определённым номером, датой, контрагентом и при этом с направлением "Виданий" у Вас может быть только 1.
Если допустить, что кто-то у Вас помимо "программного создания" ещё создаёт вручную - тогда Вам нужно определится с коллегами в вопросе либо "руками", либо "удобно и автоматизированно".
2 одинаковых выписанных акта, совпадающих по реквизитам "Номер, Дата, Контрагент" - это либо нарушение нумерации, либо отсутствие перезаписи существующего документа при программном создании (вместо перезаписи может быть перемещение в Корзину).
В нормальном случае, GetPrimaryReestr(10104, 1, ДатаВашегоДокумента, ДатаВашегоДокумента) с проверками по Номеру, Дате и Контрагенту, после создания документа в M.E.Doc вернёт Вам верный и единственный CardCode.
Но, разумеется, это повлияет на быстродействие при больших объемах документов.
PetroP писав:
17 грудня 2019, 15:40
Чтобы понять, попробуйте ответить на простой вопрос: Как получить CARDCODE при программном создании первичного документа без использования ExDocID?
Описал выше.
Но всего этого можно избежать, указывая ExDocID при Вашем "программном создании".
У Вас есть инструмент, готовый, рабочий (я про ExDocID) - Вы его не хотите использовать (или не можете, но я в такое не верю).
Есть предложенный альтернативный способ, немного мудрёный, но рабочий. Хотя по факту, в обоих случаях Вы получите одинаково "уникальный идентификатор".
Вы зачем-то просите ещё, новый метод, который будет делать, по сути, тоже самое что и выше. Только Вы перекладываете часть с поиском CardCod'а с себя на M.E.Doc, который сделает это за Вас и просто отдаст результат.
Я имею ввиду условный GetDocCardcode, в который Вам, вероятно, нужно будет передавать какие-то атрибуты, чтоб M.E.Doc так же мог найти нужный, переданный Вами документ.
Человек-волшебник

PetroP
Повідомлень: 614
З нами з: 22 січня 2015, 18:50

Re: Получить CARDCODE после создания документа

Повідомлення PetroP » 17 грудня 2019, 16:51

Medoc Man писав:
17 грудня 2019, 16:25
Если Вы создаёте документ программно, то Акт сверки с определённым номером, датой, контрагентом и при этом с направлением "Виданий" у Вас может быть только 1.
Если допустить, что кто-то у Вас помимо "программного создания" ещё создаёт вручную - тогда Вам нужно определится с коллегами в вопросе либо "руками", либо "удобно и автоматизированно".
2 одинаковых выписанных акта, совпадающих по реквизитам "Номер, Дата, Контрагент" - это либо нарушение нумерации, либо отсутствие перезаписи существующего документа при программном создании (вместо перезаписи может быть перемещение в Корзину).
В нормальном случае, GetPrimaryReestr(10104, 1, ДатаВашегоДокумента, ДатаВашегоДокумента) с проверками по Номеру, Дате и Контрагенту, после создания документа в M.E.Doc вернёт Вам верный и единственный CardCode.
Но, разумеется, это повлияет на быстродействие при больших объемах документов.
Это - не выход, и даже не полумера. Это - уязвимость медка. И все еще хуже, когда "коллег" большое количество, когда большая многопользовательская структура, когда "биг-дата". Зачем тратить столько ресурсов на стороне пользователей медка, если (уверен) сделать разработчику медка один метод, который "убъет" недостатки CARDCODE, - "раз плюнуть".
Medoc Man писав:
17 грудня 2019, 16:25
Описал выше.
Но всего этого можно избежать, указывая ExDocID при Вашем "программном создании".
У Вас есть инструмент, готовый, рабочий (я про ExDocID) - Вы его не хотите использовать (или не можете, но я в такое не верю).
Есть предложенный альтернативный способ, немного мудрёный, но рабочий. Хотя по факту, в обоих случаях Вы получите одинаково "уникальный идентификатор".
Вы зачем-то просите ещё, новый метод, который будет делать, по сути, тоже самое что и выше. Только Вы перекладываете часть с поиском CardCod'а с себя на M.E.Doc, который сделает это за Вас и просто отдаст результат.
Я имею ввиду условный GetDocCardcode, в который Вам, вероятно, нужно будет передавать какие-то атрибуты, чтоб M.E.Doc так же мог найти нужный, переданный Вами документ.
Наша песня хороша... Как заполнить ExDocID, если документ прислал контрагент, если документ создал пользователь в Медке ручками?
ExDocID - мертворожденный реквизит, который только увеличивает в размерах базу данных.

Inkognito
Повідомлень: 932
З нами з: 14 січня 2012, 14:26

Re: Получить CARDCODE после создания документа

Повідомлення Inkognito » 17 грудня 2019, 18:02

Medoc Man
Есть такой метод "ПолучитьСсылкуНового", в 1Ске, позволяет получить ссылку на новосозданный объект.
Насколько я понимаю, нужен аналог.

PetroP
Костыль:
1) Установить драйвер подключения к FireBird
2) Создать SELECT к базе, таблица CARD. Останется написать нужный запрос, который установит ExtDocID, как новый ИД.
3) Обработку запускать по расписанию каждые Х минут.
4) По ExtDocID можно многое получить, сами знаете.
Ну, а можно и SELECT по CARD с параметрами, для поиска документа и получения CARDCODE. Способ еще тот, но что делать...

Medoc Man
Повідомлень: 739
З нами з: 07 червня 2018, 14:28
Звідки: Kiev

Re: Получить CARDCODE после создания документа

Повідомлення Medoc Man » 17 грудня 2019, 22:57

PetroP писав:
17 грудня 2019, 16:51
И все еще хуже, когда "коллег" большое количество, когда большая многопользовательская структура, когда "биг-дата".
О каком ручном создании может идти речь в таких случаях?
PetroP писав:
17 грудня 2019, 16:51
Как заполнить ExDocID, если документ прислал контрагент, если документ создал пользователь в Медке ручками?
Никак. Его нет и никогда небыло во входящих документах и я опять не понимаю при чём тут они, если Вы говорите только о выписанных.
Если создан "руками" - то отличить его от созднанного программно Вам бы помог тот самый, уже икающий, ExDocID.
А дубликаты легко бы отсеялись обычной проверкой по количеству (if docs.count > 1).

Я может действительно чего-то не понимаю, но прежнему не вижу смысла тратить время разработчика на всё вышеописанное.
К тому же учитывая, сколько других полезных и более нужных вещей мы ждём уже годами.
PetroP писав:
17 грудня 2019, 16:51
ExDocID - мертворожденный реквизит, который только увеличивает в размерах базу данных.
Блин, а точно :o
Сформировал только что расходную накладную с одной позицией с добавлением ExDocID - к базе сразу пришилось 12 Gb.
Долго не мог понять почему так происходит. Но разобрался. Оказывается если в ExDocID поменять "Ex" на грустный русский "Эх" - база сжалится над тобой и не будет увеличиваться.
Inkognito писав:
17 грудня 2019, 18:02
PetroP
Костыль:
Вам бы этим костылём да по спинке :)
Не страшно-то БД потерять?

Inkognito
Повідомлень: 932
З нами з: 14 січня 2012, 14:26

Re: Получить CARDCODE после создания документа

Повідомлення Inkognito » 18 грудня 2019, 09:24

Medoc Man
Не страшно-то БД потерять?
Нет конечно. С каких это пор Select, Update приводят к разрушению базы :shock:
Из Ваших слов по теме и так понятно, что затребованный функционал не будет реализован, поэтому Вы предложили альтернативное решение. Мною также предложено альтернативное решение, и тоже рабочее. При обновлении таблицы Card полем ExtDocID, еще бы проанализировать статус документа (надо изменить на "Импортированный из учетной системы", поле или SENDSTT, или SENDSTATUS - по памяти не вспомню). Если клиент присылает документ без ExtDocID, значит ему все равно, как будет обрабатываться документ на стороне получателя. А мы себе работу упростим для целей автоматизации. Выбор конечно средств - за топикстартером.
П.С. почему бы не добавить в Медок настройку "Устанавливать уникальный идентификатор для первичных документов, если он отсутствует".

Medoc Man
Повідомлень: 739
З нами з: 07 червня 2018, 14:28
Звідки: Kiev

Re: Получить CARDCODE после создания документа

Повідомлення Medoc Man » 18 грудня 2019, 10:01

Inkognito писав:
18 грудня 2019, 09:24
Medoc Man
Не страшно-то БД потерять?
Нет конечно. С каких это пор Select, Update приводят к разрушению базы :shock:
Ну если на 1000 документов запрос или апдейт упадёт - Вы получите незавершенную транзакцию или, в худшем случае, дедлок.
Вариантов уйма, особенно с FB.
Inkognito писав:
18 грудня 2019, 09:24
Из Ваших слов по теме и так понятно, что затребованный функционал не будет реализован, поэтому Вы предложили альтернативное решение. Мною также предложено альтернативное решение, и тоже рабочее.
Я без понятия будут ли его делать. Лично считаю, что это трата времени, но это имхота.
Inkognito писав:
18 грудня 2019, 09:24
П.С. почему бы не добавить в Медок настройку "Устанавливать уникальный идентификатор для первичных документов, если он отсутствует".
Потому что это будет не ExDocID, а просто DocID, который Медком и так присваивается.
Человек-волшебник

Inkognito
Повідомлень: 932
З нами з: 14 січня 2012, 14:26

Re: Получить CARDCODE после создания документа

Повідомлення Inkognito » 18 грудня 2019, 10:28

Ну если на 1000 документов запрос или апдейт упадёт - Вы получите незавершенную транзакцию или, в худшем случае, дедлок.
Вариантов уйма, особенно с FB.
Выполнение запросов к базе что из сторонних систем, что Медком, по отношению к базе, одинаковое. Если бы СУБД была настолько ужасной, то ее бы не использовали, в т.ч. в крупных проектах, типа Медка. Обеспечение ИБП конечно необходимо.
Потому что это будет не ExDocID, а просто DocID, который Медком и так присваивается.
Только методы АПИ в основном ориентированы на ExDocID, ну и частично на CardCode, а не на DocID.

Medoc Man
Повідомлень: 739
З нами з: 07 червня 2018, 14:28
Звідки: Kiev

Re: Получить CARDCODE после создания документа

Повідомлення Medoc Man » 18 грудня 2019, 10:39

Inkognito писав:
18 грудня 2019, 10:28
Только методы АПИ в основном ориентированы на ExDocID, ну и частично на CardCode, а не на DocID.
Ну а как иначе? Вы в 1С создали документ, получили у него "Документ.УникальныйИдентификатор()". Это и будет значением для ExDocID.
Т.е. это ИДшник документа той системы, где он был создан (1С, в данном примере). Пусть он будет, условно, "12345".
Вы засунули этот документ в M.E.Doc посредством COM - M.E.Doc добавил ещё 2 значения: DocID (внутренний ИД документа Медка, пусть условно будет "56789") и CardCode (второй внутренний ИД документа или номер записи в БД, пусть будет условно "12341234").
В итоге Вы имеете:
- ExDocID = "12345";
- DocID = "56789";
- CardCode = "12341234".
Если б документ создавался вручную или импортировался бы из XML, или был бы получен от контрагента - он имел бы только DocID и CardCode.
И во всех случаях на основании всех трёх параметров можно работать с документами. Без особых выдумок.
Человек-волшебник

Inkognito
Повідомлень: 932
З нами з: 14 січня 2012, 14:26

Re: Получить CARDCODE после создания документа

Повідомлення Inkognito » 18 грудня 2019, 11:16

Все почти так, как Вы сказали, за важным исключением - у входящих докумнтов часто нет ExtDocID, т.к. документы создают вручную. А на стороне получателя потом думай, как его искать и читать.
Ок, не буду спорить, оставляю тему PetroP. Если надумаете работать с базой напрямую, стучите в личку.

Medoc Man
Повідомлень: 739
З нами з: 07 червня 2018, 14:28
Звідки: Kiev

Re: Получить CARDCODE после создания документа

Повідомлення Medoc Man » 18 грудня 2019, 11:38

Inkognito писав:
18 грудня 2019, 11:16
...за важным исключением - у входящих документов часто нет ExtDocID, т.к. документы создают вручную. А на стороне получателя потом думай, как его искать и читать.
У входящих документов есть особенный, отдельный признак, отличающий их от выписанного - признак, что они входящие.
Человек-волшебник

PetroP
Повідомлень: 614
З нами з: 22 січня 2015, 18:50

Re: Получить CARDCODE после создания документа

Повідомлення PetroP » 18 грудня 2019, 12:26

Medoc Man писав:
17 грудня 2019, 22:57
О каком ручном создании может идти речь в таких случаях?
Во-первых, это уже не относится к теме проблемы. Во-вторых, в таких случаях в первую очередь не может идти речь о контроле ручного создания путем просьб и уговоров "коллег".
Medoc Man писав:
17 грудня 2019, 22:57
Никак. Его нет и никогда небыло во входящих документах и я опять не понимаю при чём тут они, если Вы говорите только о выписанных.
Если создан "руками" - то отличить его от созднанного программно Вам бы помог тот самый, уже икающий, ExDocID.
1. Я не говорю только о выписанных. Я говорю обо всех.
2. Я не ставлю цель отличать между собой созданный румами, созданный программно без ExDocID, созданный программно с ExDocID или входящий. Я хочу отличить только-что созданный программно от остальных документов.
Medoc Man писав:
17 грудня 2019, 22:57
А дубликаты легко бы отсеялись обычной проверкой по количеству (if docs.count > 1).

Я может действительно чего-то не понимаю, но прежнему не вижу смысла тратить время разработчика на всё вышеописанное.
К тому же учитывая, сколько других полезных и более нужных вещей мы ждём уже годами.
Создается впечатление, что вы действительно не понимаете. Но стоит только заняться стыковкой - понимание должно прийти. Когда каждый пользователь работает по своему в рамках доступных и допустимых возможностей. Когда одновременно пользователи передают в медок один и тот же документ. Когда существуют виды документов, для которых признак "входящий / исходящий" для учетной системы не имеет значения - они все равны...

И странно другое: вместо создания простой функции, разработчик пошел более сложным путем: придумал ExDocID (который не просто реквизит, а еще и требует поддержку уникальности), разработал кучу методов с поддержкой этого поля. На это время нашлось?
Medoc Man писав:
17 грудня 2019, 22:57
Блин, а точно :o
Сформировал только что расходную накладную с одной позицией с добавлением ExDocID - к базе сразу пришилось 12 Gb.
Долго не мог понять почему так происходит. Но разобрался. Оказывается если в ExDocID поменять "Ex" на грустный русский "Эх" - база сжалится над тобой и не будет увеличиваться.
Не удивляйтесь. Такие арти-факты всегда происходят, если вы работаете не с реальной системой, а теоретически со сферическим конем в вакууме...

PetroP
Повідомлень: 614
З нами з: 22 січня 2015, 18:50

Re: Получить CARDCODE после создания документа

Повідомлення PetroP » 18 грудня 2019, 12:32

Medoc Man писав:
18 грудня 2019, 10:39
Ну а как иначе? Вы в 1С создали документ, получили у него "Документ.УникальныйИдентификатор()". Это и будет значением для ExDocID.
Не знаю, кто придумал такую методику. Но один простой и не редкий пример для пользователей 1с: предприятие решает перейти из одной конфигурации 1с на другую. И все, накрылся не буду говорить чем данный функционал.
Medoc Man писав:
18 грудня 2019, 10:39
И во всех случаях на основании всех трёх параметров можно работать с документами. Без особых выдумок.
Вопрос, а зачем работать "на основании всех трех параметров", если это можно делать (при лишении недостатков, о которых я говорил) только с одним?

Medoc Man
Повідомлень: 739
З нами з: 07 червня 2018, 14:28
Звідки: Kiev

Re: Получить CARDCODE после создания документа

Повідомлення Medoc Man » 18 грудня 2019, 12:42

PetroP писав:
18 грудня 2019, 12:32
Вопрос, а зачем работать "на основании всех трех параметров", если это можно делать (при лишении недостатков, о которых я говорил) только с одним?
Потому что ExDocID, совпадающий в УС и в M.E.Doc даст легко выстроить связь между документов в УС и в M.E.Doc.
На основании CardCode так не получится. Если только Вы не додумались совать CardCode из M.E.Doc в УС, как УС суёт ExDocID в M.E.Doc :?
PetroP писав:
18 грудня 2019, 12:32
Не знаю, кто придумал такую методику. Но один простой и не редкий пример для пользователей 1с: предприятие решает перейти из одной конфигурации 1с на другую. И все, накрылся не буду говорить чем данный функционал.
А как Вы собираетесь сохранить связь при переходе на другую конфигурацию используя CardCode? :?:
Человек-волшебник

PetroP
Повідомлень: 614
З нами з: 22 січня 2015, 18:50

Re: Получить CARDCODE после создания документа

Повідомлення PetroP » 18 грудня 2019, 13:07

Medoc Man писав:
18 грудня 2019, 12:42
Если только Вы не додумались совать CardCode из M.E.Doc в УС, как УС суёт ExDocID в M.E.Doc :?
Именно так методологически и ПРАВИЛЬНО делать. Именно так я, например, храню соответствия справочникам УС справочников медка. Именно так хранятся соответствия записям одной изолированной базы данных записей другой изолированной базы данных.
Medoc Man писав:
18 грудня 2019, 12:42
А как Вы собираетесь сохранить связь при переходе на другую конфигурацию используя CardCode? :?:
Для хранения любой связи в объектах УС необходимо выделять специальный для этого реквизит. И значением такого реквизита может быть что угодно: либо CardCode (самый очевидный и правильный вариант), либо ExDocID, либо ЕщеОдинИдентификаторМалоНеПокажется. И при миграции из одной конфигурации на другую просто переносятся значения такого реквизита.

Medoc Man
Повідомлень: 739
З нами з: 07 червня 2018, 14:28
Звідки: Kiev

Re: Получить CARDCODE после создания документа

Повідомлення Medoc Man » 18 грудня 2019, 13:27

PetroP писав:
18 грудня 2019, 13:07
Medoc Man писав:
18 грудня 2019, 12:42
Если только Вы не додумались совать CardCode из M.E.Doc в УС, как УС суёт ExDocID в M.E.Doc :?
Именно так методологически и ПРАВИЛЬНО делать. Именно так я, например, храню соответствия справочникам УС справочников медка. Именно так хранятся соответствия записям одной изолированной базы данных записей другой изолированной базы данных.
Medoc Man писав:
18 грудня 2019, 12:42
А как Вы собираетесь сохранить связь при переходе на другую конфигурацию используя CardCode? :?:
Для хранения любой связи в объектах УС необходимо выделять специальный для этого реквизит. И значением такого реквизита может быть что угодно: либо CardCode (самый очевидный и правильный вариант), либо ExDocID, либо ЕщеОдинИдентификаторМалоНеПокажется. И при миграции из одной конфигурации на другую просто переносятся значения такого реквизита.
Как говорил господин priup, "Бардак в Вашем королевстве............." :(
Человек-волшебник

daaap
Повідомлень: 23
З нами з: 15 листопада 2018, 16:53

Re: Получить CARDCODE после создания документа

Повідомлення daaap » 27 лютого 2020, 12:11

Продолжу ветку, ибо думаю что это оно

У меня задача:
в МЕДОК залетает входящий документ, подписывается и его нужно загрузить в учетную систему 1С.
задача - загрузить цифровые образы подписанного документа в 1С как вложения.
С исходящими получилось пока вроди, с входящими есть проблема.

Медовая стыковка получает внешнее событие и начинает его обрабатывать с помощью компоненты

МедКомпонент = Новый("AddIn.Medoc1C");

В обработчике внешнего события есть код:

Отчет = МедКомпонент.GetPrimaryDoc(Данные);
ИмяСхемы = Отчет.CharCode;
ИмяДокумента = Отчет.DocName;
ТипПериода = Отчет.PeriodType;
ДатаПериода = Отчет.PeriodDate;
пGUID = Отчет.DOCGUID;

Я думал что последняя стока - это получение уникального идентификатора DOCGUID документа, по которому я его позже смогу найти
функцией GetDocSign используя этот DOCGUID как "Пошук по CardCode"

App = Новый COMОбъект("MEDOC.ZApplication");
sign = App.GetDocSigning();
СтрокаBase64 = sign.GetDocSign(пGUID,"",4);

НО! пGUID почему-то нулевой выглядит как 00000000-0000-0000-0000-000000000000

1) Как я могу найти этот входящий документ чтобы забрать у него цифровой образ?

сопутствующие вопросы:
2) а получится ли у меня после отработки компоненты МедКомпонент сразу использовать компоненту App = Новый COMОбъект("MEDOC.ZApplication"); ?

есть подозрение что могут быть проблемы. т.к сейчас sign = App.GetDocSigning(); выполняется нормально,
а вызов дальше sign.GetDocSign( -вызывает исключение - что НЕТ ТАКОЙ ФУНКЦИИ

Medoc Man
Повідомлень: 739
З нами з: 07 червня 2018, 14:28
Звідки: Kiev

Re: Получить CARDCODE после создания документа

Повідомлення Medoc Man » 27 лютого 2020, 12:46

daaap писав:
27 лютого 2020, 12:11
Я думал что последняя стока - это получение уникального идентификатора DOCGUID документа, по которому я его позже смогу найти
функцией GetDocSign используя этот DOCGUID как "Пошук по CardCode"
GUID и CardCode - разные вещи.
daaap писав:
27 лютого 2020, 12:11
1) Как я могу найти этот входящий документ чтобы забрать у него цифровой образ?
По CardCode.
daaap писав:
27 лютого 2020, 12:11
сопутствующие вопросы:
2) а получится ли у меня после отработки компоненты МедКомпонент сразу использовать компоненту App = Новый COMОбъект("MEDOC.ZApplication"); ?
есть подозрение что могут быть проблемы. т.к сейчас sign = App.GetDocSigning(); выполняется нормально,
а вызов дальше sign.GetDocSign( -вызывает исключение - что НЕТ ТАКОЙ ФУНКЦИИ
Я не помню, чтобы в 1С был диспоз объектов. Подключение второй компоненты после первой может быть выполнено через присвоение к другой переменной. Например, App = new COMObject("AddIn.Medoc1C"), а AppMedoc = new COMObject("Medoc.ZApplication").
Либо вариант с App = new COMObject("AddIn.Medoc1C") -> ... -> App = Неопределено -> App = new COMObject("Medoc.ZApplication"), но знающие люди поговаривают, что это так не делается и если зануливать переменную объекта, то вместе с ней с все прочие, которые с ней связаны.
Человек-волшебник

daaap
Повідомлень: 23
З нами з: 15 листопада 2018, 16:53

Re: Получить CARDCODE после создания документа

Повідомлення daaap » 27 лютого 2020, 13:03

спасибо.

а по делу, пGUID = Отчет.DOCGUID; возвращает пустой код.
тогда как получить тот код который мне нужен?

свойства CardCode нет у объекта который возвращается МедКомпонент.GetPrimaryDoc(Данные);

А вообще, не нашел документации к AddIn.Medoc1C
подскажете где взять?
Востаннє редагувалось 27 лютого 2020, 13:25 користувачем daaap, всього редагувалось 1 раз.

Medoc Man
Повідомлень: 739
З нами з: 07 червня 2018, 14:28
Звідки: Kiev

Re: Получить CARDCODE после создания документа

Повідомлення Medoc Man » 27 лютого 2020, 13:25

daaap писав:
27 лютого 2020, 13:03
тогда как получить тот код который мне нужен?
Проще всего - циклом по таблице из GetPrimaryReestr.
Например, как тут.
Человек-волшебник

daaap
Повідомлень: 23
З нами з: 15 листопада 2018, 16:53

Re: Получить CARDCODE после создания документа

Повідомлення daaap » 27 лютого 2020, 13:56

Medoc Man писав:
27 лютого 2020, 13:25
daaap писав:
27 лютого 2020, 13:03
тогда как получить тот код который мне нужен?
Проще всего - циклом по таблице из GetPrimaryReestr.
Например, как тут.
В вашем примере происходить поиск по ExDocID, но у меня входящий документ, который в данный момент передается в 1С.
у него есть ExDocID? тогда как получить его ExDocID используя результат МедКомпонент.GetPrimaryDoc(Данные)
в момент передачи документа из МЕДОК в 1С

есть ли документация к AddIn.Medoc1C?

Відповісти

Повернутись до “Модуль «Інтеграція»”