Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/41: Рейтинг темы: голосов - 41, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 01.12.2008
Сообщений: 25
1

Обмен данными внешней бд и 1с 8

28.03.2012, 10:37. Показов 7882. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть внешняя БД, нужно из нее внести данные в документ Списание материалов. Документ вроде создается, заполняется, но при попытке записи говорит "Не удалось записать документ"
вот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
exe1c:=CreateOleObject('V82.COMConnector');
  base1c:=exe1c.Connect('File="'+Expdlg.Edit3.Text+'"; Usr="'+Expdlg.Edit4.Text+'"; Pwd="'+Expdlg.Edit5.Text+'"');
.......
if not VarIsEmpty(base1c) then
            begin
            dok:=base1c.Документы.МЗ_Списание.СоздатьДокумент();     
            if not VarIsEmpty(dok) then
              begin
              dok.Дата:=Expdlg.DateTimePicker1.Date;
              dok.Учреждение:=base1c.Справочники.Организации.НайтиПоНаименованию('учрж');
              dok.ВидОперации:=base1c.Справочники.ВидыОпераций.МЗ_Списание_Прочее; 
              dok.ВидПервичногоДокумента:=base1c.Справочники.ВидыПервичныхДокументов.НайтиПоНаименованию('Требование-накладная М11');
              dok.ЦМООтправитель:=base1c.Справочники.ЦМО.НайтиПоНаименованию('мол');
              dok.Комментарий:='Загружено из "внешняя бд" '+trim(DM.IBQTemp1.FieldByName('NAME_O').AsString);
              dok.Баланс:=base1c.Справочники.Баланс.НайтиПоНаименованию(trim(DM.IBQTemp.FieldByName('NAME_IF').AsString));
              dok.КВД:=trim(DM.IBQTemp.FieldByName('KFO').AsString);
              dok.СчетДебета:=trim(DM.IBQTemp.FieldByName('D_SC').AsString);
              dok.КБКСчетДебета:=trim(DM.IBQTemp.FieldByName('D_KPS').AsString);
              dok.КОСГУСчетДебета:=trim(DM.IBQTemp.FieldByName('D_KEK').AsString);         
              med:=dok.Материалы;
 
              medstr:=med.Добавить();
  medstr.Номенклатура:=base1c.Справочники.Номенклатура.НайтиПоНаименованию(trim(DM.IBQTemp2.FieldByName('NAME_M').AsString));
              medstr.СчетКредита:=trim(DM.IBQTemp.FieldByName('K_SC').AsString);
              medstr.КБКСчетКредита:=trim(DM.IBQTemp.FieldByName('K_KPS').AsString);
          medstr.КОСГУСчетКредита:=trim(DM.IBQTemp.FieldByName('K_KEK').AsString);
          medstr.ЕдиницаИзмерения:=trim(DM.IBQTemp2.FieldByName('EDIZM').AsString);
              medstr.Количество:=Abs(DM.IBQTemp2.FieldByName('KOLVO').Value);
              dok.Записать();
              end;
            end;
Подскажите где ошибка.
 Комментарий модератора 
Теги кода исправлены модератором. Для оформления кода Delphi следует выделить этот код и на панели редактирования сообщения нажать кнопку: "DELPHI".
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.03.2012, 10:37
Ответы с готовыми решениями:

Обмен данными
Есть программка (написана на Турбо Паскаль 7.0) и есть другая программа, которая написана на...

NW.js Обмен данными
Пишу простенькое приложение на NW.js, буквально 4 окна. Использую html, bootstrap, jquery Возник...

Обмен данными 7.7
Данная обработка обеспечивает перенос документов и справочников между идентичными конфигурациями...

Обмен данными
Привет всем! У меня возникла такая проблема - нет пункта в меню "сервис" - "обмен данными". Версия...

16
569 / 292 / 12
Регистрация: 28.01.2011
Сообщений: 1,326
28.03.2012, 10:47 2
Внешняя база на чем крутится?
И на чем крутится 1С?
Я бы предложил пойти с другой стороны.
Написать обработку для загрузки в 1с.
0
0 / 0 / 0
Регистрация: 01.12.2008
Сообщений: 25
28.03.2012, 11:06  [ТС] 3
внешня бд Firebird
1c Бухгалтерия государственного учреждения, редакция 1.0 (1.0.10.2)
в общем то обработка есть, но там присутствует "человеческий фактор", нужно выбирать файл для загрузки и т.д. Хочется сделать полную автоматизацию
0
569 / 292 / 12
Регистрация: 28.01.2011
Сообщений: 1,326
29.03.2012, 04:39 4
Цитата Сообщение от rdama Посмотреть сообщение
И на чем крутится 1С?
Это вопрос о том на какой платформе? Win или Lin?
Можно написать модуль для загрузки и повесить его регламентным заданием. Вот тебе и полная автоматизация.
0
0 / 0 / 0
Регистрация: 01.12.2008
Сообщений: 25
29.03.2012, 06:11  [ТС] 5
Цитата Сообщение от rdama Посмотреть сообщение
Это вопрос о том на какой платформе? Win или Lin?
Можно написать модуль для загрузки и повесить его регламентным заданием. Вот тебе и полная автоматизация.
какая разница??? даже в регламентном задании надо писать код на создание документов в 1с, а именно это и не получается
0
569 / 292 / 12
Регистрация: 28.01.2011
Сообщений: 1,326
29.03.2012, 09:34 6
Ну вот разница огромна. У меня крутится на Centos и поэтому прямо зацепиться за базу для импорта данных я не могу. Ибо ADO в этом контексте не фурычит, а unixODBC я пака не победил.
А так это самый лучший вариант который можно придумать 1С сама цепляется и берет то что нужно.
С клиента за здрасти.
Прежде чем переносить код в делфи отладте его в 1С.
В 1С ваш код работает?
даже в регламентном задании надо писать код на создание документов в 1с, а именно это и не получается
Это не такая большая задача если ты понимаешь что делаешь.
Во всяком случае у меня нет проблем и из оракловой БД дернуть инфу и собрать документы. А я собираю много доков.
Так же и нет проблемы импорта из БД СКД в 1С. Своими сервисами на делфи писаными. Правда там подход совсем иной использован нежели у вас.
И все это без проблем с вебом работает который на пыхе писанный.
Так что
Цитата Сообщение от Liones Посмотреть сообщение
какая разница???
огромная разница. Поверьте как человеку который разными способами уже прошелся.
Да и я тут не просто так затеял с вами беседу, а ставлю целью вам помочь. А не выяснять какая разница.
Весь вопрос в том, что сейчас не верный подход к решению задачи. 1С умеет работать как COM но поведение крайне не предсказуемое.
И при этом есть необходимость держать на клиенте оба приложения.
Или вы обращаетесь к COM интерфейсу 1C на удаленной машине?
А дальше больше. Если у вас еще и MS SQL Server то можно писать в базу на прямую. Только надо знать в куда что писать, но и это выяснить не так сложно.
База у 1С хоть и извратная, но понятная при знании что и как между собой связано.
И каким образом можно получить GUID(он же ссылка на объект в контексте 1С) для записи в БД.
0
0 / 0 / 0
Регистрация: 01.12.2008
Сообщений: 25
29.03.2012, 09:40  [ТС] 7
Цитата Сообщение от rdama Посмотреть сообщение
В 1С ваш код работает?
работает, без проблем

Цитата Сообщение от rdama Посмотреть сообщение
И при этом есть необходимость держать на клиенте оба приложения.
Или вы обращаетесь к COM интерфейсу 1C на удаленной машине?
оба приложения на одном клиенте
0
569 / 292 / 12
Регистрация: 28.01.2011
Сообщений: 1,326
29.03.2012, 09:47 8
Ну так вот я вам предлагаю собрать на стороне 1С модуль.
В котором вы опишите:
1. Соединение с БД огнептица
Как подключиться к базе Firebird из 1С8
Connection strings for Firebird

2. Получение набора данных из БД огнептица
3. Сборку документа. Как в процедуру сборки документа передать набор сами разберетесь?
4. Необходимые вспомогательные функции...
5. Обертка для вызова в регламентном задании (с ключевым словом Экспорт)
После этого собираете задание. Которое будет дергать процедуру обертку.
И будет вам счастье. Без Делфи и танцев.
1
0 / 0 / 0
Регистрация: 01.12.2008
Сообщений: 25
29.03.2012, 09:50  [ТС] 9
Цитата Сообщение от rdama Посмотреть сообщение
1. Соединение с БД огнептица
2. Получение набора данных из БД огнептица
а где бы почитать про это, не подскажете?
 Комментарий модератора 
Напоминаю. Если посты оказались полезными - очень приветствуется их отмечать нажатием кнопки "+1 Спасибо".
0
569 / 292 / 12
Регистрация: 28.01.2011
Сообщений: 1,326
29.03.2012, 09:52 10
Уже подкинул в предыдущий свой пост
0
0 / 0 / 0
Регистрация: 01.12.2008
Сообщений: 25
29.03.2012, 13:13  [ТС] 11
вот еще бы как параметры в запросы передавать
0
569 / 292 / 12
Регистрация: 28.01.2011
Сообщений: 1,326
30.03.2012, 06:05 12
Лучший ответ Сообщение было отмечено как решение

Решение

Давай завтра на работе. У меня там и исходнички есть. Различного рода.

Добавлено через 15 часов 48 минут
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Функция ПолучитьТекстЗапроса(ТипВыгрузки,ДатаНачало,ДатаКонец) Экспорт
//Грузим Банк 
    Если ТипВыгрузки = 0 Тогда
        Запрос = "SELECT '' as sale_date,'' as master_code,t.work_date,LPAD(ORA_HASH(Concat(t.work_date,vrc.inn)),7) as ID_NUM, SUM(t.amount_fixed) AS Summa,vrc.name,vrc.inn,vrc.kpp FROM (select work_date, "+ 
                "(select to_char(default_customer) from ref_contractors rc where rc.id=id_contractor) as id_contractor, "+
                "SUM(amount) as amount_fixed "+
                "from abt.view_doc_money_2007 "+
                "where work_date "+
                    "between to_date('"+ДатаНачало+"','dd.mm.yyyy HH24:mi:ss') "+
                    "and to_date('"+ДатаКонец+"','dd.mm.yyyy HH24:mi:ss') "+
                "and master_type = 8 "+
                "and id_storage_reciepient = 52701 and id_seller not in (236575800,277751100)"+
                "GROUP BY work_date, id_contractor) t, abt.view_ref_customers vrc "+
            "where vrc.id = t.id_contractor " +
            "GROUP BY vrc.inn,vrc.name,vrc.kpp,t.work_date";
    КонецЕсли;
//Грузим продажи       
    Если ТипВыгрузки = 1 Тогда
        Запрос = "SELECT '' as sale_date,'' as master_code,t.work_date,LPAD(ORA_HASH(t.work_date),7) AS ID_NUM,TO_CHAR(t.summ_fixed) as Summa,vrc.name,vrc.inn,vrc.kpp " + 
                    "FROM (SELECT LAST_DAY(delivery_date) as work_date,SUM(total_summ) AS summ_fixed, id_customer " +
                            "FROM abt.view_doc_goods_1c WHERE delivery_date " +
                    "between to_date('"+ДатаНачало+"','dd.mm.yyyy HH24:mi:ss') " +
                    "and to_date('"+ДатаКонец+"','dd.mm.yyyy HH24:mi:ss') " +
                "GROUP BY id_customer, LAST_DAY(delivery_date)) t, abt.view_ref_customers vrc " + 
                "WHERE vrc.id = t.id_customer";
    КонецЕсли;
//Грузим кассу       
    Если ТипВыгрузки = 2 Тогда
        Запрос = "SELECT t.sale_date,t.master_code, t.work_date,LPAD(ORA_HASH(Concat(t.work_date,vrc.inn)),7) AS ID_NUM, SUM(t.amount_fixed) AS Summa,vrc.name,vrc.inn,vrc.kpp FROM " +
                    "(SELECT vdm.sale_date,vdm.work_date,vdm.master_code, " +
                        "(SELECT to_char(default_customer) FROM ref_contractors rc where rc.id = vdm.id_contractor) AS id_contractor, " +
                            "SUM(vdm.amount) as amount_fixed " +
                        "FROM abt.view_doc_money_2007 vdm " +
                        "WHERE vdm.work_date " +
                            "BETWEEN TO_DATE('"+ДатаНачало+"','dd.mm.yyyy HH24:mi:ss') " +
                            "AND TO_DATE('"+ДатаКонец+"','dd.mm.yyyy HH24:mi:ss') " +
                            "AND vdm.master_type = 8 " +
                            "AND vdm.id_storage_reciepient = 52601 " +
                        "GROUP BY vdm.work_date,vdm.master_code, id_contractor,vdm.sale_date) t, abt.view_ref_customers vrc " +
                    "WHERE vrc.id = t.id_contractor " +
                    "GROUP BY vrc.inn,vrc.name,vrc.kpp,t.work_date,t.master_code,t.sale_date";
    КонецЕсли; 
    Возврат Запрос;
