Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Импорт платежек из внешней БД  (Прочитано 5319 раз)
0 Пользователей и 1 Гость смотрят эту тему.
krushik
Гость
« : 24-09-2008 19:38 » 

Ни у кого случаем нет обработки для импорта платежек из внешней БД Mysql? Т.е. из таблицы в базе берется инфа по платежке, по этой инфе генерится платежка в 1с бух-я и так по всей таблице. Или по крайней мере пример корректного программного создания платежки с заполнением всех полей, а работу с внешней базой сам напишу.
Плюс надо научиться экпортить из бухии выписки с расчетного счета с входящими платежами в ту же БД Mysql. Но этого я еще не касался.
Записан
Harry
Модератор

ua
Offline Offline

« Ответ #1 : 25-09-2008 09:49 » 

Вот пример экспорта из дбф-файла в банковскую выписку. Не Mysql, но может пригодится хотя бы кусок непосредственного создания платежки.

Процедура Сформировать()
   ВыбранныйФайл="";
   ФС.ВыбратьФайл(0,ВыбранныйФайл,"D:\1CBasesTemp\FolderIn\","Выберите файл загрузки", "Файлы .dbf (*.dbf) |*.dbf",".dbf",);
   Спр=СоздатьОбъект("Справочник.ВалДоходыРасходы");
   ДБФ=СоздатьОбъект("XBase");
   
   Опер=СоздатьОбъект("Операция");
   ТабЗн=СоздатьОбъект("ТаблицаЗначений");
   ТабЗн.НоваяКолонка("ДатаОст");
   ТабЗн.НоваяКолонка("СуммаГрн");
   ТабЗн.НоваяКолонка("Контрагент");
   ТабЗн.НоваяКолонка("Примечание");
   ТабЗн.НоваяКолонка("Назначение");

   
   ДБФ.ОткрытьФайл(ВыбранныйФайл);
   Сообщить(ВыбранныйФайл);
   ДБФ.Первая();
   Пока ДБФ.ВКонце()=0 Цикл
      Состояние("Обработка файла: "+Формат(ДБФ.НомерЗаписи()/ДБФ.КоличествоЗаписей()*100,"Ч15.2")+" %");
      ТабЗн.НоваяСтрока();
      ТабЗн.ДатаОст=ДБФ.DATAOPL;
      //ТабЗн.Направление=ДБФ.NAPRAVL;
      ТабЗн.СуммаГрн=ДБФ.SUMMSYS;
      ТабЗн.Назначение=ДБФ.NAIMOPL;
      ТабЗн.Контрагент=ДБФ.NAIM;
      ТабЗн.Примечание=ДБФ.PRIMECH;
      //ТабЗн.СтатьяЗатрат=ДБФ.KODOPL;
      
      ДБФ.Следующая();
   КонецЦикла;
   ДБФ.ЗакрытьФайл();
   
   //ТабЗн.Свернуть("1,3","2");   
   
   Если Нам=1 Тогда
      ДокБезнал=СоздатьОбъект("Документ.БанковскаяВыписка");
      ДокБезнал.Новый();
      ДокБезнал.Фирма=Константа.БазФирма;
      ДокБезнал.ДатаДок=ТабЗн.ДатаОст;
      ДокБезнал.РСчет=ВыбСчет;
      ДокБезнал.СчетУчета=СчетПоКоду("311");
      
      
      ТабЗн.ВыбратьСтроки();
      Пока ТабЗн.ПолучитьСтроку()=1 Цикл
         ДокБезнал.НоваяСтрока();
         ДокБезнал.ПриходРасход=Перечисление.ПлюсМинус.Плюс;
         ДокБезнал.Счет=СчетПоКоду("361");
         ДокБезнал.ВидНДС=Константа.БазНДС;
         ДокБезнал.СуммаСНДС=ТабЗн.СуммаГрн;
         ДокБезнал.НДС=ДокБезнал.СуммаСНДС/6;
         ДокБезнал.СуммаПлатежа=ДокБезнал.СуммаСНДС-ДокБезнал.НДС;
         ДокБезнал.Содержание=ТабЗн.Назначение;
         ДокБезнал.НазначитьТип("ВидПриходаРасхода","Перечисление.ВидыПриходаДенег");
         ДокБезнал.ВидПриходаРасхода = ?(ПустоеЗначение(ДокБезнал.ВидПриходаРасхода) = 1,Перечисление.ВидыПриходаДенег.ВыручкаОтРеализации,ДокБезнал.ВидПриходаРасхода);
           ДокБезнал.ДоходИздержка=Перечисление.ПлюсМинусНичего.Плюс;  
         Спр.НайтиПоКоду("1",0);
         ДокБезнал.СубконтоДИ=Спр.ТекущийЭлемент();  
            ДокБезнал.УказанаОтгрузка=Перечисление.ДаНет.Нет;
         ДокБезнал.НазначитьТип("Субконто",ДокБезнал.Счет.ВидСубконто(1));
         //ДокБезнал.НазначитьТип("Заказ",ДокБезнал.Счет.ВидСубконто(2));
         ДокБезнал.НазначитьТип("Заказ","Строка");
         ДокБезнал.Заказ = ТабЗн.Контрагент;
         //ДокБезнал.Субконто = ДокБезнал.Счет.Субконто(2);
         //ДокБезнал.Заказ = ДокБезнал.Счет.Субконто(3);         
      КонецЦикла;
      ДокБезнал.Записать();
   Иначе
      ДокБезнал=СоздатьОбъект("Документ.БанковскаяВыписка");
      ДокБезнал.Новый();
      ДокБезнал.Фирма=Константа.БазФирма;
      ДокБезнал.ДатаДок=ТабЗн.ДатаОст;
      ДокБезнал.РСчет=ВыбСчет;
      ДокБезнал.СчетУчета=СчетПоКоду("311");
      
      
      ТабЗн.ВыбратьСтроки();
      Пока ТабЗн.ПолучитьСтроку()=1 Цикл
         ДокБезнал.НоваяСтрока();
         ДокБезнал.ПриходРасход=Перечисление.ПлюсМинус.Минус;
         ДокБезнал.Счет=СчетПоКоду("631");
         ДокБезнал.ВидНДС=Константа.БазНДС;
         ДокБезнал.СуммаСНДС=ТабЗн.СуммаГрн;
         ДокБезнал.НДС=ДокБезнал.СуммаСНДС/6;
         ДокБезнал.СуммаПлатежа=ДокБезнал.СуммаСНДС-ДокБезнал.НДС;
         ДокБезнал.Содержание=ТабЗн.Назначение;
         ДокБезнал.НазначитьТип("ВидПриходаРасхода","Перечисление.ВидыПриходаДенег");
         ДокБезнал.ВидПриходаРасхода = ?(ПустоеЗначение(ДокБезнал.ВидПриходаРасхода) = 1,Перечисление.ВидыРасходаДенег.НаВедениеХозДеятельности,ДокБезнал.ВидПриходаРасхода);
           ДокБезнал.ДоходИздержка=Перечисление.ПлюсМинусНичего.Минус;  
         Спр.НайтиПоКоду("1",0);
         ДокБезнал.СубконтоДИ=Спр.ТекущийЭлемент();  
            ДокБезнал.УказанаОтгрузка=Перечисление.ДаНет.Нет;
         ДокБезнал.НазначитьТип("Субконто",ДокБезнал.Счет.ВидСубконто(1));
         //ДокБезнал.НазначитьТип("Заказ",ДокБезнал.Счет.ВидСубконто(2));
         ДокБезнал.НазначитьТип("Заказ","Строка");
         ДокБезнал.Заказ = ТабЗн.Контрагент;
      КонецЦикла;
      ДокБезнал.Записать();
   КонецЕсли;
КонецПроцедуры
//*********************************************
Записан

Слабый пол силен в силу слабости сильного пола к слабому
krushik
Гость
« Ответ #2 : 25-09-2008 18:01 » 

ок, спасибо.
Еще вопрос, в 1с 7.7 ведь нет проверки уникальности реквизитов? т.е. я об алгоритме создания платежки: надо сначала взять с БД поля платежки, потом создать платежку в 1с, начать заполнять поля в ней; элементарные поля типа суммы платежа вписывать сразу, а сложные вроде контрагента или банковского счета, которые определены  своих справочниках сначала искать существующие там, и только если таковых нет, то создавать сначала их в тех справочниках? конструкция должна быть по виду такой:

НовПлатежка = СоздатьОбъект("Документ.ПлатежноеПоручение");
НовПлатежка.Новый();
СпрКонтр = СоздатьОбъект("Справочник.Контрагенты");
//Проверяем, фигурировал ли ранее текущий контрагент:
Если (СпрКонтр.НайтиПоРеквизиту("ИНН", "1234567890", 1) = 1)
//Если да, то вписываем в платежку его:
Тогда НовПлатежка.Контрагент = СпрКонтр.ТекущийЭлемент();
//Иначе, создаем нового контрагента в справочнике контрагентов и потом вписываем в платежку его:
Иначе ......

?
Записан
Harry
Модератор

ua
Offline Offline

« Ответ #3 : 26-09-2008 05:32 » 

Да, совершенно верно. В примере все реквизиты были известны, со справочниками контрагентов, валют, банков и т.д. сначала проверяем.
Записан

Слабый пол силен в силу слабости сильного пола к слабому
Kivals
Модератор

us
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 26-09-2008 08:45 » 

Для улучшения читабельности кода я обычно поиск/создание выношу в функцию:
Код:
Функция КонтрагентПоИНН(ИНН)
Спр=СоздатьОбъект("Справочник.Контрагенты");
Если (Спр.НайтиПоРеквизиту("ИНН", "1234567890", 1) = 0) Тогда
//Создаем нового контрагента в справочнике контрагентов
Спр.Новый();
Спр.ИНН=ИНН;
...
Спр.Записать()
КонецЕсли;
Возврат Спр.ТекущийЭлемент();
КонецФункции

Процедура Сформировать()
...
Док=СоздатьОбъект("Документ.ПлатежноеПоручение");
Док.Новый();
Док.Контрагент=КонтрагентПоИНН("1234567890");
...
КонецПроцедуры

а доступ к MySQL - через ODBC прекрасно работает (только нужно ODBC драйвер скачать: поск в гугле по "MySQL ODBC 3.51 Driver"):
Код:
СтрокаСоединения=Шаблон("driver={MySQL ODBC 3.51 Driver};Database=[БазаДанных];"+
  "server=[СерверБД];uid=[ИмяПользователяБД];pwd=[ПарольБД]");

DB=CreateObject("ADODB.Connection");
DB.Open(СтрокаСоединения);

Cmd=CreateObject("ADODB.Command");
Cmd.ActiveConnection=DB;
Cmd.CommandText="select * from table";

RS=CreateObject("ADODB.Recordset");
RS.Open(Cmd);

While (RS.EOF()=0) Do
Зн=RS.Fields("НазваниеПоля").Value;
...
RS.MoveNext();
EndDo;
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines