В интерфейсе одно, в выгрузке другое. Выгрузка не виновата

26.08.26

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

Розничная компания торгует на внешней площадке, товар туда уезжает регулярной выгрузкой. Артикула у позиции два - свой и поставщика, а какой уедет наружу, решает галочка в дополнительных сведениях. Жалоба пришла обычная: в карточке галочка стоит так, а наружу уходит другой артикул. Вместо чтения кода выгрузки я посчитал сами данные и получил ответ за один запрос: 94 655 записей свойства висят на карточках нашей номенклатуры против 31 874 у карточек поставщиков, то есть трёхкратный перекос в сторону, к которой поле по смыслу не относится. А единственный механизм, который свойство пишет, умеет ставить только "Да" - при том что записей со значением "Нет" в базе 88 481. Значит есть второй писатель, и в конфигурации его не видно. Дальше - порядок из четырёх шагов: посчитать распределение, выписать писателей, выписать читателей и только потом править данные.

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

Дальше обычно открывают код выгрузки и ищут ошибку в нём. Я разберу другой порядок действий: четыре шага, которые начинаются не с кода, а с подсчёта самих данных. На этой задаче он дал ответ за один запрос и попутно вытащил то, чего никто не искал: 88 481 запись, которую в этой базе некому было создать.

 

Как устроена конструкция

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

Карточек товара в базе тоже два вида, и это ключевая деталь всей истории:

  • карточка головной учётной системы - собственная номенклатура компании, то, чем торгуют и что видят в интерфейсе;
  • карточка поставщика - позиция из номенклатуры поставщика, приезжает обменом вместе с его прайсом и артикулами.

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

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

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

 

Развилка, на которой обычно сворачивают не туда

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

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

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

 

Шаг 1. Посчитать распределение значений по владельцам

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

Чьи карточки Записей всего Со значением "Да" Со значением "Нет"
Головной системы 94 655 10 704 83 951
Поставщиков 31 874 27 344 4 530

Первое, что видно: свойство, которое по смыслу относится к товару поставщика, стоит на карточках головной системы почти в три раза чаще. Перекос тут трёхкратный, а не "заметный".

Массово заполненное поле там, где его быть не должно, означает одно: кто-то писал его без разбора. Взял связку карточек и проставил обеим сторонам.

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

Что даёт шаг. Вы ещё не открыли ни строчки кода, а уже знаете, что данные лежат не там, где должны, и примерно понимаете, кто их туда положил.

 

Шаг 2. Выписать всех, кто может это записать

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

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

Возвращаемся к таблице первого шага. Записей со значением "Нет" в базе 83 951 плюс 4 530, то есть 88 481.

Ни одна из них не могла появиться от единственного найденного писателя. Значит, писатель есть второй, и на момент разбора он не найден.

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

Существование того, чего не нашли поиском по коду, доказано арифметикой. Это не версия и не подозрение, которое надо проверять. Либо данные врут, либо писатель есть.

Почему поиск по коду его не нашёл

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

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

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

 

Шаг 3. Выписать всех, кто это читает

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

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

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

Дальше интересный вопрос: кто из шести прав.

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

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

Что даёт шаг. Вы понимаете, надо ли вообще чинить код. Здесь чинить его было нечего: расходились трактовки, а не реализации.

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

 

Шаг 4. Выбрать сторону и не стать ещё одним писателем

Обязательная часть про то, что пошло не так у меня.

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

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

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

Проверять в этом месте надо направление, а доля отвечает на вопрос "сколько" и не знает, что вы делаете не то.

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

 

Почему чинить данные раньше поиска писателя бессмысленно

Это неприятная часть, и с ней обычно спорят.

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

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

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

 

Три грабли, которые попадутся по дороге

Связь считается двумя способами и даёт разные ответы

Та деталь из начала статьи, про реквизит шапки и табличную часть.

В базе знаний давно лежала запись, что связь между карточками идёт через реквизит шапки, и все запросы писались по ней. Замер: через табличную часть видно 313 связанных карточек, через реквизит шапки - 171. То есть канонический запрос показывал 54,6 процента связей, а про остальную половину никто не знал.

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

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

Масштаб проблемы и размер задачи - разные числа

Карточек головной системы без этого свойства вообще - 10 208. Звучит как большая работа: десять тысяч объектов надо заполнить.

Но из этих десяти тысяч связанный поставщик есть только у восьми. Ноль целых восемь сотых процента. У остальных заполнять свойство бессмысленно: без связки оно ни на что не влияет.

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

Запись свойства тянет за собой очередь выгрузки

Техническая деталь, которая испортит вечер тому, кто её не ждёт.

Запись этого свойства не проходит бесследно: подписка на событие ставит карточку в очередь повторной выгрузки во внешнюю таблицу. Массовая правка на несколько тысяч объектов означает несколько тысяч карточек в очереди.

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

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

 

Что осталось незакрытым

Границы называю честно, потому что материал без них выглядит красивее, чем работа была на самом деле.

Второй писатель не найден. Это главный незакрытый вопрос: 88 тысяч записей создал кто-то, кого мы не нашли. Пока он не найден, всё сделанное обратимо.

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

Цена вопроса не измерена. Сколько товаров реально уехало наружу с чужим артикулом и что это стоило - неизвестно. А это единственное число, которое интересует бизнес, и его у меня нет.

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

 

Порядок действий целиком

Короткая версия для тех, кто пришёл за методикой. Работает на любом поле, вокруг которого регулярно возникают вопросы "почему тут одно, а там другое".

  1. Посчитайте распределение значений по владельцам. Группировка по типу объекта и по значению. Перекос в разы туда, где поля быть не должно, виден сразу и сам называет виноватого.
  2. Выпишите всех писателей и для каждого - какие значения он может записать. Именно может, даже если обычно не пишет.
  3. Сравните множества. Значения, которых нет ни у одного писателя, доказывают существование писателя, которого вы не нашли. Это вычитание, а не догадка.
  4. Выпишите всех читателей и откуда каждый берёт значение. Источники разошлись - у вас не баг, а две несовместимые трактовки одного поля, и чинить надо трактовку.
  5. Только теперь правьте данные, и правьте ту сторону, где значение видят люди. Читателя, который смотрит в другую сторону, чините следом, а не вместо.

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

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

 

Другие наши инструменты:

  • Анализ кода внешних обработок 1С - разбирает обработки из справочника и показывает, кто из них что пишет в базу. Ровно то место, где чаще всего и прячется писатель, которого не видно в конфигурации.
  • Матрица прав доступа - кто вообще имеет право записать этот объект. Список подозреваемых сужается до тех, у кого есть доступ.
  • Выгрузка структуры метаданных - полная карта объектов и реквизитов в текстовом виде, удобно искать все места, где поле вообще упоминается.
  • Трансформатор SQL в 1С - переводит запрос из профайлера обратно в имена справочников и регистров. Помогает, когда писателя ловят на уровне СУБД и надо понять, во что он пишет.

 

Вопрос, на который у меня нет ответа

Тот самый второй писатель меня не отпускает. 88 481 запись - это не случайная правка руками и не разовая загрузка, это чья-то регулярная работа, о которой в базе не осталось следов.

Как вы ищете такое у себя? Журнал регистрации хранит месяц, а записи копились годами. Подписка на запись покажет только будущее, а вопрос про прошлое. Версионирование объектов на регистр сведений обычно не включают.

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

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

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

расхождение данных 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    190866    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    192495    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    163279    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    86230    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    209556    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    35749    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    46383    132    83    

122

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

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

70760 руб.

10.04.2026    1052    3    8    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. pbelsib 11 26.08.26 12:32 Сейчас в теме
решение: меняем правила игры. запрещаем запись, если не указали кодовое слово.
всем известным писателям даём его, они указывают его, например в дополнительные свойства при записи.
неизвестный писатель - получает отказ, и вываливается с ошибкой.
далее некая тётенька бежит к вам с проблемой "моя любимая кнопочка в самописной обработке перестала работать"
:)
2. nedomolkov.ivan 173 26.08.26 12:44 Сейчас в теме
(1) Тётенька с кнопочкой и есть искомый результат :) Только я бы начал не с запрета, а с журнала: подписка на запись набора, и туда Пользователь, ИмяКомпьютера и ИмяПриложения из ПолучитьТекущийСеансИнформационнойБазы(). Одно ИмяПриложения - уже половина ответа: BackgroundJob, Designer или COMConnection это три совсем разных разговора.

Запрет хорош вторым ходом, когда уже знаешь, кого ловишь. А то кодового слова первым делом не узнает какое-нибудь ночное регламентное, и утром это всплывёт пустой выгрузкой вместо ошибки на экране.
4. pbelousov 21 26.08.26 18:28 Сейчас в теме
3. V.Nikonov 130 26.08.26 14:07 Сейчас в теме
В ситуации с Распределёнкой: находишь некорректную запись и вычисляешь возможные периоды правки. Затем вычисляешь с кем был обмен...
Для отправки сообщения требуется регистрация/авторизация