КонецФункции
Вот у меня таким макаром собирается запрос.
ДатаНачало и ДатаКонец это параметры (2 поля ввода на форме). В твоем случае надо просто определить откуда брать параметры.
Но смысл того как передать я думаю понятен.
1
0 / 0 / 0
Регистрация: 01.12.2008
Сообщений: 25
02.04.2012, 06:14  [ТС] 13
Спасибо, разобралась, все работает
0
DS-Master
12.07.2012, 11:55 14
Уважаемый Rdama, рассмотренный вами вопрос и предложенный материал весьма полезны.
Прошу вас подсказать как специалиста в данном вопросе. С какими БД еще может соеденяться 1С кроме Firebird? И какая для таких обменов БД будет оптимальна.

Я разрабатываю производственную программу для управления производством и станками, но очень хочется сразу определить как свою БД хорошо подружить с 1С (8.0 или 8.2). Знаю, что 1С сидит на MS SQL.
569 / 292 / 12
Регистрация: 28.01.2011
Сообщений: 1,326
12.07.2012, 16:49 15
DS-Master, ну я дружил 1С с ораклом/аксесом/екселем в качестве источника данных.
В данном топике с огнептицей.
В принципе в плане обмена данными 1С можно подружить со всем с чем можно работать через ADO. Во всяком случае я шел именно через эту технологию. Думаю что через ODBC тоже вполне реально работать у меня не было необходимости.
Ну а в MS вообще можно писать напрямую, только надо знать что и куда.
Что вы хотите со своей БД положить в 1С?
А самое главное зачем это 1С?
Потому что тут тоже есть различные варианты работы.
Есть извратные, есть попроще. Есть совсем простые.
Ну и 1С не всегда может работать с MS. Тут скорее вопрос локальный или вы хотите глобальное решение, независящее от инфраструктуры?
1
DS-Master
21.07.2012, 14:06 16
Извиняюсь за задержку, ездил в командировку.
Уважаемый Rdama, у нас имеется несколько производственных площадок по России, в 1С они уже все объединены. Производственные программы на каждой площадке отдельные не централизованы. Основное место соприкосновение это заказы, в 1С - коммерческая часть, а в производственной программе техническая. Соответственно для планирования производства есть необходимость синхронизации факта оплаты, предоплаты, гарантийного письма, отгрузки и остальное по мелочи. Хочется это оформить без дополнительных внешних обработок. Т.е. происходит проводка или какая то другая операция в 1С и параллельно выполняется хранимая процедура или SQL запрос в БД производственной программы и наоборот что то брать из БД производственной программы.
На ограничения с БД я догадывался, что они висят на ограничениях ADO. Спасибо.
569 / 292 / 12
Регистрация: 28.01.2011
Сообщений: 1,326
25.07.2012, 04:17 17
DS-Master, если более подробно опишешь, что и как должно происходить, то можно будет и найти решение твоей проблемы.
Но первый вопрос это. У тебя типовые конфы 1С или самописные?
Т.к. для передачи данных явно придется собирать регистры и назначать им регистраторы в виде уже существующих доков. Ну и возможно придется пописать еще кой какой код в уже существующие объекты 1С.
0
25.07.2012, 04:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2012, 04:17
Помогаю со студенческими работами здесь

Обмен данными
Привет всем! Нужно передать данные из html странички открытой в браузере и находящейся на...

Обмен данными в 8.1
Добрый день. Можно ли организовать обмен (или хотябы загрузка\выгрузка по требованию) между двумя...

Обмен данными
Прошу помощи тех, кто имеет опыт обмена данными между разными конфигурациями. Есть внешняя...

Обмен данными с 1С 8.2
Пишу программу для выгрузки товаров из 1С 8.2 Управление торговлей 11 на сервер MySql. Получаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru