Когда говорят о ручном переносе данных в 1С — заказов с сайта, сделок из CRM, оплат из своей программы, — обычно считают время: столько-то документов в день на столько-то минут. Это честная, но самая маленькая часть счёта. Время видно. Ошибки и задержка — нет, потому что всплывают они в другом отделе и в другой день.

Я проектирую интеграции 1С с внешними системами и до этого двенадцать лет работал в закупках — тем самым пользователем, который принимает решения по данным из 1С. В этой статье — инженерный взгляд на двойной ввод: какие классы ошибок он порождает, почему задержка — это проблема согласованности данных, и как оценить и то и другое запросами к собственной базе, а не на глаз. Код — упрощённые примеры для статьи.

Двойной ввод как распределённая система без протокола

Если посмотреть на ручной перенос глазами разработчика, это обычная репликация между двумя системами. Только вместо протокола — человек, вместо транзакции — внимательность, вместо журнала — память.

Отсюда все классические проблемы репликации:

  • нет идемпотентности — один заказ можно ввести дважды;

  • нет общих ключей — объект ищут по названию, а не по идентификатору;

  • нет гарантии доставки — запись можно пропустить;

  • eventual consistency в человеческом времени — данные согласуются «к вечеру» или «к закрытию месяца».

Каждой из этих проблем соответствует свой класс ошибок.

Класс 1. Дубли

Самый частый и самый тихий. Покупатель с сайта уже есть в 1С как «ИП Иванов», а оператор заводит «Иванов Иван ИП». Товар есть как «Футболка базовая белая М», заводится «Футболка белая (M)».

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

Проверить себя просто:

// Контрагенты с одинаковым ИНН (и КПП, если он используется)
Запрос = Новый Запрос(
"ВЫБРАТЬ
|   К.ИНН КАК ИНН,
|   К.КПП КАК КПП,
|   КОЛИЧЕСТВО(К.Ссылка) КАК Карточек
|ИЗ
|   Справочник.Контрагенты КАК К
|ГДЕ
|   НЕ К.ПометкаУдаления
|   И К.ИНН <> """"
|СГРУППИРОВАТЬ ПО
|   К.ИНН, К.КПП
|ИМЕЮЩИЕ
|   КОЛИЧЕСТВО(К.Ссылка) > 1");

Для физлиц без ИНН полезнее группировать по нормализованному телефону из контактной информации. Для номенклатуры — по артикулу или штрихкоду. Если запрос возвращает заметное число строк, у вас есть оценка первого класса ошибок без всяких опросов сотрудников.

Что делает интеграция: ищет по ключу (ИНН, телефон, внешний ID товара), а не по названию, и не создаёт новый объект, если не нашла, — откладывает запись в очередь «требует внимания».

Класс 2. Искажения при переносе

Перепутанные цифры в количестве, цена из прошлого прайса, не та характеристика (размер L вместо M), скидка, посчитанная в уме иначе, чем на сайте. Каждая такая ошибка по отдельности мелкая, но они не случайны: чем больше позиций в документе и чем ближе конец дня, тем их больше.

Особенность этого класса — его трудно обнаружить в 1С. Документ выглядит корректным. Ошибка видна только при сравнении с источником — на складе, в споре с покупателем, при сверке с маркетингом.

Что делает интеграция: переносит значения, а не перепечатывает их. А там, где значения расходятся с 1С (цена на сайте отличается от цены в прайсе 1С больше чем на N%), — не исправляет молча, а помечает документ для проверки. Это как раз то место, где человек полезен.

Класс 3. Пропуски

Заказ пришёл в пятницу вечером, оператор ушёл, в понедельник его уже никто не вспомнил. Или письмо с заявкой ушло в спам. Пропуск — худшая ошибка, потому что её не видно вообще: в 1С нет документа, значит, нет и повода его проверять.

Проверка — только сверкой с источником: число заказов на сайте за период против числа документов в 1С с отметкой источника. Если отметки источника нет (а при ручном вводе её обычно нет), сверить нельзя, и это само по себе диагноз.

Что делает интеграция: хранит каждое входящее сообщение до разбора, а значит, «пришло» и «разобрано» становятся двумя проверяемыми состояниями. Плюс мониторинг тишины: если за день не пришло ни одного заказа при обычном потоке, это повод для оповещения, а не для радости.

Класс 4. Ошибки периода

Документ, введённый «задним числом» после закрытия периода, или, наоборот, датой ввода вместо даты события. Для бухгалтера это перепроведение и сдвиг закрытия месяца. Для управленческих отчётов — продажа, попавшая не в ту неделю.

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

Задержка: самая дорогая и самая невидимая строка

Даже если ошибок нет вовсе, ручной перенос даёт задержку: между событием во внешней системе и появлением документа в 1С проходят часы, иногда дни. Все решения, которые принимаются по 1С в это окно, принимаются по устаревшим данным:

  • закупщик заказывает товар, который уже продан, но ещё не списан в 1С, или не заказывает то, что уже кончилось;

  • менеджер обещает покупателю остаток, которого уже нет;

  • руководитель смотрит отчёт по продажам за сегодня, в котором нет половины сегодняшнего дня.

Задержку можно измерить. Если в документе есть дата события из источника (номер и дата заказа с сайта в комментарии или реквизите), сравните её с моментом создания документа. Момент создания берётся из журнала регистрации:

// Когда документы определённого типа создавались за период
Отбор = Новый Структура;
Отбор.Вставить("ДатаНачала", НачалоПериода);
Отбор.Вставить("ДатаОкончания", КонецПериода);
Отбор.Вставить("Событие", "_$Data$_.New");
Отбор.Вставить("Метаданные", Метаданные.Документы.ЗаказКлиента);

События = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(События, Отбор, "Дата, Данные, Пользователь");

Для Каждого Событие Из События Цикл
    Документ = Событие.Данные;
    // Сравните Событие.Дата с датой заказа из источника, сохранённой в документе
КонецЦикла;

Если журнал регистрации хранится не полностью или даты события в документе нет, можно хотя бы оценить распределение времени создания по часам дня. Пик вводов в 17–19 часов при заказах, оформленных равномерно с утра, — и есть ваша задержка, только в виде графика.

Что делает интеграция: сокращает окно до минут (вебхук) или до периода опроса. Не до нуля, но до величины, при которой решения принимаются уже по сегодняшней картине.

Как сложить это в одну оценку

Предлагаю простую таблицу. Цифры — условные, подставьте свои.

Строка

Как измерить

Источник данных

Время

документов в день × минут на документ × стоимость часа

наблюдение, хронометраж

Дубли

число групп-дублей по ключу

запрос к справочникам

Искажения

доля документов с правками после ввода

история версий, если включена

Пропуски

разница «в источнике» и «в 1С» за период

выгрузка источника + запрос

Период

документы, введённые после даты события на N+ дней

журнал регистрации + дата из источника

Задержка

медиана «событие → документ»

журнал регистрации

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

Чего интеграция не исправит

Честно о границах, чтобы не обещать лишнего:

  • существующие дубли интеграция не уберёт — она перестанет плодить новые и покажет старые, когда наткнётся на них при сопоставлении;

  • плохие ключи в источнике (товары на сайте без артикулов) придётся сначала привести в порядок: никакая автоматика не сопоставит то, что не сопоставит и человек;

  • человек остаётся, но меняется его роль: не переносить, а разбирать исключения из очереди. Обычно это гораздо меньше по объёму и гораздо полезнее по смыслу.

Где это обычно встречается

По моему опыту, самые «дорогие» по ошибкам места — не маркетплейсы и не типовые обмены, у которых есть готовые модули, а связки без готового решения: свой сайт или сайт на конструкторе, самописная программа для записи клиентов, своя CRM, учётная система, написанная под конкретный бизнес. Там ручной перенос живёт годами просто потому, что никто не продал «коробку».

Вместо выводов

Двойной ввод — это репликация без протокола, и у него те же болезни: дубли, искажения, пропуски, ошибки периода и задержка. Время на перенос — самая видимая, но не самая большая статья. Хорошая новость в том, что почти всё остальное можно измерить запросами к своей базе за вечер — и принимать решение по цифрам, а не по ощущениям.

Если вы считали цену двойного ввода у себя — по каким метрикам? Поделитесь в комментариях: интересно, что ещё стоит добавить в таблицу.