Ставку поменяли в трёх базах. Хардкод об этом не знал

27.08.26

Интеграция - Перенос данных 1C

Правила обмена умеют лежать в двух местах сразу: в макете конфигурации, где их находит глобальный поиск и где их так удобно поправить, и в регистре сведений, откуда они на самом деле исполняются. Пока не проверишь, какой источник включён у плана обмена, правка макета выглядит сделанной и не делает ничего. Разбор задачи, где одно и то же значение ставки оказалось зашито в четырёх местах трёх разных слоёв: карта соответствий в модуле веб-сервиса, обработчик "ПослеЗагрузки" в правиле обмена, числовой ВЫБОР с внутренним ИНАЧЕ 0 внутри сгенерированных правил и общий модуль интеграции с внешним поставщиком чеков. Отдельно - почему у истории с вернувшимися карточками нет доказанной причины, хотя признак сузили до одного вида номенклатуры, и как тестовый прогон на пяти записях сломал сходимость итогового отчёта.

Задача выглядела на день. Изменилась ставка налога: надо пройти по номенклатуре в трёх базах крупной розничной сети, заменить старое значение на новое и заодно вычистить места, где старое значение зашито в коде.

Прошли, заменили, вычистили. Через шесть дней в одной из трёх баз 1 122 карточки снова оказались на старой ставке. В двух других ноль.

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

Страну и обе ставки не называю. По паре "страна плюс ставка" заказчик вычисляется с первой попытки, а на механику это не влияет никак. Дальше просто "старая" и "новая".

 

Что было в данных на старте

Первый прогон только на чтение дал такую картину по карточкам номенклатуры (без групп):

База На новой ставке На старой, чинить Без налога
Учётная 132 202 21 534 3
Розничная первая 132 792 4 839 3
Розничная вторая 135 564 17 079 3

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

Ещё одна строка отчёта важнее, чем кажется: никаких других ставок у карточек не было вообще. Ни промежуточных, ни расчётных, ни пустых. Это редкая удача: финальная проверка пишется одним условием, всё отличное от новой ставки считается отклонением, перечислять допустимые варианты руками не приходится.

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

 

Четыре хардкода одной ставки в трёх разных слоях

Дальше начали искать, откуда в живой системе вообще берётся ставка помимо справочника. Нашли четыре места, и они лежат в совершенно разных слоях.

Первое, главное. Карта соответствия ставок внутри модуля веб-сервиса (HTTP-сервис в дереве метаданных), который принимает документы из розницы в учётную базу. Ключи карты - строки вида "NN%", как их отдаёт преобразование значения перечисления в строку. Ключа для новой ставки в карте не было вовсе: входящее значение не находилось, реквизит не заполнялся, сервис ругался на неизвестную ставку. Плюс подарок сверху: одному из старых ключей был сопоставлен вообще посторонний элемент перечисления. Про новую ставку карта не знала. Про старую врала.

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

Третье. Числовой расчёт ставки в правиле выгрузки документа перемещения товаров. Внутри запроса стоит конструкция ВЫБОР с ветками на старые ставки и внутренним ИНАЧЕ 0. Ветки на новую ставку там нет. Значит у товара на новой ставке числовая ставка уезжает нулём, а вместе с ней и сумма налога в выгруженном документе. Это худший тип бага из всех: он ничего не роняет, он тихо считает ноль, и заметить его можно только через месяц по отчётам.

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

Момент, ради которого стоило перечислять. Найти один хардкод и успокоиться - самая дорогая ошибка в такой задаче. Значение, которое считается "настройкой", в живой системе расползается по слоям: модуль веб-сервиса, обработчик в правилах обмена, текст запроса внутри тех же правил, общий модуль интеграции. Слои писали разные люди в разные годы, друг про друга они не знают.

Почему поиск по конфигурации помогает наполовину

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

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

 

Главная ловушка: макет правил в конфигурации не работает

Вот тут я потерял бы день, если бы не полез проверять настройки плана обмена.

План был настроен так: типовые правила не используются, источник правил - файл. В переводе на практику это значит, что рабочие правила лежат в регистре сведений "Правила для обмена данными": текст XML (расширяемый язык разметки, в нём же правила отдаёт "Конвертация данных") в реквизитах правил и правил корреспондента плюс скомпилированное представление в отдельном реквизите. Макет внутри конфигурации при этом никуда не девается и продолжает лежать там, где лежал.

Что происходит дальше, если про это не знать.

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

Поиск не соврал. Он ответил на другой вопрос: что написано в поставке. А что исполняется - лежит в данных, и глобальный поиск данные не смотрит.

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

Отдельно про репетицию на тесте. Раз правила лежат в данных, а не в конфигурации, тест месячной давности содержит другие правила, и прогон на нём не доказывает ничего: вы отрепетировали правку того, чего в бою уже нет. Значит тест нужен свежий, а поднимать его руками перед каждой такой задачей никто не станет. Скрипт ночного восстановления собирает Тестовая база из бэкапа рабочей: задание для SQL Agent или cron каждую ночь поднимает тест из последнего бэкапа прода поверх старой копии. К СУБД обработка не подключается, только печатает скрипт, который админ читает глазами перед запуском.

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

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

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

 

Что показала диагностика вернувшихся карточек

Через шесть дней после массовой правки повторный отчёт дал: в учётной базе 154 627 карточек на новой ставке и 1 122 на старой. В обеих розничных ноль на старой, чисто.

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

Ни одна из 1 122 не помечена на удаление. Соблазн списать возврат на мусор, который просто не тронули при первой правке, был - и он не подтвердился.

Все 1 122 сидят на одном виде номенклатуры. Значит отбор шёл по признаку: случайная выборка так ровно не ложится, дата изменения тут тоже ни при чём. У самого вида ставка при этом правильная: справочник видов поправили, и он остался поправленным. Возвращались только карточки.

Диапазон кодов широкий, от карточек, созданных давно, до созданных на этой же неделе. Арифметика подтверждает: сумма трёх колонок стартового отчёта по учётной базе даёт 153 739, а после правки там 155 749, то есть за неделю прибавилось около двух тысяч новых карточек. Вернувшиеся оказались смесью старых и свежесозданных карточек; на одну откатившуюся пачку это не похоже.

Дальше честная часть, ради которой этот раздел и написан.

Из наблюдений следует, что признак у пострадавших общий и привязан к виду номенклатуры. Не следует, какой именно механизм их переписал. Хардкод в общем модуле интеграции сюда не подходит: он заполняет строки документов, карточек номенклатуры не касается вовсе, да и вид там другой. Правила обмена подходят по смыслу, версия про откат обменом выглядит правдоподобно, но прямого доказательства у нас нет: никто не поймал за руку конкретную загрузку, переписавшую конкретную карточку.

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

 

Как переписывали и что дала арифметика

Штатный асинхронный режим массовой правки в этих базах молча не отрабатывал: команда уходит, ошибок нет, эффекта тоже. Разбираться с ним было дороже, чем обойти, поэтому сделали синхронный драйвер: сначала тест на пяти записях, потом батчи по 400.

Разбивка: 5 + 400 + 400 + 317 = 1 122. Ошибок ноль.

На этой строке стоит задержаться. В исходном журнале записано "батчи 400+400+317 = 1122". Сложите сами: 1 117. Пятёрки не хватает, и это ровно тестовый прогон. В базу он записался. В сумму батчей его никто не включил. По влиянию пять записей на тысячу с лишним - мелочь. По последствиям всё хуже: через полгода это несведение будет выглядеть как потерянные записи, и объяснять его будет некому. Тестовый прогон - такая же запись в бой, как остальные, и в сумму он входит.

Вторая арифметика сходится точно, и она нужна как приёмка. До правки в учётной базе было 154 627 карточек на новой ставке, вернувшихся 1 122, после правки стало 155 749. Сумма сходится копейка в копейку, значит переписали ровно вернувшихся и никого лишнего не задели. Такую проверку стоит делать всегда, когда правите массово: если сумма не сходится, вы зацепили что-то помимо цели, и узнать об этом лучше сразу.

Итог по трём базам после правки: 155 749, 137 636 и 154 425 карточек, все на новой ставке. Позиций с другой ставкой нет ни в одной базе. Через несколько часов вторая розничная подросла до 154 898, и новые карточки создавались уже на новой ставке.

 

Проверка формой опровержения

Финальная сверка была одна и простая: выбрать по каждой базе позиции, у которых ставка отличается от новой. Ответ - пусто.

Обратите внимание на форму запроса. Мы не считали, сколько карточек переписали. Такой счётчик - отчёт о собственной работе, он всегда красивый и на вопрос приёмки не отвечает. Мы искали тех, кого не переписали. Первый запрос говорит, что я сделал; второй говорит, что осталось сломанным. В приёмку идёт второй.

Та же логика применилась к проверке кода. Заказчик применил правку общего модуля у себя, в двух базах. Верить на слово в такой задаче нельзя, а смотреть в систему контроля версий бесполезно: папка выгрузки конфигураций там в игноре, статус ничего не покажет. Сняли свежий инкрементальный дамп конфигурации из базы в файлы и прочитали строку в выгруженном модуле. Строка новая - значит правка в базе. Доказательством работает дамп из живой базы. Сообщение "я обновил" доказательством не работает.

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

 

Границы применимости и что мы не сделали

История с регистром работает только при источнике правил "файл". Если у вас типовые правила из конфигурации, макет и есть рабочее правило, и всё написанное выше про регистр к вам не относится. Зато относится обратное: у вас правила меняются вместе с обновлением конфигурации, у нас - нет, и это разные операционные риски.

Причина возврата 1 122 карточек не установлена. Признак сузили до вида номенклатуры, версию про обмен считаем правдоподобной, доказательства нет, расследование не заказывали.

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

Одно расхождение в цифрах, которое мы не объяснили. Сложите строку первой розничной в стартовой таблице: 132 792 + 4 839 + 3 = 137 634, а через неделю там 137 636. Прирост две карточки за шесть дней. В учётной за тот же срок прибавилось 2 010, во второй розничной 1 779. Числа верные, все три сняты одним и тем же отчётом, но почему первая розничная практически не выросла, я не знаю: замера по созданию карточек в ней мы не делали. Пишу это здесь, чтобы никто не потратил время, пытаясь свести таблицу.

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

 

Открытый вопрос

Зашитые соответствия в правилах обмена - ставки, коды видов, единицы измерения, коэффициенты пересчёта - находятся всегда случайно и всегда после того, как выстрелили. Кто-нибудь делал у себя регулярную ревизию на такое? Мне видится единственный формализуемый вариант: выгрузить рабочие правила из регистра в текст и прогнать поиск по значениям, которые обязаны быть данными. Дальше всё равно упирается в ручной разбор находок. Если у кого-то получилось лучше, расскажите, как.

Вступайте в нашу телеграмм-группу Инфостарт

правила обмена конвертация данных ПравилаДляОбменаДанными ИсточникПравил Файл загруженные правила обмена зашитые значения хардкод ставки изменение ставки налога массовая правка справочников поиск по конфигурации макеты конфигурации синхронизация баз 1С обмен

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

50050 руб.

25.02.2015    190888    372    294    

428

Перенос данных 1C Программист 1С:Предприятие 8 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

58000 руб.

04.08.2015    192544    462    308    

462

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27633 24870 руб.

12.06.2017    163307    993    329    

487

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

58000 руб.

15.04.2019    86250    231    181    

168

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам.

50200 руб.

24.04.2015    209571    179    253    

298

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Переносите справочную информацию, остатки и документы из УПП 1.3 в Бухгалтерию 3.0 с помощью готовых правил. Переносится более 50 видов документов. Простой интерфейс и понятные настройки.

42000 37800 руб.

15.12.2021    35773    263    68    

200

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

55200 руб.

03.12.2020    46389    132    83    

122

Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Системный администратор Программист Бухгалтер 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Платные (руб)

Обработка не только формирует начальные остатки по всем счетам на нужную дату (экономя время на свёртке базы БП 3), но и полностью переносит справочные данные и документы за заданный период. Гибкая настройка включает фильтр по организациям и множество параметров выгрузки. Работайте в удобном формате: выполните однократный полный переход или настройте регулярную догрузку только новых документов из БП 3 в БП 3.0. Интеграция правил конвертации в план обмена гарантирует точную выгрузку исключительно зарегистрированных объектов.

70760 руб.

10.04.2026    1060    3    8    

2
Для отправки сообщения требуется регистрация/авторизация