СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФ И опять сюрприз от СБ – все документы по ВЭД теперь нас заставили предоставлять только в электронном виде, и сделать это можно только через СПЭД. О его развёртывании и настройке и пойдёт речь.

Сам продукт мне лично понравился. Он куда лучше адаптирован к использованию в корпоративных средах, чем “родной” клиент-банк СБ РФ, да и большинство клиентских систем других банков. Поэтому, отчасти, я даже благодарен СБ за то, что они нас всё-таки вынудили применить СПЭД (до сего момента мы избегали перехода на СПЭД по той причине, что поддержка целиком будет в СПб, а мы и в своём городе с трудом можем получить консультацию от СБ, а что уж говорить о консультации из СПб).

Канал до ФПСУ

Так как мы будем использовать СПЭД в роли клиент-банка СБ РФ, нам потребуется защищённые (с помощью Амикон ФПСУ IP/Клиента) канал до банка. По этому поводу написал несколько статей, рекомендую наиболее гибкий с моей точки зрения вариант с выделенными ФПСУ маршрутизаторами.

Дистрибутив

Дистрибутив мы получили из банка. Приведу его описание с самого диска:

  • 1-53-03 – содержит дистрибутив Рабочего места версии 1.53.03
  • K-0XX-YYYY, где ХХ – код отделения, YYYY – номер сертификата, содержит:
    • Public – содержит ЭЦП Банка и сетевой ключ;
    • Key – содержит ЭЦП клиента и Главный ключ;
    • Файлы 1.vol, cvtnam.ldif, cvtnam1.dbp, setup.cfg – образуют дистрибутив конфигурации;
    • Акты – содержит акт готовности, акт приема-передачи программных средств и акт о выполнении работ по заявке;
  • Документация – содержит инструкции по самостоятельной установке, созданию дополнительного сертификата, переустановке Рабочего места, созданию конфигурации с копированием данных, созданию справочника КБК и руководство пользователя. Рекомендую прочитать все документы этого каталога. Нам наиболее интересен будет документ Документация \ Документация от разработчиков \ Приложение Командная строка.doc;
  • Scripts – содержит скрипт экспорта выписки и импорта платежных поручений;
  • Swift – содержит справочник банков иностранных государств и программу, для его загрузки в Рабочее место;
  • HashControl – содержит модуль для вычисления ХЭШ-функции и инструкцию;
  • ФПСУ-Клиент – содержит драйверы для VPN-ключа (связь через Internet);
  • Bicrypt – содержит инструкции по безопасности;
  • Convert_User – содержит конвертер и шаблоны для переноса справочника Контрагентов из программы «Клиент-Сбербанк» в СПЭД;
  • SberSign45 – содержит программу Sbersign версии 4.5;
  • Source – содержит:
  • 12.1. MSI – содержит инсталлятор msi;
    • 12.2 DRTCP – содержит утилиту для изменения параметра MTU;
    • 12.3 TestClient.- содержит утилиту для проверки взаимодействия по порту UDP 87;
    • 12.4 1-48-05 – содержит версию 1.48.05
    • 12.5 VPN_FIRMWARE – прошивка для VPN-ключей

СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФВ нашем случае в корне диска папка 1-53-03 содержала дистрибутив СПЭД версии 1.53.03 (о ней дальше и пойдёт речь). Чтобы проверить версию системы, воспользуйтесь средством Orca из MSI SDK (который входит в состав Platform SDK в свою очередь). Смотрим таблицу Properties (рисунок слева).

Да, приятная новость – дистрибутив уже в виде .msi файла, к распространению через GPO практически готов. Ну что же, приступим.

Готовим административную точку установки

СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФ Всё как обычно. Готовим сетевой ресурс (в моём случае он будет доступен через DFS), и собственно готовим точку установки:

msiexec -a prg\src\cftbc.msi TARGETDIR=Prg\adm

СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФ В процессе подготовки административной точки Вы можете получить ошибку (картинка слева). Ошибка гласит: Ошибка чтения из файла “…\Prg\src\system32\SBX\sbsgn32.dll”. Так всё и есть – файла нет в дистрибутиве. Судя по всему, комплектность дистрибутива определяется перечнем операций с банком, предусмотренных Вашим с банком договором.

СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФ Компонента SBX, которая требует данного файла, фактически установлена быть не может (посмотрите на условие её установки на картинке справа, оно всегда ложно). Поэтому при развёртывании таких проблем не будет.

У нас есть варианты: либо править исходный msi через Orca (удалить проблемную компоненту SBX), или же просто нажать “Пропустить”. В чистом виде административная установка нужна для того, чтобы на сохранять на рабочих станциях при развёртывании дистрибутив в полном объёме (если в msi включен .cab с файлами дистрибутива). Если .cab файла нет и дистрибутив не запакован – вполне можно использовать исходный .msi файл, но мне по душе соблюдение процедур до последней буквы, по возможности.

Итак, административная точка установки готова. Создаём объект политики (GPO).

Готовим GPO

СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФСПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФСоздал объект GPO и группы безопасности для него. Право на применение политики дал (как обычно) только группе Клиенты установки ПО (рисунок справа).

А теперь публикуем cftbc.msi из административной точки установки в наш GPO (создаём тем самым .aas скрипт установки в SysVol part нашего GPO).

Проблем с публикацией не возникло, всё готово к тестовому развёртыванию самого клиента. Пробуем.СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФ

Проверяем распространение

Не забываем включить тестовую машину в группу Клиенты установки ПО, gpupdate на ней – и в перезагрузку её.

Logon – и видим новые ярлыки на рабочем столе. Аж 3 штуки сразу. Не люблю, когда рабочий стол засоряют. А посему создам трансформацию для msi пакета, которая убъёт записи об этих ярлыках (только о тех, что на рабочий стол попали).

Тюнинг MSI пакета – убиваем ярлыки с рабочего стола

СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФ Приступим. Открываем с помощью Orca cftbc.msi из административной точки установки. И создаём новую трансформацию. Теперь идём в таблицу Shortcut. И удаляем записи о СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФ “ненужных” ярлыках.

И сохраняем полученную трансформацию (Transform / Generate Transform, имя для файла я указал [itg].mst)

Обновляю GPO. Не рекомендую Вам никогда удалять предыдущие версии опубликованных приложений (точнее – предыдущие версии .aas сценариев установки этих приложений), лучше будет публиковать в той же политике новый пакет, добавляя к нему необходимые трансформации (напомню, что трансформацию можно прицепить к пакету только до нажатия кнопок Apply либо Ok, то есть – до генерации самого сценария публикации пакета)СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФ .

После публикации нового пакета на странице “Обновления” свойств созданного сценария установки нажимаем “Добавить” и выбираем предыдущий (предыдущие) сценарии, которые обновляются / заменяются нашим новым сценарием. В данном случае я выбрал режим “сначала удалить, затем поставить”.

И после перезагрузки ярлыков на рабочем столе нет, чего и добивался.

“Импортируем конфигурацию” с помощью GPO (или публикация баз СПЭД через GPO+GPP)

Пока что мы решили только половину задачи, развернули само приложение. Теперь необходимо нашим пользователям “импортировать конфигурацию” (это – в терминах СПЭД). Что приятно, конфигурацию СПЭД может хранить как в HKLM, так и в HKCU. Выбор за Вами. В моём случае (перемещаемые профили пользователей) правильно привязаться именно к пользователю, поэтому я буду импортировать конфигурацию в HKCU, если Вы используете СПЭД на сервере терминалов, возможно Вам лучше подойдёт HKLM, но суть останется прежней.

Итак, для распространения самого приложения я использовал один объект GPO. Для публикации баз (импорта конфигураций) буду использовать другие объекты GPO, по одному на каждую конфигурацию (базу). В таком варианте мне достаточно будет включить пользователя или группу пользователей в группу пользователей конкретной конфигурации – и после перезагрузки у него будет и само приложение, и конфигурация в реестр будет импортирована, ничего руками делать не придётся.

Импортировать конфигурацию в реестр буду с помощью GPP. Приведу цитату из реестра для одной “конфигурации”:

Windows Registry Editor Version 5.00

[HKCU\SOFTWARE\FTC\RC NWSBRF\1]
@="ООО \"Рога и копыта\""
"DATABASE"="\\\\novgaro\\files$\\DB\\SB\\SPED\\РогаИКопыта\\201109\\0"
"UID"="C=ru,DC=sbrf,DC=90,DC=5590,O=K-1637,CN=01"
"BID"="C=ru,DC=sbrf,DC=55,DC=9955,O=B,CN=IBSO"
"SID"="C=ru,DC=sbrf,DC=55,DC=9955,O=B,CN=MTA"
"KID"="C=ru,DC=sbrf,DC=90,DC=5590,O=B,CN=KMS90"
"MTApsw"="****"; эту информацию Вы должны получить из банка – пароль доступа к серверу банка

[HKCU\SOFTWARE\FTC\RC NWSBRF\1\CMC]
"TMPDIR"="C:\\TEMP"

[HKCU\SOFTWARE\FTC\RC NWSBRF\1\GNS]
"CVTFILE"="\\\\novgaro\\files$\\DB\\SB\\SPED\\РогаИКопыта\\201109\\0\\cvtnam.ldif"

[HKCU\SOFTWARE\FTC\RC NWSBRF\1\SKS]
"CAD"="PRV.BCR,a:\\prv_key.pfx"
"DB_PATH"=\\\\novgaro\\files$\\DB\\SB\\SPED\\РогаИКопыта\\201109\\0\\Public

Как видно, на каждую базу (“конфигурацию”) создаётся ключ в реестре (HKCU\SOFTWARE\FTC\RC NWSBRF\1, …\2 и так далее). и значений там куда больше, чем я привёл. Но всё остальное (то, что осталось за кадром) – сохранённые параметры пользовательского интерфейса (размеры окошек, их положение и так далее).

Параметры UID, BID, SID, и KID следует генерировать на основании содержимого файлов K-0XX-YYYY\cvtnam1.dbp и cvtnam.ldif с диска, выданного Вам банком. Открываем его блокнотом и видим:

#pn_temp_cnt=2
#dn_template=C=ru,DC=sbrf,DC=90,DC=5590,O=K-1637,CN=##
#dn_temp_cnt=2
#pn_template=[KMS90][K-090-1637-##]

P.S. Чем дальше разбираюсь с этим продуктом, тем большее уважение испытываю к разработчикам. И .msi у них нормальный, и LDAP поддерживают при авторизации, и скрипты .vbs при импорте файлов – молодцы! Да и работает продукт с полномочиями пользователя замечательно, с перемещаемыми профилями дружит, в общем – ещё раз молодцы!

СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФПриведённая выше цитата реестра конфигурации – минимальная. И достаточная. Проверено серией экспериментов. Так что именно эти ключи нам и потребуется дописывать в реестр через GPP. P.S. “По вкусу” Вы можете расширить минимальную конфигурацию.  В частности, можно добавить параметр RunExchWithBlocking = “No”, запрещающий блокирование рабочего места при запуске сеанса связи (ну мне так больше нравится). Значения в реестре названы более чем вменяемо, посему комментарии излишни.

СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФ Открываем редактор созданной для этой цели политики. Определяем GUID нашего объекта GPO (на рисунке справа), и открываем SysVol part нашего GPO. В моём случае — \\novgaro.ru\sysVOL\novgaro.ru\Policies\{7682E412-9275-4438-BF94-E2D356857676}\User\Preferences\Registry.

Если последних папок не было – создаём их. В указанном каталоге должен размещаться файл registry.xml. В нашем примере файл будет следующего содержания:

<?xml version="1.0" encoding="utf-8"?>
<RegistrySettings clsid="{A3CCFC41-DFDB-43a5-8D26-0FE8B954DA51}">
    <Collection clsid="{53B533F5-224C-47e3-B01B-CA3B3F3FF4BF}" name="ООО &quot;РТС&quot;">
        <Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="Целиком раздел реестра" image="1" removePolicy="1">
            <Properties action="R" hive="HKEY_CURRENT_USER" key="Software\FTC\RC NWSBRF\1"/>
        </Registry>
        <Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="(по умолчанию)" image="7">
            <Properties action="U" hive="HKEY_CURRENT_USER" key="Software\FTC\RC NWSBRF\1" default="1" type="REG_SZ" value="ООО &quot;Рога и копыта&quot;"/>
        </Registry>
        <Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="MTApsw" image="7">
            <Properties action="U" hive="HKEY_CURRENT_USER" key="Software\FTC\RC NWSBRF\1" name="MTApsw" type="REG_SZ" value="1"/>
        </Registry>
        <Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="KID" image="7">
            <Properties action="U" hive="HKEY_CURRENT_USER" key="Software\FTC\RC NWSBRF\1" name="KID" type="REG_SZ" value="C=ru,DC=sbrf,DC=90,DC=5590,O=B,CN=KMS90"/>
        </Registry>
        <Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="SID" image="7">
            <Properties action="U" hive="HKEY_CURRENT_USER" key="Software\FTC\RC NWSBRF\1" name="SID" type="REG_SZ" value="C=ru,DC=sbrf,DC=55,DC=9955,O=B,CN=MTA"/>
        </Registry>
        <Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="BID" image="7">
            <Properties action="U" hive="HKEY_CURRENT_USER" key="Software\FTC\RC NWSBRF\1" name="BID" type="REG_SZ" value="C=ru,DC=sbrf,DC=55,DC=9955,O=B,CN=IBSO"/>
        </Registry>
        <Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="UID" image="7">
            <Properties action="U" hive="HKEY_CURRENT_USER" key="Software\FTC\RC NWSBRF\1" name="UID" type="REG_SZ" value="C=ru,DC=sbrf,DC=90,DC=5590,O=K-1637,CN=01"/>
        </Registry>
        <Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="DATABASE" image="7">
            <Properties action="U" hive="HKEY_CURRENT_USER" key="Software\FTC\RC NWSBRF\1" name="DATABASE" type="REG_SZ" value="\\novgaro.ru\files$\DB\SB\SPED\РогаИКопыта\201109\0"/>
        </Registry>
        <Collection clsid="{53B533F5-224C-47e3-B01B-CA3B3F3FF4BF}" name="CMC">
            <Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="TMPDIR" image="7">
                <Properties action="U" hive="HKEY_CURRENT_USER" key="Software\FTC\RC NWSBRF\1\CMC" name="TMPDIR" type="REG_SZ" value=\\novgaro.ru\files$\DB\SB\SPED\РогаИКопыта\201109\0\temp/>
            </Registry>
        </Collection>
        <Collection clsid="{53B533F5-224C-47e3-B01B-CA3B3F3FF4BF}" name="GNS">
            <Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="CVTFILE" image="7">
                <Properties action="U" hive="HKEY_CURRENT_USER" key="Software\FTC\RC NWSBRF\1\GNS" name="CVTFILE" type="REG_SZ" value="\\novgaro.ru\files$\DB\SB\SPED\РогаИКопыта\201109\0\cvtnam.ldif"/>
            </Registry>
        </Collection>
        <Collection clsid="{53B533F5-224C-47e3-B01B-CA3B3F3FF4BF}" name="SKS">
            <Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="DB_PATH" image="7">
                <Properties action="U" hive="HKEY_CURRENT_USER" key="Software\FTC\RC NWSBRF\1\SKS" name="DB_PATH" type="REG_SZ" value="\\novgaro\files$\DB\SB\SPED\РогаИКопыта\201109\0\Public"/>
            </Registry>
            <Registry clsid="{9CD4B2F4-923D-47f5-A062-E897DD1DAD50}" name="CAD" image="7">
                <Properties action="U" hive="HKEY_CURRENT_USER" key="Software\FTC\RC NWSBRF\1\SKS" name="CAD" type="REG_SZ" value="PRV.BCR,A:\prv_key.pfx"/>
            </Registry>
        </Collection>
    </Collection>
</RegistrySettings>

Для каждой новой “базы” Вы должны будете создавать ключи с цифровым наименованием (1, 2, 3 и так далее). В нашем примере – 1. Пример привёл с созданием GPP через xml файл по одной причине – так проще редактировать при создании конфигурации по другую базу (поиск с заменой поможет нам). Для другой базы (конфигурации) нам потребуется заменить:

  • ключ в реестре (например – на Software\FTC\RC NWSBRF\2)
  • путь к файловому ресурсу базы (DB_PATH и DATABASE)
  • каталог для размещения временных файлов TMPDIR
  • KID и UID
  • путь к ldif файлу с пользователями базы CVTFILE
  • ну и параметр CAD, если Вы храните ключи не на сменных носителях (да, СПЭД прекрасно работает и в таком варианте)

