СБиС news №48 от 03.07.01
Автоматическое
создание документа
на примере импорта данных из системы «клиент-банк»
Уже достаточно давно в СБиС’е есть возможность обмена
информацией с системами «клиент-банк». К сожалению, пока этот процесс был односторонним
– можно было экспортировать данные из СБиС’а для последующего импорта их в
«клиент-банк», но не наоборот.
Дело в том, что не существует стандарта на обмен информации
с системами «клиент-банк». Все такие системы имеют разные форматы обмена (как в
виде текстовых, так и dbf-файлов),
которые к тому же периодически меняются. Поэтому закладывать поддержку всех
форматов в код программы было нецелесообразно.
С выходом версии 1.9 ситуация коренным образом изменилась.
Теперь благодаря появлению функций создания записей базы данных и работы с
текстовыми и dbf-файлами
появилась реальная возможность реализовать импорт в СБиС платежных документов
практически из любой системы «клиент-банк».
По большому счёту цель данного выпуска как раз не столько
поговорить о системах «клиент-банк», сколько на реальном жизненном примере
ознакомить Вас с вышеупомянутыми и нижеразбираемыми новыми функциям версии 1.9.
Но для начала небольшое предупреждение.
Внимание! Attention!
Achtung! L'attention!
Используя описанные ниже функции, Вы вторгаетесь в сложный
внутренний мир СБиС’а, поэтому настоятельно рекомендуем все эксперименты проводить
только на тестовой базе, так как неправильное использование этих функций может
привести к нарушению целостности базы данных и работоспособности программы.
Ну, вот… и не говорите, что мы Вас не предупреждали… а
теперь приступим.
Общая схема импорта
Импортировать платёжные поручения мы будем, выполняя типовую операцию
прямо из реестра входящих платёжных поручений. Так что наша с Вами задача –
написать типовую операцию, которая сделает следующее:
а) прочитает данные
из системы «клиент-банк»;
б) создаст
документ;
в) занесёт
в документ считанные данные;
г) поместит
документ в базу данных СБиС’а.
Чтение внешних файлов
Как уже говорилось в 40-ом выпуске СБиС ньюс, появилась
возможность работать с внешними файлами примерно так же, как с таблицами базы
данных. Делается это примерно так:
оЗапись = Объект( "import.txt" );
Пока( Следующий( оЗапись ) )
{
# обрабатываем строку файла, например:
Сообщить( оЗапись.Строка );
}
Здесь мы построчно читаем текстовый файл с именем «import.txt». Тут используется то, что функция
«Объект» теперь смотрит, не указано ли в качестве параметра имя файла с
расширением, и если встречает знакомое расширение, то конструирует объект на
указанном файле. Далее при помощи этого
объекта можно читать и изменять файл.
СБиС понимает три типа файлов, со следующими расширениями: «dbf» – обычный dbf-файл, «txt» – текстовый файл, «db» – файл СУБД Paradox.
В случае «dbf»
и «db» файлов в cконструированном объекте все
поля будут доступны под теми же именами, что и в исходном файле. То есть, если
в файле «import.dbf» есть поле «CODE», то можно написать так:
оЗапись = Объект( "import.dbf" );
Пока( Следующий( оЗапись ) )
Сообщить( оЗапись.CODE );
В случае же текстового файла в объекте будет доступно одно
единственное поле с именем «Строка». Причём, если длина строки
текстового файла превысит 255 символов, то эта строка будет считываться несколько
раз частями по 255 символов.
Создание документа
Итак, с извлечением информации из внешнего файла, который
будет готовиться в системе «клиент-банк», мы разобрались. Теперь обратимся к
самому интересному – автоматическому созданию документа средствами встроенных
функций.
Сначала необходимо создать объект, хранящий запись таблицы «Документ».
Потом мы эту запись заполним и уже готовую внесём в базу данных.
На первый взгляд
напрашивается использование такой конструкции:
оДокумент = Объект("Документ");
И в принципе, это вроде бы должно работать, но…
Дело в том, что документы в СБиС’е достаточно сложно
устроены. В частности, платёжные поручения реально состоят из двух записей –
записи таблицы «Документ» и связанной с ней по связи «Документ_»
записи таблицы «Платежные документы». Именно во второй записи лежат
такие поля, как «Вид платежа», «Очередность» и так далее. Причём СБиС-то уже
знает, из каких записей состоит данный документ. Так почему бы не воспользоваться
этими его знаниями?
Фактически описание того, какие записи входят в данный
документ, лежит в описании выборки из базы данных, которое в свою очередь
находится в файле ресурсов. (Особо любознательные могут открыть Джином файл «rasch.rs», не забыв перед этим
открыть «!sbis.dic», и посмотреть
описание выборки «Входящие платежи». Там в табличке «Активные связи»
как раз и видна строчка «Документ_|Платежные документы».)
И тут нам поможет функция «Выборка», которая была
описана в 46-ом выпуске СБиС ньюс. Эта функция так же, как и функция «Объект»,
конструирует объект, только в его основе лежит запись не таблицы, а выборки. То
есть в нашем случае пишем
оДокумент = Выборка("Входящие платежи");
…и получаем объект, содержащий запись именно платежного
поручения, а не некоторого абстрактного документа.
Заполнение полей документа
При заполнении полей типа «строка», «дата», «деньги» и им
подобных никаких проблем не возникает – присваиваем им нужные значения и всё.
Сложнее обстоит дело с полями связи. Но мы ведь не боимся
трудностей! Для их преодоления (а также для создания массы новых) создана
функция «Связать» (СБиС ньюс №40). Пояснить, как она работает, лучше
всего на примерах.
Помещение документа в папку
Первое, с чем придётся столкнуться – это с тем, как
заставить документ оказаться в текущей папке. Делается это так:
Связать( оДокумент.Папки, Папки );
Попробуем разобраться, что тут к чему.
оДокумент.Папки
– это поле связи, которое мы устанавливаем. В нашем случае это иерархия «Папки»
таблицы «Документ», которое как раз и отвечает за размещение документов по
папкам.
Папки
– а это объект, с которым мы будем связывать вышеуказанное поле. Поскольку мы
выполняем типовую операцию, а она выполняется в контексте текущего
документа, то такая запись будет
обозначать папку текущего документа.
Установка Лица1
Следующим этапом нашей работы будет установка поля «Лицо1».
Допустим, что во внешнем файле был записан ИНН организации, тогда пишем так:
Л1 = Лицо( ИНН, "Организации" );
Связать( оДокумент.Лицо1, Л1 );
Но это будет работать только, если организация с таким ИНН
уже есть в справочнике организаций. В противном случае можно либо внести новую
организацию в справочник примерно так же, как мы сейчас вносим документ, либо
просто выдать сообщение об ошибке и заставить пользователя вводить организацию
вручную.
Установка правила операций
Скорее всего, устанавливать правило операции не потребуется,
так как оно берётся из предыдущего документа. Но, если уж очень захочется, то
можно написать примерно следующее:
оПравило = Объект( "Правила операций" );
оПравило.Имя = "Оно";
Если( Найти( оПравило, "Имя" )>0 )
Связать(’оДокумент.Правила-Документы’,
оПравило);
Тут при помощи функции «Найти» ищется правило с
именем «Оно» и, если таковое имеет место быть, то устанавливается в наш
документ.
Установка расчётного счёта
Следующим этапом наших манипуляций будет установка Вашего
расчётного счёта. Для этого придется перебрать все расчётные счета Вашей
организации и найти нужный по номеру.
оРСчет = Объект( "Расчетные счета" );
Пока( Следующий( Лицо0, РСчет, "Лица-Р/с" ) )
Если( 'РСчет.Р/счет' == НашРСчет )
{
Связать(
’оДокумент.Документ_>Нашр/с-Платежи’,
РСчет);
Прервать();
}
Абсолютно аналогично устанавливается связь с расчётным
счётом отправителя.
Занесение документа в БД
Ну, и, наконец, собственно помещение документа в базу
данных. Это делается при помощи функции «Добавить» (СБиС ньюс №40)
следующим образом:
Добавить(оДокумент);
Если всё было сделано правильно, то можно наслаждаться видом
свежесозданного документа.
Ну, и в заключение. Всё вышеописанное реализовано в варианте
импорта данных из системы «клиент-банк» Ярсоцбанка. Если у Вас установлена
другая система и есть желание вкачивать из неё платежные поручения,
обращайтесь! Обязательно поможем.
<<< Предыдущий выпуск | Архив выпусков | Следующий выпуск >>>
|