Пять тысяч строк одного списка: собираю франчайзинговую сеть 1С по открытым данным и сверяю с ЕГРЮЛ

У фирмы «1С» есть открытый список 1С-франчайзи: страница, где можно выбрать регион и увидеть всех, кто внедряет «1С:Предприятие» в вашем городе. Это, пожалуй, самая большая франчайзинговая сеть в российском IT, и нечастый случай, когда франчайзер сам выкладывает всю сеть одной страницей. Я хотел простого: собрать этот список целиком, посчитать, как сеть разложена по карте, и привязать каждую строку к юрлицу в ЕГРЮЛ.
Простого не вышло. Ниже - как устроен источник, что в нём сломано и сколько строк в итоге удаётся честно связать с реестром. Код на Python, короткими кусками, всё снято 12 октября 2026 года.
Франчайзер - это одна фирма, франчайзи - пять тысяч строк
Франчайзер - это компания, которая разрешает другим работать под своей маркой и по своим правилам, а взамен берёт плату и требует соблюдать стандарт. Здесь франчайзер один - фирма «1С». Франчайзи у неё - фирмы, которые продают и внедряют её программы под маркой «1С:Франчайзинг».
Условия фирма описывает сама, на странице «Как стать партнёром»: начальные затраты от 27 000 рублей, ежеквартальный взнос 3 000 рублей и аттестация специалистов. Это слова фирмы на её странице, а не проверенная смета: что на деле стоит вход в сеть, из открытых данных не видно, и в этом разборе я эти цифры не проверял.
Для разработчика интереснее другое. Обычно франчайзер прячет список своих точек или отдаёт его кусками. Здесь список открыт, и его можно обойти скриптом.
Откуда берутся данные
Страница franch-citylist.jsp с моего сервера открылась сразу. Сервер стоит в Амстердаме, и половина российских сайтов встречает его антиботом, так что это первое, что я проверяю. Здесь перед сайтом стоит защитный слой, но обычный запрос с браузерным заголовком получает 200.
Внутри страницы один и тот же список живёт дважды.
Первый раз - в таблице под фильтрами: город, название, отметки, телефон, по 30 строк на страницу и пагинация через POST формы. Второй раз - в JavaScript, в массиве для карты, причём целиком, без пагинации:
`python m = re.search(r"var partners = (\[.?\]);?\s\n", page) points = json.loads(m.group(1)) len(points) # 4985 `
Массив карты - подарок: адрес, телефон, сайт, число сертифицированных специалистов, всё в одном JSON. Таблица беднее, но только в ней есть город, а регион - только в фильтре над ней. Поэтому я обошёл обе: массив целиком одним запросом и таблицу по каждому из 93 значений фильтра, от Абхазии до Ярославской области, с паузой в две секунды. Сырые ответы легли на диск сжатыми, чтобы любой пересчёт шёл без нового обхода.
Грабли первая: широта лежит в поле долготы
Первая запись массива выглядит так (сокращаю):
`json {"partcode": "03096", "lat": "37.574804", "lon": "55.814300", "contentName": " <b> ... </b> ", "contentBoby": " <div ...> Адрес: 127434, Москва ..."} `
Москва лежит на 55-й параллели и 37-м меридиане. Здесь в поле lat записана долгота, в lon - широта. Карта на странице при этом рисуется правильно, потому что JavaScript тоже читает их наоборот:
`javascript new ymaps.Placemark([partner.lon, partner.lat], ...) `
Две ошибки компенсируют друг друга, и снаружи всё работает. Сломается у того, кто возьмёт JSON и поверит именам полей: Москва уедет на север Ирана, а вместе с ней и остальные пять тысяч точек. Рядом поле contentBoby - с опечаткой в имени, и его тоже надо писать именно так.
Второе про координаты: 14 точек стоят в одной и той же точке - в центре Москвы, хотя адреса у них разные, от переулка в центре до абонентского ящика. Всего повторов координат 153. Предположительно, когда геокодер не разобрал адрес, он поставил точку в центр города. Для карты это не страшно, для любого анализа «кто где» - да: эти фирмы окажутся у Кремля.
Грабли вторая: регулярка видела только каждую двадцатую строку
Таблицу я начал разбирать регуляркой «ячейка города, затем <h3>, в нём ссылка на офис». На первой странице она нашла 29 строк из 30, и я решил, что потерял одну на краю страницы. Оказалось наоборот.
Тег <h3> вокруг названия получают только партнёры с сертификатом ISO 9001. Без фильтра первая страница почти целиком состоит из них: таких на ней было 29. Во всём списке - 260 строк из 5 264. Регулярка с обязательным <h3> молча прочла бы двадцатую часть списка и выдала результат, который выглядит правдоподобно: Москва, крупные фирмы, всё на месте.
Починка - резать таблицу по <tr> и делать заголовок необязательным:
```python CELL = re.compile( r'<a href="\?city=([^"])">.?</a>\s*</td>\s*<td>\s*(?:<h3>\s*)?' r'<a href="franch\.jsp\?id=(\d+)[^"]">(.?)</a>', re.S)
for chunk in page.split("<tr>")[1:]: m = CELL.search(chunk) ```
Вывод общий: если первая страница отдала почти всё, проверьте это на второй. Первая страница отсортирована, и как раз она нетипична.
Одна сеть, четыре разных размера
Сколько же франчайзи у 1С? Ответов у меня четыре, и все с сайта самой фирмы.

На странице «Как стать партнёром» написано «более 8 500 партнёров». На страницах о партнёрской сети - «более 8000 организаций». В самом списке 5 264 строки, из них разных номеров офисов 5 261: один номер встречается четыре раза. А массив карты, который должен быть тем же списком, содержит 4 985 точек.
Разницу между списком и картой удалось разобрать почти до конца. Каждое название с карты есть в таблице, обратное неверно: у 279 строк точки нет. Ещё интереснее с зарубежными странами. В полной карте точки Казахстана, Беларуси и других стран есть, а если выбрать в фильтре любую из одиннадцати стран, таблица заполняется, а карта остаётся пустой. По российским регионам фильтры дают 4 190 точек, остальные живут только в общей карте.
Между «более 8000» и пятью тысячами строк я объяснения не нашёл. Предположительно, слова на страницах писались в разные годы и считают все договоры, а список показывает только аттестованных франчайзи, но проверить это по открытым данным нельзя. Практический вывод проще: размер сети в тексте фирмы и размер её открытого списка - два разных числа, и в любой таблице надо писать, какое из них взято.
География по списку такая. 535 городов, из них 467 в России. 824 строки, то есть почти шестая часть списка, - не Россия: Казахстан (547), Беларусь (96), Узбекистан (60) и ещё восемь стран. Москва - 726 строк, Санкт-Петербург - 314, вместе 23,4% российской части. Остальное разложено по региональным центрам и небольшим городам: российских регионов в фильтре 82, и в одном из них, Карачаево-Черкесии, строк ноль - фильтр есть, офисов нет.
Франчайзи - это юрлицо, а в списке марка
Франчайзи - это не офис на карте и не название в таблице, а сторона договора: юрлицо или индивидуальный предприниматель с ИНН. Чтобы узнать, сколько фирме лет и жива ли она, нужен ЕГРЮЛ. И вот здесь список ломается сильнее всего: ИНН в нём нет. Ни в таблице, ни в карточке офиса - я открыл карточку и проверил.
Значит, связать 1С-франчайзи с реестром можно только поиском по названию в регионе. Я взял случайную выборку из 150 названий (зерно генератора записано в скрипте) и прогнал каждое через поиск egrul.nalog.ru. Запрос двухшаговый: сначала отправляешь форму и получаешь токен, потом забираешь результат по токену.
`python t = s.post("https://egrul.nalog.ru/", data={"query": name, "region": fns_code}).json()["t"] rows = s.get(f"https://egrul.nalog.ru/search-result/{t}").json()["rows"] `
Тут же вторая ловушка: коды регионов у 1С свои. Алтайский край в фильтре 1С - «01», у ФНС - «22». Сводил по названию региона, причём названия у 1С тоже свои: «Республика Татарстан (Татарстан)», «Чувашская Республика - Чувашия».
Поиск ФНС нечёткий: на название из трёх обычных слов он возвращает тысячи строк, медиана по выборке - 214. Поэтому совпадением я считаю только равенство имени в кавычках из краткого наименования и названия из списка после нормализации: регистр, «ё», кавычки, пробелы и дефисы.

Что получилось на 150 названиях:
75 связались с одним действующим юрлицом в своём регионе;
у 19 нашлось несколько действующих тёзок, и без второго признака не выбрать;
у 8 совпали только прекращённые юрлица: имя есть, живой фирмы с ним нет;
37 не связались вовсе;
11 - индивидуальные предприниматели, их в ЕГРЮЛ нет, они в ЕГРИП.
У 36 названий из 150 среди совпадений есть хотя бы одно прекращённое юрлицо. Если взять из ответа первую строку, не глядя на признак прекращения, часть сети окажется давно закрытой. Это не так: закрыт тёзка.
Почему 37 названий не связались
Я посмотрел их глазами, и почти все причины видны прямо в названиях.
Украшения вместо имени. 423 названия в списке начинаются с «1С:Франчайзи» или «1С:Франчайзинг.», а в ЕГРЮЛ фирма записана без этой приставки. Есть и обычные «Компания», «Фирма», «Группа компаний», «Внедренческий центр», пояснения в скобках вроде «(бывший ...)».
Латиница внутри кириллицы. 21 название начинается с латинской «1C», а не с кириллической «1С»: поиск по списку на «1С» их просто не найдёт. Ещё семь слов содержат одну букву чужого алфавита. Где-то это игра слов, а где-то явная опечатка: латинская «c» внутри русского слова, латинская «u» посреди слова «Франчайзинг». В одном названии и сама приставка с опечаткой: «Фрайчайзинг». На экране не видно, а == видит.
```python LOOKALIKE = str.maketrans("ABCEHKMOPTXaceopxy", "АВСЕНКМОРТХасеорху")
def clean(name): name = re.sub(r"\([^)]*\)", " ", name) name = PREFIXES.sub("", name.strip()) # латиницу переводим только в словах, где уже есть кириллица return norm(" ".join( w.translate(LOOKALIKE) if re.search("[а-я]", w, re.I) and re.search("[a-z]", w, re.I) else w for w in name.split())) ```
Второй проход с такой чисткой по уже сохранённым ответам ФНС добавил 13 совпадений к 89 точным, новых запросов не понадобилось. Поэтому я сохраняю всю первую страницу ответа, а не только то, что подошло под правило: правило меняется, а ходить в реестр второй раз не хочется.
Марка, которой нет в реестре. Оставшиеся - латинские торговые марки при русском юрлице и названия, которые вообще не похожи на зарегистрированное имя. Их без ИНН не связать никак.
Одинаковые имена у разных фирм. Это видно ещё до реестра: 137 названий встречаются в списке в разных городах, одно - в семи. Сети с филиалами пишут город после запятой, а эти нет, значит, это разные фирмы с одинаковой вывеской. Группировать сеть по названию нельзя.
И честное ограничение метода: я разбирал только первую страницу ответа ФНС, до 20 строк. У названий-тёзок с тысячами совпадений нужная фирма могла оказаться дальше, и часть «не связали» - это, предположительно, недобор, а не отсутствие.
Сколько лет франчайзи
У 75 названий, связанных с одним действующим юрлицом, годы регистрации - от 2002-го до 2023-го, медиана 2011. 35 зарегистрированы раньше 2010 года, 8 - начиная с 2020-го. Выборка маленькая, и это год регистрации юрлица, а не стаж работы с 1С: фирма могла прийти в сеть позже, а работать раньше под другим юрлицом. Но порядок виден: большая часть сети - фирмы с десятилетней историей, а не вчерашние стартапы.
Пять правил, которые я вынес из этого списка
Имя поля - не документ. lat с долготой внутри работает годами, потому что фронтенд ошибается симметрично. Проверить координаты по одному известному адресу - пять секунд, не проверить - пять тысяч точек не в той стране.
Первая страница отсортирована, а значит, нетипична. 29 из 30 на первой странице и 260 из 5 264 во всём списке - это одна и та же регулярка.
У сети несколько размеров, и надо писать, какой взят. Слова франчайзера, его открытый список и его же карта дают три разных числа. Ни одно не враньё, они просто считают разное.
Без общего ключа сопоставление - вероятностное. Половину выборки удалось связать с одним действующим юрлицом, остальное требует либо ИНН, либо ручной проверки. Прекращённые тёзки - отдельная ловушка: без фильтра по статусу живая сеть превращается в кладбище.
Сохраняйте сырые ответы. Правило сопоставления я менял уже после обхода, а в ФНС сходил один раз.
Данные разбора: список «Франчайзи, внедряющие 1С:Предприятие» на сайте фирмы «1С» и три её страницы о партнёрах, снятые 12 октября 2026 года; поиск по ЕГРЮЛ на egrul.nalog.ru в тот же день, случайная выборка 150 названий. Названий конкретных фирм в тексте нет намеренно: разбор про данные, а не про партнёров.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.