Обратите внимание на самый первый параметр Registry. Для него мы указали действие “Заменить” и установили флаг removePolicy с одной целью – при исключении пользователя из области применения GPO раздел в реестре должен быть удалён (чтобы пользователь и не видел баз, к которым потерял доступ).

Пробуем – gpupdate. И – всё получилось. В реестре имеем требуемый раздел. И СПЭД при запуске видит нашу базу (“конфигурацию”), связь из базы проходит вполне успешно.

TMPDIR: выбираем временный каталог для модуля связи

Буквально пару слов скажу. Переменные окружения не поддерживаются. И весь путь, вплоть до самого глубокого указанного Вами каталога должен быть не скрытым, и не системным. По этой причине %temp% (даже если мы его развернём сами в c:\documents and settings\user\local settings\temp) не подходит к сожалению – local settings и temp – скрытые каталоги. P.S. Пожалуй, указанный недостаток (невозможность указания для TMPDIR скрытых каталогов и использования в пути переменной окружения, в частности — %temp%) — пока единственный обнаруженный недостаток СПЭД по сравнению с другими клиент-банками.

Тем не менее, прекрасно работает вариант с отражением %temp% в диск:

subst Y: %temp%

И для TMPDIR указываем Y:\. Такой вариант замечательно работает, но subst придётся вставлять в logon скрипт… (похожее решение, допустимое и для мобильных клиентов, уже описывал).

Безусловно, не хочется временные файлы тащить на сетевой ресурс базы. Но я пока что остановился на таком варианте – создаю каталог temp в каталоге базы (\\novgaro.ru\files$\DB\SB\SPED\РогаИКопыта\201109\0\temp) и задаю указанный путь в TMFDIR. Не уверен, что не будет проблем, если в такой конфигурации (с общим TMPDIR каталогом) вдруг будут запущены одновременно сеансы связи с нескольких компьютеров, в моём случае вероятностью данного события можно пренебречь.

Импорт платёжных поручений из 1С

В первую очередь нам СПЭД нужен как клиент-банк. Посему необходима процедура импорта экспортируемых из 1С платёжных поручений.

СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФ СПЭД (как клиент банк) – разворачиваем, запускаем, работаем с СБ РФ Настроить импорт нужно только один раз для одной базы, “распространять” настройку на каждого пользователя не требуется – все параметры и сценарии сохраняются в “базе”.

Сценарии доступны для редактирования, язык сценариев – Visual Basic. Ещё раз восхищусь разработчиками СПЭД’а – грамотный подход. Благодаря подобному подходу Вы можете поправить сценарий под себя (под свой формат выгрузки, например. В теории Вы можете и выгрузку инициировать непосредственно из СПЭД через OLE, можете добавить своё журналирование операций импорта – свобода творчества). К сожалению, добраться до сценария не через интерфейс СПЭД’а не смог – не нашёл. Если подскажете – буду благодарен.

Сценарий, который использовал для импорта:

Function Import()
    Dim n, Doc, Rec
    Dim Params, sParam, Value
    Dim Link, LinkParams, bFound
    ' Если системный разделитель целой и дробной части - запятая
    ' Separ = ","
    ' Если системный разделитель целой и дробной части - точка
    Separ = ","
    Do
        Set Rec = GetExtRecord(): If Rec Is Nothing Then Exit Function
        If Rec.Fields("FIELD").Value = "СекцияДокумент=Платежное поручение" Then Exit Do
    Loop
    
    Set Params = NewParameters()
    Set LinkParams = NewParameters()
    Do
        Set Rec = GetExtRecord(): If Rec Is Nothing Then Exit Function
        If Rec.Fields("FIELD").Value = "КонецДокумента" Then Exit Do
        
        ParseRecord Rec.Fields("FIELD").Value, sParam, Value
        If Not IsNull(Value) Then
            Select Case sParam
'           Шапка платежного документа -------------------------------------------------
            ' Номер документа
            Case "Номер":           Params.Add Value, "DOC_NUM"
            ' Дата документа (дд.мм.гггг)
            Case "Дата":            Params.Add CorrectDate(Value), "DOC_DATE"
'            Case "Дата":               Params.Add Value, "DOC_DATE"
            ' Сумма платежа (руб[.коп])
            Case "Сумма":           Params.Add Separator(Value, Separ), "SUMMA"
            ' Case "Сумма":           Params.Add Value, "SUMMA"
'           Реквизиты плательщика ------------------------------------------------------
            ' Расчетный счет плательщика (размер 20)
            Case "ПлательщикСчет":  Params.Add Value, "C_ACC"
            ' Плательщик
            Case "Плательщик1":     Params.Add Value, "C_NAME"
            ' ИНН плательщика
            Case "ПлательщикИНН":   Params.Add Value, "C_INN"
            ' КПП плательщика
            Case "ПлательщикКПП":    Params.Add Value, "C_KPP"    
'           Реквизиты банка получателя (поставщика) ------------------------------------
            ' Расчетный счет получателя (размер 20)
            Case "ПолучательСчет":  Params.Add Value, "A_ACC"
            ' Получатель
            Case "Получатель1":     Params.Add Value, "A_NAME"
            ' ИНН получателя
            Case "ПолучательИНН":   Params.Add Value, "A_INN"
            ' КПП получателя
            Case "ПолучательКПП":    Params.Add Value, "A_KPP"    
            ' БИК банка получателя (размер 9)
            Case "ПолучательБИК":
               Set Link = GetDirectory("BANKS")
               If Link.FindFirst("[EXISTS] and [@BIC]='" & Value & "'") Then LinkParams.Add Link.CurrentRecord, "A_BANK"
'           Реквизиты платежа ----------------------------------------------------------
            ' Вид платежа
            Case "ВидПлатежа":
                Set Link = GetDirectory("SEND_TYPE")
                bFound = False
                Select Case Value
                Case "Почтой":      bFound = Link.FindFirst("[@NAME]='Почтой'")
                Case "Телеграфом":  bFound = Link.FindFirst("[@NAME]='телеграфом'")
                Case "Электронно":  bFound = Link.FindFirst("[@NAME]='электронно'")
                End Select
                If bFound Then LinkParams.Add Link.CurrentRecord, "SEND_TYPE"
            ' Срок платежа (дд.мм.гггг)
            Case "СрокПлатежа": Params.Add CorrectDate(Value), "DUE_DATE"
            ' Очередность платежа (размер 2)
            Case "Очередность": Params.Add Value, "PRIORITY"
            ' Статус составителя расчетного документа
            Case "СтатусСоставителя":
               ' Признак бюджетного платежа
               If Value <> "" Then Params.Add True, "IS_BUD"
               ' Статус составителя расчетного документа
               Params.Add Value, "BUD_TAXPAYER"
            ' Показатель кода бюджетной классификации (размер 20)
            Case "ПоказательКБК":         Params.Add Value, "BUD_KBK"
            ' Код ОКАТО (размер 12)
            Case "ОКАТО":                 Params.Add Value, "BUD_OKATO"
            ' Показатель основания налогового платежа (размер 16)
            Case "ПоказательОснования":   Params.Add Value, "BUD_KOD_NAZN"
            ' Показатель периода налогового платежа (размер 10)
            Case "ПоказательПериода":     Params.Add Value, "BUD_DATE_NU"
            ' Показатель номера налогового документа (размер 15)
            Case "ПоказательНомера":      Params.Add Value, "BUD_NUM_EXP"
            ' Показатель даты налогового документа (размер 10)
            Case "ПоказательДаты":        Params.Add Value, "BUD_DATE_EXP"
            ' Показатель типа налогового платежа (размер 16)
            Case "ПоказательТипа":        Params.Add Value, "BUD_PAY_TYPE"
            End Select
            ' Назначение платежа
            Dim Param, v
            If Left(sParam, 17) = "НазначениеПлатежа" Then 
                Set Param = Params.Items("NOTE")
                If Mid(sParam, 18, 1) = "" Then
                    Params.Add Value, "NOTE"
                    haveNote = True 
                Else                
                    If Not haveNote Then
                        If Param Is Nothing Then    
                               Params.Add Value, "NOTE"
                        Else     
                            Param.Value = Param.Value & vbNewLine & Value
                        End If
                    End If
                End If    
            End If
        End If
    Loop
    
    If Params.ItemsCount > 0 Or LinkParams.ItemsCount > 0 Then
        Dim sWhere
        sWhere = "[@DOC_NUM]=" & Params.Items("DOC_NUM").Value & " and " & _
                 "[@DOC_DATE]=#" & Params.Items("DOC_DATE").Value & "# and " & _
                 "[@C_ACC]='" & Params.Items("C_ACC").Value & "'"
           'Call MsgBox(sWhere, vbExclamation)  

        If Documents.FindFirst(sWhere) Then
            Set Doc = Documents.CurrentDocument
        Else
            Set Doc = Documents.Add()
        End If
    End If
    For n = 1 To Params.ItemsCount
        Doc.Attributes(Params.Items(n).Name).Value = Params.Items(n).Value
    Next
    For n = 1 To LinkParams.ItemsCount
        Set Doc.Attributes(LinkParams.Items(n).Name).Value = LinkParams.Items(n).Value
    Next
    If Not Doc Is Nothing Then
        CheckDocument(Doc)
        If Not Doc.Update Then
            Dim sErrMsg
            sErrMsg = "Документ не может быть обновлен!" & vbNewLine & _
                      "Дата документа: " & FormatExpression(Params.Items("DOC_DATE").Value, "dd.mm.yyyy") & vbNewLine & _
                      "Номер документа: " & Params.Items("DOC_NUM").Value & vbNewLine & _
                      "Счет: " & Params.Items("C_ACC").Value
            Call MsgBox(sErrMsg, vbExclamation, "Импорт платежного поручения")
        End If
    End If
    Import = True
End Function

' Проверка документа
Sub CheckDocument(Doc)
    ' Очистка бюджетных реквизитов
    If Not Doc.Attributes("IS_BUD").Value Then ' Закрыл очистку КПП (Посылторг)
        Doc.Attributes("BUD_TAXPAYER").Value = ""
        Doc.Attributes("BUD_KBK").Value = ""
        Doc.Attributes("BUD_OKATO").Value = ""
        Doc.Attributes("BUD_KOD_NAZN").Value = ""
        Doc.Attributes("BUD_DATE_NU").Value = ""
        Doc.Attributes("BUD_NUM_EXP").Value = ""
        Doc.Attributes("BUD_DATE_EXP").Value = ""
        Doc.Attributes("BUD_PAY_TYPE").Value = ""
   End If
End Sub

' <sRecord>: <sParam>=<Value>
Sub ParseRecord(sRecord, ByRef sParam, ByRef Value)
    Dim n
    n = InStr(1, sRecord, "=")
    If n > 0 Then
        sParam = Mid(sRecord, 1, n - 1)
        Value = Mid(sRecord, n + 1)
    Else
        sParam = sRecord
        Value = Null
    End If
End Sub

' "dd.mm.yyyy" -> "yyyy/mm/dd"
Function CorrectDate(sDate)
    CorrectDate = Mid(sDate, 7) & "/" & Mid(sDate, 4, 2) & "/" & Mid(sDate, 1, 2)
End Function

Куда проще будет выглядеть скрипт, если Вы будете экспортировать из 1С в .dbf формате, приведённый выше сценарий – для текстовой выгрузки.

С отладкой могут быть сложности, мне помогают вставки в “контрольных” точках следующего рода:

Call MsgBox(Value, vbExclamation, "Импорт платежного поручения") ' вместо Value - то, что хотим увидеть

Сама процедура импорта вроде бы как и проста, однако инициировать её смог не с первого раза. Суть в том, что функция Импорт в меню Операции будет доступна только в том случае, если у Вас открыт журнал Исходящие документы \ Платёжные поручения.

Ярлык своими руками: запуск СПЭД без запроса пароля к ключу и без выбора конфигурации, с автоматическим импортом платёжных поручений при запуске

Возвращаемся к документу Документация \ Документация от разработчиков \ Приложение Командная строка.doc с диска, выданного банком. Создадим командную строку, по которой СПЭД будет запускаться в нужной нам конфигурации без лишних запросов PIN кодов и прочего, а также – с автоматическим импортом платёжных поручений при запуске.

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка