Версия для печати темы (https://pro1c.org.ua/index.php?s=05313a553f0c1428c7c4e9b2696c6f1d&showtopic=36851)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Тематическое общение _ Руководство разработчика для MEDOC

Автор: Bernet 26.04.17, 11:25

Всем привет.
Нужна документация с описанием структуры БД Медка.
Есть задача на допиливание функционала 1С и получении данных из Медка, а именно: нужно сверять коды УКТЗЕД поставщиков (которые ведутся у нас в базе) и те, которые приходят в входящих налоговых накладных в Медке.
Из примера медовой стыковки COM-объект с реестром входящих налоговых получил, теперь хочу пройтись по таб. части товаров каждого документа, там есть колонка "Код УКТЗЕД" - вот не знаю как её вытянуть, не хотелось бы пальцем в небо тыкать, а знать наверняка. Может кто находил нормальную документацию?

Дошел до следующего места:

        // получаем данные с МЕДКА
    App = Неопределено;
    Попытка
        App = Новый COMОбъект("Medoc.ZApplication")
    Исключение
        Возврат;
    КонецПопытки;                
    
    // Описание входящих параметров Медка:
    // ТипДокумента - "10100" - Налоговая накладная
    // ТипДокумента - "10101" - Приложение 2
    // ТипДокумента - "10100" - Входящий налоговый документ
    
    // Направление - 1 - исходящие
    // Направление - 2 - входящие
        
    prim = App.GetPrimaryDocs();
    Reestr = prim.GetPrimaryReestr("10100", 2, НачалоДня(НачалоПериода), КонецДня(КонецПериода));
    Reestr.First();
    Счетчик = Reestr.RecordCount;
    Пока Счетчик <> 0 Цикл
        
        НомерДокМед     = Reestr.Fields.Item("DOC_NUM").Value;
        ДатаДокМед      = Reestr.Fields.Item("DOC_DATE").Value;
        СуммаДокМед     = Reestr.Fields.Item("DOCSUM").Value;      
        
                // КАК ТУТ ОРГАНИЗОВАТЬ ПЕРЕБОР СТРОК ТАБ. ЧАСТИ И ВЫТЯНУТЬ КОД УКТЗЕД  С КАЖДОЙ СТРОКИ ?

        Счетчик = Счетчик-1;
          Reestr.Next();
    КонецЦикла;


P.S. http://pro1c.org.ua/redirect.php?http://www.me-doc.com.ua/2234-import-dokumentov-v-sistemu-m-e-doc я не нашел того что хотел

Автор: Petre 26.04.17, 11:34

Bernet @ Сегодня, 12:25 * ,
Откройте в Медке входящую налоговую, переключите в режим электронного документа - будет вам расписано по именам полей.
Обновленная инструкция (вер. 11) лежит в программном каталоге медка.

Автор: andr_andrey 26.04.17, 11:43

Прикрепил файлы в теме в Хранилище, админ одобрит, она появится.

Автор: Petre 26.04.17, 12:00

Bernet @ Сегодня, 12:25 * ,
В вашем случае вы получили таблицу реестра, и читаете его поля.
Прочитайте поле идентификатора документа в медке;

CardCode = Reestr.FldVal("CardCode");

получите сам документ:
Doc = App.OpenDocumentByCode(CardCode);

получите нужную таблицу, или основную:
rsMain = Doc.DataSets("MAIN");

или табличную часть:
rsTab = Doc.DataSets("TAB1");

и далее читайте поля этих таблиц.

Автор: Bernet 26.04.17, 12:01

Petre @ Сегодня, 13:00 * ,
Спасибо, тоже уже понял, что не туда полез

Автор: Vofka 26.04.17, 12:59

Цитата(andr_andrey @ 26.04.17, 12:43) *
Прикрепил файлы в теме в Хранилище, админ одобрит, она появится.

Опубликовано.

Автор: Gazulo 26.04.17, 21:38

Bernet @ Сегодня, 13:01 * ,
можете кинуть пример что у Вас получилось, спасибо.

Автор: Bernet 27.04.17, 8:54

Gazulo @ Вчера, 22:38 * ,
что-то вроде такого:

    App = Неопределено;
    Попытка
        App = Новый COMОбъект("Medoc.ZApplication")
    Исключение
        Возврат;
    КонецПопытки;                
    
    // Описание входящих параметров Медка:
    // ТипДокумента - "10100" - Налоговая накладная
    // ТипДокумента - "10101" - Приложение 2
    // ТипДокумента - "10100" - Регистрация входящего налогового документа
    
    // Направление - 1 - исходящие
    // Направление - 2 - входящие
        
    prim = App.GetPrimaryDocs();
    Reestr = prim.GetPrimaryReestr("10100", 2, НачалоГода(ТекущаяДата()), КонецДня(ТекущаяДата()));
    Reestr.First();
    Счетчик = Reestr.RecordCount;
    Пока Счетчик <> 0 Цикл
        
        //ВнешИд             = Reestr.Fields.Item("EXDOC_ID").Value;
        //НомерДокМед         = Reestr.Fields.Item("DOC_NUM").Value;
        МедИД                 = Reestr.Fields.Item("DOC_ID").Value;
        ДатаДокМед          = Reestr.Fields.Item("DOC_DATE").Value;
        СуммаДокМед         = Reestr.Fields.Item("DOCSUM").Value;      
        
        CardCode = Reestr.FldVal("CardCode");
        
        Doc = App.OpenDocumentByCode(CardCode);
        
        rsMain = Doc.DataSets("MAIN");
        КонтрагентИНН    = rsMain.Fields.Item("FIRM_INN").Value;
            
        rsTab = Doc.DataSets("TAB1");
        
        СчетчикТЧ = rsTab.RecordCount;
        Пока СчетчикТЧ <> 0 Цикл
            
            Номенклатура     = rsTab.Fields.Item("TAB1_A13").Value;
            КодУКТЗЕД         = rsTab.Fields.Item("TAB1_A131").Value;
            ЦенаБезНДС        = rsTab.Fields.Item("TAB1_A16").Value;
            
            НоваяСтрока = ТабДанныхМедка.Добавить();
            НоваяСтрока.ДокументИД      = МедИД;
            НоваяСтрока.ДатаДок         = ДатаДокМед;
            НоваяСтрока.СуммаДок        = СуммаДокМед;
            НоваяСтрока.КонтрагентИНН     = КонтрагентИНН;
            НоваяСтрока.Номенклатура    = Номенклатура;
            НоваяСтрока.КодУКТЗЕД        = КодУКТЗЕД;
            НоваяСтрока.ЦенаБезНДС        = ЦенаБезНДС;
            
            СчетчикТЧ = СчетчикТЧ-1;
              rsTab.Next();    
        КонецЦикла;
                
        Счетчик = Счетчик-1;
          Reestr.Next();
    КонецЦикла;

Автор: Gazulo 27.04.17, 9:36

Bernet @ Сегодня, 9:54 * ,
Спасибо.

Автор: Vofka 27.04.17, 10:02

Цитата(Gazulo @ 27.04.17, 10:36) *
Спасибо.

Для спасибо у нас специальная кнопочка имеется.

Автор: Bernet 20.11.17, 10:25

Кстати если кто будет страдать похожей фигней - чтобы не морочить Медовую стыковку, COM-объекты и уйти от необходимости запуска Медка для чтения данных из него - есть способ лучше и проще - обращение к базе медка Firebird напрямую через ODBC драйвер. Работает быстрее и надежнее. Простым SQL запросом можно вытянуть все что необходимо.

P.S. Однако стоит помнить что такую связку лучше использовать только на чтение из Медка, записывать в базу ничего из вне не рекомендуется, т.к. хз как поведет себя потом Медок.

Автор: awp 01.12.17, 8:52

Bernet @ 20.11.17, 10:25 * ,
Есть описание таблиц и полей?

Автор: Bernet 01.12.17, 9:14

awp @ Сегодня, 8:52 * ,
Нет, в Инете не нашел, Медок тоже сморозился. Как уже мне выше подсказывали, иена большей части полей базы совпадает с той структурой которая видна в пользовательском режиме, когда переходим в режим просмотра структуры документа (есть там такая функция точно не помню как называется, когда пользователь прямо на документе видит как эти поля называются в макете). Может это немного поможет и упростит работу

Автор: Bernet 01.12.17, 11:58

У меня была задача: в налоговую автоматом подтягивать коды УКТЗЕД и признак импортного товара, проблема в том что ещё и наименования товаров у нас в базе и у поставщиков не совпадают.
Логика такая: формируем налоговую накладную - смотрим по какой реализации она создана, дальше по реализации по проводкам смотрим с какой партии списало товар (ищем поступление товаров и услуг), далее ищем по партии созданную Входящую налоговую накладную. Получаю её дату и номер. Далее по этой дате и номеру нахожу в Медке в базе нужный мне документ, перебираю все товары и проверяю есть ли товар с таким количеством, ценой и суммой как у нас в поступлении (тут конечно это пальцем в небо, если учесть что могут быть две позиции с одинаковой ценой и количеством, но бухи такое захотели, пусть теперь мучаются 19000000.gif
Если у вас что-то похожее могу дать имена таблиц и реквизитов, которые использовал - сэкономит время.

Автор: AT-2000 04.01.18, 17:59

Bernet @ 27.04.17, 8:54 * ,
а я пітаюсь прописать ИД в 1С звит потому как DOCID без дефисов а EXDOCID пустой

                Пока Счетчик <> 0 Цикл
                    Если ПустаяСтрока(Reestr.Fields.Item("EXDOC_ID").Value)Тогда
                         МедИд = Reestr.Fields.Item("DOC_ID").Value=СтрЗаменить(ИД,"-","");
                     Иначе
                         МедИд = Reestr.Fields.Item("EXDOC_ID").Value=ИД;
                    КонецЕсли;
                    НомерДокаМед = Reestr.Fields.Item("DOC_NUM").Value;
                    КонтрМед = Reestr.Fields.Item("PATRNER_IPN").Value;
                
                    Если МедИд и НомерДока = НомерДокаМед и КонтрМед = Контр Тогда
                        НаличиеВМедке = Истина;
                        ЕРНН = Reestr.Fields.Item("REGDATE").Value;
                        Если ПустаяСтрока(Reestr.Fields.Item("EXDOC_ID").Value)Тогда
                            orgId  = App.SelectFirm(СокрЛП(КодПоЕДРПОУ), СокрЛП(пФил));
                            CardCode = Reestr.FldVal("CardCode");
                            Doc = App.OpenDocumentByCode(CardCode);
                            Doc.DisableScripts();
                            rsMain=Doc.DataSets("MAIN");
                            rsMain.Edit();
                            rsMain.Fields.Item("EXDOC_ID").Value=ИД;
                            rsMain.Post();
                            Doc.EnableScripts();//включаем скрипты  
                            Doc.Save(1);  
                            Doc.Close();
                        КонецЕсли;

Автор: zay 29.07.20, 11:32

Делаю задачу. В рамках задачи надо было получить некоторые данные из НН из базы Медок. Клиент не покупал модуль интеграции, поэтому пришлось разобраться как получать данные из Медка прямыми запросами. Хочу поделиться

Для отладки SQL запросов к базе Firebird использовал программу "SQL Manager for InterBase/Firebird". Входит в пакет "SQL Management Studio for InterBase/Firebird", использование 30 дней бесплатно

Запрос, которым можно получить список таблиц базы и их объем

SELECT I.rdb$relation_name RELATION,
  cast(1/I.RDB$STATISTICS as integer) RECORD_COUNT
  FROM RDB$INDICES I
  JOIN RDB$RELATION_CONSTRAINTS C
  ON (C.RDB$INDEX_NAME = I.RDB$INDEX_NAME)
  AND (C.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY')
  AND (I.RDB$STATISTICS > cast(0 as double precision))

Запрос взят отсюда https://pro1c.org.ua/redirect.php?http://www.ibase.ru/sysqry/
Эту информацию можно использовать для поиска нужного справочника

С документами все проще. В Медке при открытии документа он открывается на отдельной странице. Заголовок страницы - это часть имени таблицы БД



Документ в Медок состоит минимум из двух таблиц. Имя таблицы с реквизитами документа заканчивается на _MAIN, имя таблицы с табличной частью заканчивается на _TAB1, _TAB2 и т.д. Связь между этими таблицами по полю CARDCODE
Пример запроса для получения данных из НН
select
  MAIN.*
, T.*
from FJ1201002_MAIN AS MAIN
INNER JOIN FJ1201002_TAB1 AS T
      ON T.CARDCODE = MAIN.CARDCODE


Расшифровку имен полей для НН нашел здесь: https://pro1c.org.ua/redirect.php?https://medoc.ua/pdf/dbf_to_pcmedoc.pdf

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua