IDE + MCPУстранение дублирующих документов
Найдены и устранены дублирующие реализации по клиенту, отрицательный аванс −129 000 ₽ убран, расчёты выровнены (реализации = оплаты = 376 700 ₽, долг 0)
Коротко
По одному из клиентов в учёте накопились дублирующие акты реализации: документов было почти вдвое больше, чем выставленных счетов (38 реализаций на 668 800 ₽ против 22 счетов на 394 600 ₽), а на счёте 62.02 появился отрицательный аванс −129 000 ₽. Агент сверил документы, нашёл и пометил на удаление 16 лишних актов, отдельно разобрал спорный участок «ноябрь-декабрь 2025» и перепровёл оставшиеся документы по датам. В итоге расчёты с клиентом выровнены: реализации равны оплатам — 376 700 ₽, долг и сальдо сведены к нулю. Всё сделано прямо в рабочей базе, без программиста и без установки сторонних обработок.
Что требовалось
У клиента по одному контрагенту учёт «поехал»: реализаций числилось значительно больше, чем выставленных счетов, а на счёте 62.02 висел отрицательный аванс −129 000 ₽. Из-за этого по карточке счёта 62 было невозможно понять, есть ли у клиента задолженность или переплата. Тариф по контрагенту за разные периоды менялся (3 045 → 3 500 → 15 000 → 17 900 ₽), и при вводе документов одни и те же услуги оказались проведены дважды. Заказчик попросил разобрать контрагента, найти дубли, пометить их на удаление и проверить, все ли оплаты закрыты.
Как помог агент
Агент сверил между собой счета, реализации и поступления и подтвердил масштаб расхождения. Затем по содержанию актов (а не просто по совпадению сумм) нашёл дублирующие документы: почти на каждый месяц приходилось по два одинаковых акта — один в начале месяца, второй в конце. Было выявлено 14 подтверждённых дублей, которые после согласования с заказчиком были помечены на удаление.
Отдельно, по обращению клиента, агент построчно разобрал сложный участок «ноябрь-декабрь 2025»: один из актов на 17 900 + 5 000 ₽ оказался полностью лишним, так как обе его строки уже были учтены в других документах, — его тоже пометили на удаление. При этом агент обратил внимание на важный нюанс: похожий по сумме акт на 17 900 ₽ от 31.12.2025 — это не дубль, а тариф за январь 2026 года по новой ставке, поэтому его оставили без изменений. По отдельному решению клиента была удалена ещё одна лишняя реализация на 4 500 ₽ («Сдача декларации за 2023»).
После удалений в учёте оставалось развёрнутое сальдо (одновременно и задолженность, и аванс), потому что автоматический зачёт не пересобрался. Агент разнёс оплаты, перепроведя документы строго по датам и по одному, и после каждого шага проверял остаток. Каждое действие подтверждалось ответственным сотрудником и сверялось.
Результат
- Помечено на удаление 16 лишних документов (14 дублей + узловой акт + акт на 4 500 ₽).
- Отрицательный аванс на счёте 62.02 −129 000 ₽ устранён, стало 0.
- Развёрнутое сальдо сведено к нулю, долг клиента — 0.
- Расчёты выровнены: реализации равны оплатам — 376 700 ₽.
- Спорный акт на 17 900 ₽ (тариф января 2026) корректно оставлен и не удалён по ошибке.
Учёт по контрагенту приведён в порядок: по карточке счёта 62 теперь видна реальная картина расчётов. Вся работа выполнена в рабочей базе, без участия программиста и без установки дополнительных обработок, а спорные случаи разбирались совместно с клиентом.
1. Контекст
Беляев — клиент на ежемесячном обслуживании. Тариф изменялся по периодам: 3 045 → 3 500 → 15 000 → 17 900 ₽. При вводе/импорте документов по нему образовались дублирующие акты «Реализация услуг» (типовая ситуация, когда одна и та же услуга проведена дважды), а автозачёт авансов на этом фоне развернулся в отрицательные суммы — счёт 62 перестал отражать фактическую задолженность.
Симптомы:
- реализаций почти вдвое больше, чем выставленных счетов;
62.02имеет отрицательное значение (−129 000) — авансов закрыто больше, чем поступило;- по карточке 62 невозможно определить, имеется ли задолженность клиента или переплата.
2. Обращение заказчика
«Разбери Беляев, найди дубли и пометь на удаление. И проверь оплаты — все ли закрыты.»
Впоследствии, в ходе работы, клиент подключился к разбору лично:
«Вижу, что в ноябре 2025 проведены 2 реализации по 17 900 + 5 000 — как так, ты пропустил или возникла путаница?» «1. Удали реализацию 4 500. 2. Перепроведи если надо. 3. №45 не меняй, пусть остаётся в декабре 2025.» «А перепроведение через меня идёт в 20 параллельных потоков и упирается в блокировки — ну, делай по 1 последовательно.»
3. Исследование
3.1 Оценка масштаба — реализации в сравнении со счетами и аномалия 62
Одним запросом-объединением получены три величины:
ВЫБРАТЬ "Счета" КАК Вид, КОЛИЧЕСТВО(*) КАК Кол, СУММА(СуммаДокумента) КАК Сумма
ИЗ Документ.СчетНаОплатуПокупателю ГДЕ Контрагент = &К И ПометкаУдаления = ЛОЖЬ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ "Реализации", КОЛИЧЕСТВО(*), СУММА(СуммаДокумента)
ИЗ Документ.РеализацияТоваровУслуг ГДЕ Контрагент = &К И ПометкаУдаления = ЛОЖЬ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ "Поступления", КОЛИЧЕСТВО(*), СУММА(СуммаДокумента)
ИЗ Документ.ПоступлениеНаРасчетныйСчет ГДЕ Контрагент = &К И ПометкаУдаления = ЛОЖЬ
| Кол-во | Сумма | |
|---|---|---|
| Счета | 22 | 394 600 |
| Реализации | 38 | 668 800 |
| Поступления | 21 | 376 700 |
Остатки 62 (виртуальная таблица РегистрБухгалтерии.Хозрасчетный.Остатки): дебиторская задолженность по нескольким договорам и аномальный 62.02 = −129 000. Отрицательный аванс — надёжный индикатор дублирующих проводок (автозачёт закрыл несуществующие авансы).
3.2 Список реализаций с содержанием — выявление пар
Чтобы определять дубли по содержанию, а не по сумме, было получено содержание строк:
ВЫБРАТЬ Р.Номер, Р.Дата, Р.СуммаДокумента, Услуги.Содержание, Услуги.Сумма
ИЗ Документ.РеализацияТоваровУслуг КАК Р
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Услуги КАК Услуги
ПО Услуги.Ссылка = Р.Ссылка
ГДЕ Р.Контрагент = &К И Р.ПометкаУдаления = ЛОЖЬ
УПОРЯДОЧИТЬ ПО Р.Дата
Результат однозначный: на большинство месяцев приходится два акта одинаковой суммы, периода и содержания, один датирован началом месяца, второй — концом. Это и есть дубли.
Технический аспект — две серии нумерации. Дубли распределялись по двум сериям номеров (ранняя группа и поздняя группа), что указало на происхождение: повторный импорт/ввод тех же актов. Это позволило формализовать правило отбора, а не определять дубли визуально.
4. Решения
4.1 14 подтверждённых дублей → пометка на удаление
Правило: на каждый период оставляется один акт (датированный концом месяца, в соответствии с основной нумерацией), удаляется ранний дубль. Список из 14 пар согласован с клиентом и обработан в два пакета:
batch_1c: UNPOST × 14 (распроведение)
затем
batch_1c: DELETE_MARK × 14 (пометка на удаление)
Технический аспект — почему два пакета, а не один. UNPOST и DELETE_MARK на один и тот же документ в одном пакете приводят к конфликту версий объекта (пакет исполняется параллельно, до 20 потоков — вторая операция начинается на ещё не зафиксированной версии). Поэтому сначала выполняется весь пакет распроведения, затем — весь пакет пометки. После удаления 14 дублей аномалия −129 000 на 62.02 устранена — подтверждено запросом остатков.
4.2 Участок «ноябрь-декабрь 2025» — построчный разбор
Клиент самостоятельно обратил внимание на наличие в ноябре двух реализаций на 17 900 + 5 000. Выполнен построчный разбор: акт №162 (26.11) содержал две строки — «тариф за декабрь» (17 900) и «консультацию» (5 000), и обе строки уже присутствовали в других актах:
- декабрьский тариф 17 900 — в акте №39;
- та же консультация 5 000 — в акте №33.
Следовательно, №162 полностью лишний (его строки дублируют №39 и №33) — помечен на удаление.
Технический аспект — близкая сумма не является признаком дубля. Здесь же выявлено: акт «Основной тариф» 17 900 от 31.12.2025 — это тариф за январь 2026 по новой ставке (отдельного январского акта не было). По сумме он выглядит как декабрьский дубль, однако по содержанию — самостоятельная услуга следующего месяца. По решению клиента (№45) дата не изменялась, акт оставлен. Вывод зафиксирован явно: дедупликация выполняется по содержанию строки и периоду, а не по совпадению суммы.
4.3 Удаление акта по решению клиента + сведение сальдо
По обращению клиента помечена на удаление реализация 4 500 («Сдача декларации за 2023»). После всех удалений по документам реализации = оплаты = 376 700 (долг 0), однако в главной книге оставалось развёрнутое сальдо: 4 500 (дебиторская задолженность) одновременно с 15 000 (аванс на 62.02) — автозачёт не пересобрался автоматически, поскольку документы проводились не в хронологическом порядке.
Перепроведение по датам свело его к нулю.
Технический аспект — параллелизм и блокировки.
batch_1cисполняет пакет в ~20 потоков. При перепроведении документов одного контрагента потоки конкурируют за регистр расчётов, что приводит к ошибке «Неустранимый конфликт блокировок», и порядок дат не сохраняется (для FIFO-зачёта порядок критичен). Применённый приём: перепроведение по одному документу в порядке дат — единичный вызов выполняется в режимеmode: sync, без параллелизма и блокировок. Клиент подтвердил данный подход явно (просьба выполнять последовательно, по одному).
Технический аспект — точечное устранение остатка. Чтобы не перепроводить все документы, запросом остатков 62 в разрезе документа-расчёта (субконто) найдена конкретная реализация, на которой числился развёрнутый остаток, и перепроведена именно она. После каждого шага выполнялся контрольный запрос остатка; развёрнутая пара (4 500 / 15 000) сведена к 0.
4.4 Устойчивость к обрыву соединения
В ходе поштучного перепроведения соединение с MCP-коннектором дважды прерывалось (-32602 на всех вызовах). Поскольку каждый документ проводится в отдельной транзакции, откат данных не происходил: после переподключения работа продолжалась с того документа, на котором произошёл обрыв, — без двойных проводок и потери результатов.
5. Инструменты
5.1 Использовали в этом кейсе
| Инструмент | Что делали |
|---|---|
query_1c |
Оценка масштаба (счета/реализации/поступления), список актов с содержанием строк (...РеализацияТоваровУслуг.Услуги), остатки 62 по договорам и в разрезе документа-расчёта, поиск конкретной реализации с остатком, итоговая сверка |
metadata_1c |
Состав РеализацияТоваровУслуг перед изменениями (табличная часть Услуги, счета, признак проведения) |
batch_1c |
UNPOST + DELETE_MARK 14 дублей и узлового №162 + акта 4 500; POST документов по одному при хронологическом перепроведении |
session_info_1c |
Контекст/права сессии перед массовыми изменениями |
5.2 Что осталось за рамками — но есть в арсенале
| Инструмент / компонент | Что даёт | Когда пригодился бы в похожей задаче |
|---|---|---|
run_task / task_status / task_stop |
Асинхронная длительная задача с поллингом | Хронологическое перепроведение всех документов контрагента в фоновом режиме, с индикацией прогресса, без поштучных синхронных вызовов |
invoke_1c |
Объектный/экспортный метод конфигурации | Если бы вместо пометки на удаление потребовалось вызвать типовую процедуру перепроведения по периоду |
get_skill / skill_report |
Поиск/сохранение скилла | Скилл «дедупликация дублирующих реализаций + сведение 62» — переиспользуемый сценарий для любого клиента |
invalidate_knowledge |
Сброс семантического кэша | После массовых удалений — обновить знание агента о структуре расчётов клиента |
get_run_history |
История операций агента | Аудит: какие 16 документов и когда помечены/перепроведены |
ai_ПанельАгента |
Агент внутри 1С | Клиент самостоятельно формулирует задачу разбора дублей и прикладывает снимок карточки 62 |
| Audit-trail runtime | Журнал вызовов с токеном клиента | Каждый UNPOST/DELETE_MARK/POST фиксируется в журнале |
6. Результаты
| Метрика | Значение |
|---|---|
| Реализаций было | 38 на 668 800 ₽ |
| Счетов / поступлений | 22 на 394 600 / 21 на 376 700 |
| Помечено на удаление (14 дублей + узел №162 + акт 4 500) | 16 |
| Аномалия на 62.02 | −129 000 → 0 |
| Развёрнутое сальдо после перепроведения | 0 (долг клиента 0) |
| Реализации = оплаты | 376 700 = 376 700 |
| Перепроведено документов поштучно (sync) | по одному, в порядке дат |
| EPF в боевую базу / визитов в Конфигуратор | 0 / 0 |
7. Что это даёт пользователю MCP ai-agent-1c
- Дедупликация с учётом содержания. Агент отличает действительный дубль (та же услуга/период/сумма, двойное проведение) от внешне похожего, но реального акта (январский тариф по новой ставке, датированный декабрём). Содержание строк извлекается запросом — решение принимается по содержанию, а не по совпадению суммы.
- Сведение развёрнутого сальдо без Конфигуратора. Отрицательные авансы и развёрнутая дебиторская/кредиторская задолженность — частая проблема после некорректного ввода/импорта. Устраняется перепроведением через
batch_1c, а ограничение «параллелизм приводит к блокировкам → перепроведение по одному документу» обрабатывается прозрачно, с проверкой остатка после каждого шага. - Участие специалиста в спорных случаях. Участок ноябрь-декабрь и акт-декларацию разбирали совместно с клиентом: агент представляет построчную картину, клиент принимает решение, агент исполняет и проверяет.
- Надёжность массовых изменений. Поштучные транзакции устойчивы к обрыву связи и не приводят к двойным проводкам — это существенно при изменении десятков документов в рабочей базе.
Приложения
A. Объекты кейса
| Объект | Что с ним сделали |
|---|---|
| 14 ранних дублей реализаций (2 серии номеров) | UNPOST → DELETE_MARK |
| Реализация №162 (26.11.2025, 17 900 + 5 000) | Узловой дубль (строки = №39 + №33) → удаление |
| Реализация 4 500 («Декларация за 2023») | Удаление по решению клиента |
| Реализация №45 (31.12.2025, 17 900 = тариф янв-2026) | Оставлена — не дубль |
| Регистр Хозрасчетный, субконто «Документы расчётов» | Поиск и точечное перепроведение остатка |
B. Карта проблемы
38 реализаций (668 800) ⟷ 22 счёта (394 600) ⟷ 21 оплата (376 700)
│ │
│ на каждый месяц — 2 акта (начало + конец) │
▼ ▼
62.02 = −129 000 (отрицательный аванс = задвоение проводок)
│
▼
query_1c со строками услуг → 14 пар-дублей ── подтверждение клиента
│
├── batch_1c UNPOST×14 → DELETE_MARK×14 → −129 000 исчез
├── узел ноя-дек: №162 = строки №39 + №33 → удалить
├── №45 (17 900) = январь-2026 → ОСТАВИТЬ (не дубль)
└── акт 4 500 (декларация) → удалить
│
▼
развёрнутое сальдо 4 500 / 15 000 → перепроведение по 1 в порядке дат (sync)
│
▼
реализации = оплаты = 376 700, долг 0, сальдо 0 ✅