
В год я заносил в таблицу ДДС примерно 1500 операций, в среднем на каждую строку тратил одну минуту. Получается, это 3 рабочих дня, которые теперь я могу посвятить бизнесу, а не табличке.
В статье даю пошаговую инструкцию, как автоматизировать ведение управленческого отчёта ДДС — без кода, без хостинга и своего сервера. Если вы не разработчик — вы справитесь, обещаю.
Отчёт о движении денежных средств — самый базовый отчёт, который должен быть у любого бизнеса. Вы можете двигаться интуитивно и не вести ОПиУ и Баланс, но ДДС должен быть. Самое главное — с ним вы видите, сколько денег в каждом кошельке и на всех вместе прямо сейчас.

ДДС помогает избежать кассовых разрывов, вовремя платить зарплату и налоги. Также по нему вы сможете собрать ОПиУ с ретроспективой на несколько месяцев назад, а без него — нет. Да и просто это удобно: видеть и записывать все финансовые операции, которые проходят через ваш бизнес, а потом отфильтровать и построить любой график или проверить финансовую гипотезу.
Почитайте заодно нашу статью про составление годового бюджета. В ней подробнее рассказали, зачем нужно вести такие отчеты и как их составлять без бухгалтера.
Я пользуюсь шаблоном от «Нескучных финансов», который скачал у них на сайте. Для нашей задачи подойдет любой, но здесь буду показывать на его примере.
Шаг 1. Во вкладке «ДДС: настройки» введите все ваши кошельки и укажите месяц, когда вы начали вести отчёт.

Шаг 2. Во вкладке «ДДС: статьи» можно ничего не делать, всё самое важное уже есть. Но если вы хотите считать что-то специфическое, то добавьте статьи, которые вам нужны. Например, я добавил «Оплату административных подрядчиков», чтобы увидеть, когда стоимость бухгалтерии на аутсорсе сравняется со стоимостью найма бухгалтера в штат. По производственным подрядчикам сделал то же самое.

Шаг 3. Для каждого кошелька есть своя вкладка. Настройте столько вкладок, сколько у вас заведено кошельков на шаге 1. Каждую — под свой кошелёк.

Шаг 4. На вкладке «ДДС: месяц» начинайте вносить все операции: пришла оплата — занесли в ДДС, купили по бизнес-карте мороженку — тоже. Если пропустить хотя бы 1 копейку, отчёт будет недостоверным, цифры не сойдутся. Заполнять нужно все поля, кроме белых — туда значения подставляются сами по ходу заполнения жёлтых полей.

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

Наша с вами задача — принять эти данные и сделать автозаполнение,
Для этого и всего остального нам понадобится сервис Make.com — это конструктор интеграций. Как конструктор чат-ботов для Телеграма, но только для любых интеграций.
Make.com платный, стоит $ 10 в месяц, его можно заменить бесплатным n8n, но это не так удобно, потому что n8n нужно разворачивать на своём хостинге. А платить за него — выйдет столько же, сколько и за Make. К тому же Make проще.
Карты РФ сервис не принимает, но спустя 3 года санкций все уже умеют оплачивать зарубежные сервисы, тут останавливаться не буду.

Вся работа в Make — это цепочка действий, которые выполняются друг за другом. Первое действие — принять данные от банка. Для этого нам нужно ухо, которое будет 24/7 слушать Т-банк. На языке программистов это ухо называется «вебхук».

Сейчас вы создали не сам вебхук, а только действие, внутри которого можно использовать разные вебхуки. Если вы впервые в Make, то вебхуков у вас нет, нужно их создать. Нажмите Add, задайте имя и Save.

Ваш вебхук готов принимать данные от банка, осталось только сообщить банку, куда нужно слать эти данные.
Нам нужно сообщить банку, по какому адресу находится наше ухо. Именно туда и будет банк слать данные по операциям. Адрес — это ссылка, которую нам выдал Make, когда мы включили вебхук.

Обычно при таких интеграциях можно зайти в личный кабинет сервиса, указать адрес и поставить галочку «Отправлять уведомления». В Т-банке такого функционала нет, все вопросы решает поддержка. Возможно, это сделано для безопасности.
Чтобы попросить банк слать на наш вебхук уведомления, нужно написать на почту openapi@tbank.ru с любой почты, которая привязана к вашей компании. Они уже сами настроят отправку запросов по вашему адресу.
В теме письма напишите:

Подключение занимает до двух дней, после чего с вами свяжется инженер и пришлёт ответ:

Всё готово, и теперь нужно проверить, приходят ли данные из Т-банка на ваш вебхук. Для этого перейдите в Make и нажмите кнопку Run once, чтобы запустить сценарий.

После того как вебхук включился, зайдите в банк и отправьте себе со счёта 10 рублей. Если всё прошло успешно, в Make будет следующая картина:

Теперь эти данные нужно просто отправить в наш отчёт ДДС. Но если мы их не подготовим, таблицы не поймут форматирование и сработают неправильно:

Подготовка данных — это цепочка действий, которые Make будет выполнять одно за другим. Вся цепочка выглядит так:

О чём вообще эта цепочка. Нам нужно сказать Make: «Дружище, в ближайшей свободной строке найди ячейки и положи в них данные. Например, в ячейку E напиши число 10 000».
Но вот проблема: сейчас это 10 000, а завтра это −6750. Поэтому мы будем просить Make заносить в таблицу не конкретные числа, а переменные. А переменная будет содержать актуальное число из вебхука. Это как в почте: для вас это выглядит «Привет, Илья Ерёмин!», а для разработчика «Привет, {{name}}!». Где {{name}}=»Илья Ерёмин" из базы данных.
Все эти фиолетовые шарики — это действия, которые придают бесформенным переменным конкретное число. И потом эти конкретные числа лягут в таблицу.
Шарик 2. Отфильтровать повторные операции. У Т-Банка есть особенность: операция одна, а информацию о ней присылают 3−7 раз. Вебхук ловит всё, и если их все занести в таблицу, получится много дублей, поэтому нам нужно отфильтровать повторы. Для этого у каждой операции есть свой уникальный код. Разработчики в Т-банке назвали его OperationID. В другом банке это может называться по-другому, например, TransactionID.
OperationID выглядит так: 6ebb23a4−5a33−00d0−952f-50d69a9b74785
Чтобы проверить номер ID на уникальность, каждый новый нужно сравнивать с предыдущими OperationID, и если он новый, то записывать его и идти дальше по цепочке. А если он уже был, то не пропускать.
Создайте новый шарик, он называется Check the existence a record. Этот шарик проверяет, есть ли в нашем списке OperationID. Так как у вас ещё не создана никакая база данных, создайте новую так же, как вы создавали Webhook: прямо из шарика нажмите Add и придумайте любое название. После этого вам нужно заполнить поле Key. И как только вы в него нажмёте, Make предложит туда подставить любую переменную из тех, что банк прислал на Webhook.

Данные, которые присылает Т-банк на вебхук, состоят из 2 основных частей. 1 — это заголовок, например OperationID. 2 — это содержание (ключ), например 6ebb23a4−5a33−00d0−952f-50d69a9b74785. Всё как в обычном тексте: есть заголовок статьи, а есть текст, который вы сейчас читаете — и тут то же самое. И в любых интеграциях то же самое: заголовок → содержание (ключ). Make делает все заголовки переменными, поэтому просто нажмите на нужный заголовок, и он сам подставится в поле Key
Что мы в итоге сделали: мы создали шарик с названием «Проверь, есть ли в базе данных операция по счёту». Когда шарик спросил: «А какая именно операция?», — мы сказали: «Та самая, которая скрывается под заголовком operationID».
Дальше всё будет настраиваться по такому же принципу: мы указываем, какой заголовок из вебхука брать и что с ним делать. Вот и вся автоматизация.
Шарик 3. Записать операцию в базу данных. Каждую операцию нужно записывать, чтобы было с чем сравнивать и фильтровать повторы. Добавьте шарик (add/replace a record) и в поле Key снова укажите operationID.
Теперь прогоните данные по новым шарикам: нажмите Run once и совершите платёж со счёта на 10 рублей. Вебхук получит новые данные, проверит, есть ли operationID в базе (спойлер: нет), и запишет его в базу.
Фильтр между шариками 2 и 3. Повторные операции нельзя пропускать дальше, иначе они запишутся в базу данных и пройдут по цепочке. Поэтому между голубыми шариками установите фильтр.

Итак, мы отфильтровали все двойные операции — одинаковые просто не пролезут дальше. Пришло время настраивать переменные.
Шарик 4. Отредактировать дату платежа. Нам нужно будет заносить дату транзакции в ячейку таблицы с помощью переменной, поэтому нужно указать, что должно содержаться в этой переменной.
Создайте шарик Set Variable, назовите это как угодно и в поле Variable value вставьте autorizationDate из вебхука. Make сам предложит список, когда вы нажмёте в поле.

Но вот незадача. Если оставить в таком виде, то в итоге в таблицу мы занесём значение 2025−10−25T04:23:03Z, а таблицы поймут только
{{formatDate (parseDate (1.authorizationDate; «YYYY-MM-DDTHH:mm:ssZ»; «UTC»); «DD.MM.YYYY»; «UTC»)}}

Шарик 5. Приход оставить как есть, а расходу добавить минус. Чтобы таблица корректно считала расход, нам нужно подставлять к числу минус, а банк передаёт только положительные числа. Но при этом он указывает тип операции: Debit или Credit. По этому признаку мы и поймём, это приход денег или расход. И по результатам либо оставим как есть, либо добавим к числу минус. Вставьте в поле Variable value вот эту формулу:
{{if (1.typeOfOperation = «Debit»; -1 * 1. operationAmount; 1. operationAmount)}}
Должно получиться вот так:

Шарик 6. Задаём название кошелька. Эта переменная будет отправлять в таблицу не переменную, а всегда один и тот же текст с названием кошелька — таким же, как у вас в ДДС. У меня оно вот такое:

Шарик 7. Как в предыдущем шаге, только вместо названия кошелька — название направления бизнеса как у вас в отчёте.
Шарик 8. Задаём статью. Банк не может знать, по каким статьям у вас расход — статьи расхода вам нужно будет всегда указывать вручную в самой таблице. Но при этом мы точно знаем, что 99% всех приходов — это статья «Оплата». Поэтому эту переменную задаём такой формулой:
{{if (1.typeOfOperation = «Credit»; «Оплата»; ««)}}
Что в переводе означает «Если тип операции „Credit“, то задать значение „Оплата“, а если нет, то оставить пустым». Так любой приход будет заполнять ячейку «Статья», а любая трата по карте оставит ячейку пустой — её вы заполните сами. Если статья «Оплата» у вас называется по-другому, пишите так, как у вас.
Шарик 9. Меняем точку на запятую. Иногда банк присылает сумму операции с точкой: 123.65. А таблицы понимают только запятые: 123,65. Почему только иногда, я так и не понял — и на всякий случай на всех операциях выполняю эту формулу:
{{if (contains (toString (5.signedAmount); «.»); replace (toString (5.signedAmount); «.»; «,»); toString (5.signedAmount))}}
Что в переводе означает «Замени точку на запятую». Но тут есть особенность: если мы будем избавлять от точки число, которое присылает банк, мы снова потеряем момент с минусом и можем занести в таблицу расход как приход. Поэтому избавлять от точки нужно число, которое получилось в переменной в шарике 5, а не то, что присылает банк на вебхук. Поэтому формула должна содержать название переменной шарика 5. У меня шарик 5 называется signedAmount, а вы подставьте своё название.

Перед переменными стоят какие-то цифры, например 5. signedAmount. Они просто соответствуют номеру шарика. Если у вас получился другой порядок, используйте другую цифру.
Шарик 10. Задаём задержку. У гугл-таблиц есть ограничения: 1 операция в секунду. Make же работает значительно быстрее и может в секунду выполнять сотни операций. Поэтому если 2 операции произойдут почти одновременно, таблицы захлебнутся, случится ошибка и сценарий остановится до тех пор, пока вы не перезапустите его вручную.
Такое случается, если у вас в Т-банке настроена «Бизнес-копилка»:
Операция 1 — пришла оплата от клиента
Операция 2 — списать с основного счёта
Операция 3 — добавить в бизнес-копилку
Таблицы могут записать эти 3 операции только за 3 секунды, а Make будет им напихивать кратно быстрее. Поэтому нужна задержка, чтобы все 3 операции без ошибок записались в ДДС.
Создайте шарик Sleep и задайте рандомный таймер от 1 до 10 секунд с помощью формулы:
{{floor (4 + random * 7)}}
Так перед финальным 11-м шариком возникнет очередь, и операции занесутся одна за одной без ошибок.

Шарик 11. Финальный. Заносим данные в отчёт ДДС. Прежде чем приступить к шагу с автозаполнением, прогоните Run once (надеюсь, после всех тестов у вас ещё остались деньги на счету). Это нужно, чтобы Make исполнил все действия с переменными и разбил их на заголовки и ключи — так они появятся в подсказках, и тогда их можно будет подставлять в поля.
Теперь нужно подключить гугл-таблицу к Make и настроить область поиска. Для этого создайте шарик Add a Row — это действие, которое работает так: Make идёт в таблицу, находит первую незаполненную строку и вносит туда данные. Ровно то, что нам и нужно.
Вот как настроить действие:

Остаётся то, зачем мы все здесь собрались: указать Make, какие данные и в какую ячейку положить для автозаполнения. Для этого нужно указать в ячейках названия переменных, содержание которых Make занесёт в таблицу.

Если всё готово, сохраняйте и делайте Run once. Надеюсь, у вас всё получилось 🍾
Фильтр залётных запросов. Несколько раз банк прислал мне на вебхук какую-то ерунду, которая не относится к транзакциям. Это сломало сценарий, и его приходилось перезапускать вручную, поэтому на входе я поставил фильтр: если вебхук принимает данные, в которых нет поля operationID, то дальше не пропускать. Советую сделать то же самое.


Осталось протянуть ячейки с формулами донизу и проставить статьи расходов. И ДДС пересчитается:

Сейчас я пытаюсь связать ДДС и ОПиУ, чтобы настроить автозаполнение для второго важнейшего отчёта бизнеса. Не знаю, когда закончу и напишу статью об этом, анонс будет в моём ТГ-канале.
Можно. Структура данных будет немного отличаться, но принцип тот же самый: понять, какие поля за что отвечают, отформатировать и разложить по ячейкам.
Остальные не узнавал. Если знаете, дополните в комментариях.