We use cookies
We use cookies and similar technologies to improve your experience, analyse traffic, and personalise content. You can accept all cookies or reject non-essential ones.
Когда мост Tally Bridge запущен, каждый счёт-фактура на продажу, сохранённый в TallyPrime, доходит до клиента уже через несколько минут: в WhatsApp или по электронной почте с фирменным PDF либо в SMS со ссылкой. Те же записи держат в актуальном виде списки клиентов и поставщиков, выводят цифры продаж, закупок и остатков на ваши дашборды, помогают напоминать о долге клиентам, за которыми осталась задолженность, и наполняют портал под вашим брендом, где каждый клиент видит свои счета-фактуры и остаток задолженности. В этом руководстве вы решаете всё это: какие компании и какие виды записей Tally — счета-фактуры на продажу, счета поставщиков, клиенты, поставщики, банковские счета, товарные позиции — передаются, куда уходит каждый из них, как часто мост заглядывает в Tally и что с ними делает ваш рабочий процесс (flow) — автоматизация, которую вы строите в SurveyAnalytica. Если моста на ПК ещё нет, откройте Коннектор Tally Prime — руководство по установке.
Всё это лежит в одном текстовом файле — bridge.yml, рядом с sa-tally-bridge.exe, обычно в C:\ProgramData\SurveyAnalytica. Щёлкните по нему правой кнопкой мыши, выберите Открыть с помощью (Open with), затем Блокнот (Notepad). Это обычный текст в формате YAML, где отступы имеют значение.
Делайте отступы только пробелами, никогда клавишей Tab и сохраняйте отступы строк, которые копируете из этого руководства. Мост запускается, когда файл читается целиком; если отступ сместился, он называет строку, которую нужно поправить, и ждёт исправленный файл. Проверьте правку, прежде чем доверить запуск Windows, — это делается одной командой.
В папке с bridge.yml щёлкните по адресной строке Проводника, введите cmd, нажмите Enter, затем выполните sa-tally-bridge.exe run --config bridge.yml. Если он напечатал своё расписание и продолжает работать, файл в порядке: нажмите Ctrl+C, а затем перезапустите мост.
Мост читает bridge.yml при запуске, поэтому сохранённое изменение вступает в силу при следующем запуске. Если он ещё работает в окне командной строки, нажмите там Ctrl+C и запустите его снова. Когда он начнёт запускаться сам (шаг 7 руководства по установке), перезапускайте его через Планировщик заданий (Task Scheduler) Windows: откройте Библиотека планировщика заданий → SurveyAnalytica → Tally Bridge, щёлкните по задаче правой кнопкой мыши и выберите Завершить (End), затем щёлкните по ней ещё раз и выберите Выполнить (Run). Выход из системы и повторный вход дают тот же результат: задача запускается при входе.
Для первой настройки используйте мастер — sa-tally-bridge.exe init. Каждый раз он начинает с чистого листа, поэтому последующие изменения вносите в Блокноте. Держите каждую компанию под одним ключом — тем именем, которое записал мастер, или номером её папки — и сохраняйте этот ключ: по нему мост помнит, на чём остановился по этой компании, поэтому каждый запуск читает только новое, а каждая запись приходит один раз.
В блоке companies: перечислены компании для синхронизации, по одной записи на каждую, так что с одного ПК с Tally работают несколько компаний или филиалов. У каждой есть ключ на ваш выбор, который приходит с каждой записью в поле companyCode; имя name в том написании, в каком его пишет Tally; и блок transactions:, где названы виды записей для чтения.
bridge.yml — блок companies:
companies:
"010001":
name: "Acme Traders"
transactions:
sales: {}
purchase: {}
ledgers/debtors: {}
stockItems: {}
"010002":
name: "Globex Industries"
transactions:
sales: {}
ledgers/debtors: {}
Каждый пример здесь — часть одного и того же файла: global: и companies: встречаются по одному разу, поэтому добавляйте только недостающие строки и с тем же отступом. Пустые фигурные скобки — так и задумано: настройки нужны виду записей только тогда, когда у него есть свой адрес назначения, — об этом следующий раздел. Семь видов, которые мост называет streams:
| Что написать | Что отправляется |
|---|---|
sales | Счета-фактуры на продажу, включая ваши собственные типы документов (voucher types): мост спрашивает у Tally, на чём основан каждый тип, поэтому GST SALES учитывается как продажа. |
purchase | Счета поставщиков; пользовательские типы документов обрабатываются так же. |
ledgers/debtors | Клиенты — все счета учёта в группе Sundry Debtors, включая подгруппы. |
ledgers/creditors | Поставщики — все счета учёта в группе Sundry Creditors. |
ledgers/bank | Банковские счета. |
ledgers | Весь план счетов — тысячи строк. Для клиентов или поставщиков точнее подойдут узкие списки выше. |
stockItems | Товарные позиции с конечным количеством, стоимостью и ценой. |
Записи клиентов и поставщиков несут данные контрагента в том виде, в каком их хранит Tally, — почтовое наименование, email, телефон, мобильный, GSTIN, налоговый номер, адрес и конечный остаток, — благодаря чему список контактов остаётся актуальным без повторного ввода. Записи продаж и закупок несут документ целиком: шапку, товарные строки, строки счетов учёта и налогов, примечание, а также данные электронного счёта-фактуры GST (IRN, номер и дату подтверждения), если они есть в Tally.
Счета-фактуры на продажу и счета поставщиков, включая ваши собственные типы документов; клиенты, поставщики, банковские счета и, если нужно, весь план счетов; товарные позиции. Другие типы документов — поступления, платежи, переводы между счетами (contra), журналы, кредитовые и дебетовые ноты, заказы и накладные на отгрузку — сегодня в объём коннектора не входят.
Каждая запись уходит в рабочий процесс, триггер которого — Вебхук: тот, что вы создали на шаге 3 руководства по установке, и столько других, сколько захотите, — все они создаются одинаково. На этой панели показаны два значения, которые вы копируете в bridge.yml: строки URL : и KEY :, у каждой есть кнопка копирования. Строка с URL названа по месту, где она стоит: webhook_url — в блоке global:, у компании и у вида записей; url — внутри transaction_webhooks: и heartbeat:, а ключ рядом с ней — api_key. Возьмите образец из примера ниже и используйте то имя, которое относится к уровню, где вы правите, — именно в таком написании его читает мост. Записи, у которых адреса назначения пока нет, спокойно ждут в очереди, пока он не появится.
Полезно знать. Копируйте URL ровно в том виде, в каком его показывает панель; если межсетевой экран в офисе ограничивает исходящий трафик, разрешите исходящий HTTPS к имени узла в начале этого адреса. Ключ передаётся в заголовке code, и больше рабочему процессу ничего не нужно: поля HMAC Signature (Optional) (подпись HMAC, необязательно) оставьте пустыми.
Отправляйте всё в один рабочий процесс либо дайте компании или виду записей свой собственный.
bridge.yml — фрагменты блоков global: и companies:
global:
webhook_url: "PASTE-THE-URL-FROM-THE-TRIGGER-PANEL"
api_key: "PASTE-THE-KEY-FROM-THE-TRIGGER-PANEL"
transaction_webhooks:
sales:
url: "PASTE-THE-SALES-FLOW-URL"
api_key: "PASTE-THE-SALES-FLOW-KEY"
ledgers/debtors:
url: "PASTE-THE-CONTACTS-FLOW-URL"
api_key: "PASTE-THE-CONTACTS-FLOW-KEY"
companies:
"010002":
name: "Globex Industries"
webhook_url: "PASTE-THE-GLOBEX-FLOW-URL"
api_key: "PASTE-THE-GLOBEX-FLOW-KEY"
transactions:
sales: {}
Записи идут группами: в одной группе — одна компания и один вид записей. Для каждой группы мост берёт первый заполненный адрес назначения: эта компания и этот вид записей, затем эта компания, затем этот вид записей, затем общий запасной вариант. Ключ идёт вместе с тем URL, рядом с которым он записан, поэтому к каждому рабочему процессу обращаются с его собственным ключом.
Совет. Кнопка Создать новый под ключом выпускает новый KEY; действующий рабочий процесс сохраняет нынешний, пока кто-нибудь его не опубликует. После этого вставьте новый KEY в bridge.yml, перезапустите мост и нажмите Обновить опубликованную версию. (У опубликованного рабочего процесса показана кнопка Обновить опубликованную версию; у ни разу не включённого — Активировать.) Всё, что отправлено тем временем, ждёт в очереди.
Мост читает Tally либо автоматически, каждые несколько минут, либо по расписанию, в те часы, которые вы выберете, — это задаётся в блоке sync внутри global. Без блока sync работает автоматический режим, каждые пять минут.
Читает через равные промежутки — пять минут, если не указано иное, — и один раз сразу после запуска, поэтому счета-фактуры попадают в ваш рабочий процесс через считаные минуты после ввода, а к клиенту уходят в тот же день.
Читает только в указанное вами время, например каждый вечер в 21:30. Между запусками он вообще не обращается к Tally, поэтому рабочий день остаётся вашим сотрудникам.
bridge.yml — внутри блока global:, автоматически
global:
sync:
mode: interval
every: 5m
bridge.yml — внутри блока global:, по расписанию
global:
sync:
mode: cron
cron: "30 21 * * *"
timezone: "Asia/Kolkata"
| Настройка | По умолчанию | Что делает |
|---|---|---|
mode | interval | Либо interval, либо cron. Строка cron без указания режима читается как cron. |
every | 5m | Как часто читать Tally в автоматическом режиме: 30s, 5m, 2h. |
cron | нет | Время запусков в режиме по расписанию. Пять частей: минута, час, день месяца, месяц, день недели. |
timezone | UTC | Часовой пояс, в котором читается время cron, в виде названия места, например Asia/Kolkata. Задайте его, чтобы 21:30 означало 21:30 по вашему времени. |
run_on_start | true | Прочитать один раз сразу после запуска моста. В режиме по расписанию — только на ПК, где ещё не было завершённого запуска. |
catch_up | true | Если время по расписанию прошло, пока ПК был выключен, сделать один запуск, когда он вернётся. |
catch_up_grace | 30m | Насколько давно должно было пройти пропущенное время, чтобы догоняющий запуск имел смысл. |
retry_every | 15m | Как часто повторять попытку для всего, что ещё осталось прочитать в этом цикле. |
first_run_guard | 0 (выключено) | Придерживает самую первую синхронизацию компании, у которой изменений больше этого числа, в обоих режимах, чтобы чтение всей истории не начиналось ночью без присмотра; такой вид записей показывает needs_backfill, пока вы не вернёте значение 0 и не дадите ему отработать. |
| Что написать | Что это значит |
|---|---|
"30 21 * * *" | Каждый день в 21:30. С timezone: "Asia/Kolkata" — в 21:30 по IST. |
"0 19 * * 1-5" | С понедельника по пятницу в 19:00, в выходные — ничего. |
"0 */2 * * *" | Каждые два часа, ровно в начале часа. |
Пишите пять частей, а не шесть: ведущая часть с секундами превратила бы "0 30 21 * * *" в «каждый час в 30 минут». Мост проверяет выражение перед запуском и печатает в окне командной строки global.sync.cron must have exactly 5 fields (minute hour day-of-month month day-of-week), got 6 in "0 30 21 * * *" — поэтому новое расписание стоит проверить вручную, как показано выше.
Время по расписанию начинает цикл. Если компания не была готова — на рабочем столе ещё ждёт её окно входа или Tally пока не отвечает, — мост оставляет её в списке и повторяет попытку каждые retry_every, по умолчанию раз в четверть часа, пока не получится или пока не подойдёт следующее время по расписанию: компания, открытая на следующее утро в 09:40, синхронизируется в 09:40.
Если ПК был выключен в назначенное по расписанию время, пробел закрывает один догоняющий запуск: три пропущенные ночи стоят одного запуска, потому что мост запрашивает всё, что изменилось с его последнего обращения. В режиме по расписанию перезапуск сохраняет назначенное время, а не приближает его; если цифры нужны прямо сейчас, на этот день переключитесь в автоматический режим.
Здесь записи Tally становятся тем, ради чего всё и затевалось: счёт-фактура уходит клиенту в WhatsApp или по электронной почте с фирменным PDF либо в SMS со ссылкой; списки клиентов и поставщиков идут в ногу с Sundry Debtors и Sundry Creditors; в Google Sheets или Excel ведётся живой реестр продаж; после отправки счёта-фактуры уходит короткий опрос о качестве; напоминания в выбранные вами дни рассылает рабочий процесс по расписанию, который берёт список контактов клиентов с непогашенной задолженностью; цифры идут в дашборды и анализ; а на портале под вашим брендом клиенты видят свои счета-фактуры и остаток задолженности.
sa-tally-bridge.exe test --config bridge.yml. Он сразу отправит примерно по десять недавних записей каждого вида.records. Всё, что ниже, теперь выполняется один раз на запись, а не один раз на группу.Почему такой порядок. Мост движется вперёд от того, что уже доставлено, поэтому сделайте рабочий процесс активным до большой первой загрузки. Пока рабочий процесс не активен, он сохраняет поступившее как тестовый образец — именно он нужен для шагов 2 и 3.
Совет. Используйте один маршрут на компанию — либо мост, либо облачный источник данных Tally на триггере Расписание, но не оба сразу, — чтобы каждая запись приходила один раз.
| Действие | Нужен цикл? |
|---|---|
| WhatsApp, SMS, Slack, Microsoft Teams, публикации в соцсетях | Да. По одному сообщению за раз. |
| Google Sheets, Excel | Да. Одна строка на запись. |
| Список контактов, Planner, Ответ на опрос, Пользователь организации, Shopify, Salesforce, Mailchimp | Да. Каждое пишет одну запись. |
| Электронная почта | Нет. Шаблон может сам повторить список внутри себя — несколько счетов-фактур в одной выписке; с циклом получится по одному письму на счёт-фактуру. |
| Создать документ, Задача | Нет. Оба проходят по списку, поэтому один документ может охватить целую группу. |
Там, где нужен цикл, шаг сам об этом сообщает и предлагает кнопку Add Loop (добавить цикл).
Каждый запрос — одна из таких групп, пакет от одной компании и одного вида записей, — обёрнутый в шесть полей.
| Поле | Что в нём |
|---|---|
companyCode | Ключ, который вы указали в блоке companies:. |
companyName | Название компании в том написании, в каком его пишет Tally. |
transactionType | Вид записей: sales, ledgers/debtors и так далее. |
batchStart, batchTotal | С какого места начинается этот пакет среди всего найденного за цикл (0, затем 250, затем 500) и сколько всего найдено. |
records | Сами записи, до 250 на запрос, — массив, который перебирает ваш цикл. |
Внутри records имена полей — собственные имена Tally, прописными буквами, а ваши пользовательские поля сохраняют свои обычные имена. Все значения — текст, включая суммы и даты, а поле, пустое в Tally, в эту запись не попадает, — поэтому стройте каждый шаг на полях, которые вы выбрали на шаге 7.
Один запрос, сокращённо
{
"companyCode": "010001",
"companyName": "Acme Traders",
"transactionType": "sales",
"batchStart": 0,
"batchTotal": 312,
"records": [
{
"GUID": "0a1b2c3d-0000-4000-8000-000000000001-00000101",
"REMOTEID": "0a1b2c3d-0000-4000-8000-000000000001-00000101",
"DATE": "20250401",
"VOUCHERNUMBER": "101",
"VOUCHERTYPENAME": "GST SALES",
"PARTYLEDGERNAME": "Example Customer Pvt Ltd",
"AMOUNT": "5900.00",
"PARTYGSTIN": "29XXXXXXXXXX1Z5",
"ALLINVENTORYENTRIES": [
{
"STOCKITEMNAME": "Sample Item A",
"BILLEDQTY": "10 Nos.",
"RATE": "500.00/Nos.",
"AMOUNT": "5000.00"
}
]
}
]
}
Опираться стоит на поле GUID — постоянный идентификатор этого документа или счёта учёта в Tally, — а заменой ему служит REMOTEID, поскольку у части документов он приходит под этим именем. Когда счёт-фактуру редактируют, когда позже приходят данные его электронного счёта-фактуры или когда ответ не доходит до моста, запись отправляется снова под тем же идентификатором. Сопоставляйте по нему и обновляйте, а не добавляйте: так один счёт-фактура остаётся одной строкой — и в таблице, и на дашборде, и на портале.
Вы сами выбираете, какие компании и виды записей передаются. Для них документ или счёт учёта уходит целиком по зашифрованному соединению: наименования контрагента и почтовые наименования, GSTIN, PAN, почтовый адрес, email, номера телефонов и мобильных, названия позиций, цены, суммы налогов и остатки. Большинство компаний передают ledgers/debtors и ledgers/creditors, а не весь план счетов, — так ПК покидают данные только тех контрагентов, с которыми вы действительно работаете.
Записи уходят тогда, когда что-то изменилось, поэтому тихая ночь тиха по замыслу. Если нужно явное подтверждение, отчёт о состоянии отправляет сводку в отдельный рабочий процесс после каждого запуска, с URL и KEY этого процесса. Добавьте его вручную:
bridge.yml — внутри блока global:
global:
heartbeat:
url: "PASTE-THE-STATUS-FLOW-URL"
api_key: "PASTE-THE-STATUS-FLOW-KEY"
В каждом отчёте есть outcome (success, partial или blocked), blockedReason (gateway_error, gateway_empty, no_companies), outboxDepth, recordsEnqueued, pendingStreams, nextFireAt и hostname. Самое полезное оповещение: при ночном расписании оповещать, если от машины не приходило отчёта 26 часов.
На ПК с Tally откройте командную строку в той же папке, как описано выше, и выполните:
Командная строка
sa-tally-bridge.exe status --config bridge.yml
Что он печатает
sa-tally-bridge [version] on TALLY-PC
Schedule : cron "30 21 * * *" (Asia/Kolkata)
Last run : Sat, 15 Aug 2026 21:30:04 IST → 21:34:11 (partial)
Next run : Sat, 15 Aug 2026 21:45:04 IST
Records : 312 enqueued last run; outbox depth 0
Pending : 1 stream(s) awaiting retry
- Globex Industries / sales : company_closed
ok Acme Traders / sales : synced (watermark 260321/260409, 312 records)
ok Acme Traders / stockItems : up_to_date (watermark 8821/8821, 0 records)
Строка Blocked : появляется между Last run и Next run, когда весь запуск был заблокирован. outbox depth считает пакеты, которые ещё предстоит доставить; нужен 0. watermark 260321/260409 — это закладка в простых числах: номер изменения, до которого прочитано, и текущий номер изменения компании; когда они совпадают, всё на месте. status сообщает о последнем завершённом запуске.
| Статус | Значение | Повтор? |
|---|---|---|
synced | Новые или изменённые записи прочитаны и поставлены в очередь на отправку. | Готово |
up_to_date | Tally ответила, изменений нет: нормальное состояние покоя. | Готово |
company_closed | Эта компания не открыта в TallyPrime — обычно на рабочем столе ждёт окно входа. | Да |
type_map_failed | Список типов документов в этот раз прочитать не удалось, поэтому мост придержал этот вид записей, чтобы не отнести ваши собственные типы не к той категории. | Да |
no_counter | В этот раз компания не сообщила счётчик изменений. | Да |
needs_backfill | Самая первая синхронизация придержана настройкой first_run_guard. Её показывает sa-tally-bridge.exe status --config bridge.yml --json. | Нет |
error | Попытка не завершилась; причина записана, а закладка осталась на месте, поэтому эти записи придут в следующий раз. | Да |
status..1 по .5. Первое, что стоит отправить в поддержку.| Что вы видите | Что это значит | Что делать |
|---|---|---|
| Всё доставлено, а рабочий процесс ещё не сработал. | Рабочий процесс сохранён, но не активирован или приостановлен, поэтому всё поступившее пока хранится как его тестовый образец. | Откройте рабочий процесс и нажмите Активировать. Следующая синхронизация будет обработана полностью. |
outbox depth продолжает расти. | Рабочий процесс пока не принимает эти пакеты: KEY успел смениться, URL взят от другого процесса или вид записей добавлен вручную и адреса назначения у него ещё нет. | Скопируйте URL : и KEY : с панели заново и перезапустите мост; проверьте, что у вида записей есть свой URL или что заполнен webhook_url в блоке global:. Тем временем всё спокойно ждёт в очереди. |
У одной компании всегда company_closed. | Она не открыта в TallyPrime — обычно потому, что ждёт её окно входа. | Откройте эту компанию в окне Tally и введите там её пароль. Мост подхватит её при следующей попытке. |
Blocked : gateway_error или gateway_empty, и у всех компаний company_closed. | Tally пока не отвечает или ответила, когда ни одна компания не открыта; читать нужно строку Blocked. (gateway — так мост называет подключение к Tally по порту 9000.) | Посмотрите на окно Tally: запустите Tally или закройте ожидающее там окно входа. |
companyName или batchTotal пустые ниже цикла. | У цикла выключен переключатель Include parent fields in each entry. | Откройте шаг цикла и включите его. |
| Доставка прекратилась после того, как кто-то нажал Создать новый. | Был выпущен новый KEY, и рабочий процесс опубликован, поэтому теперь он ждёт именно этот KEY. | Скопируйте новый KEY в bridge.yml, перезапустите мост и нажмите Обновить опубликованную версию. |
| После перезагрузки ПК записи не приходят. | Мост работает в вашем сеансе Windows после входа, а у Tally должны быть открыты компании. | Войдите в систему и откройте компании; примерно через минуту мост продолжит работу. На ПК, за которым никто не сидит, включите автоматический вход в Windows — и всё вернётся само. |
| Записи приходят дважды. | Ещё загружено прежнее дополнение Tally; или та же компания подключена как источник данных Tally на триггере Расписание; или она указана дважды под двумя ключами. | Оставьте тот маршрут, который нужен, уберите второй и перезапустите мост. |
synced и при этом Records : 0. | За этот цикл изменились типы документов вне объёма коннектора, например поступления. | Делать ничего не нужно: записи продаж и закупок актуальны. |
Надёжность в трёх строках.
Точка восстановления (RPO): практически нулевая. Tally остаётся вашей основной учётной системой, а закладка компании сдвигается только после того, как записи надёжно легли в очередь на диске, — поэтому всё, что было введено по выбранным вами компаниям и видам записей, пока не было интернета, ПК или моста, подхватывается при следующем запуске, и ничего не вводится заново.
Время восстановления (RTO): его определяет ваш ПК. Процедуры восстановления нет: как только выполнен вход в Windows и у Tally открыты компании, мост примерно через минуту продолжает работу сам, догоняет пропущенное время по расписанию и каждые 15 минут повторяет попытку для компании, которая не была открыта.
Доступность: Windows запускает его при входе и запускает снова — три попытки с интервалом в минуту, — если он когда-нибудь остановится. Подробнее: Надёжность — коротко.
sa-tally-bridge.exe test сколько угодно: он не сдвигает закладку и не меняет того, что уже синхронизировано.HTTPS_PROXY для той учётной записи Windows, под которой работает мост, — например http://proxy.example.local:8080, — и перезапустите его.up_to_date.