Что платформа 1С закрыла в 8.3.22-8.3.27 и где эти замены не работают
Разработка - Разработка внешних компонент
В мае 2026 года на Инфостарте вышла внешняя компонента WebSocket-клиента за 10 стартмани. Первый комментарий под ней был коротким: поздновато, с 27-й платформы это встроено. На 3 сентября у карточки было одно скачивание.
История частная, жанр узнаваемый. Я решил посчитать, сколько в обычной типовой конфигурации кода, который руками делает то, что платформа уже умеет сама, и можно ли это на самом деле заменить. Версии взяты из синтакс-помощника платформы 8.3.27, всё остальное проверено вызовом кода на тестовых базах 8.3.27.1606.
По дороге я был уверен в одном объяснении, поставил опыт и получил другое. Это объяснение и есть главное в статье.
По одной закрытой дыре на версию
Сначала я выписал, что появилось во встроенном языке с 8.3.22 по 8.3.27 из того, что раньше закрывали компонентой, COM-объектом или своей функцией. Источник - список изменений платформы с releases.1c.ru.
| Версия | Что появилось | Где работает | Чем закрывали раньше |
|---|---|---|---|
| 8.3.22 | ГенераторСлучайныхПаролей.СлучайныйПароль | сервер, толстый клиент | своя функция на ГенераторСлучайныхЧисел |
| 8.3.23 | четыре функции регулярных выражений | сервер, толстый клиент | VBScript.RegExp, компонента, цикл по символам |
| 8.3.24 | СредстваБуфераОбмена | только клиенты | ClipboardData скрытого поля HTML-документа |
| 8.3.25 | ВызватьПаузу | сервер, толстый клиент, но не в вызове с клиента | пустой цикл по ТекущаяДата, ping на свой адрес |
| 8.3.26 | ЧтениеФайлаАрхива: GZIP, RAR, 7-ZIP, XZ, TAR | тонкий и толстый клиент, сервер | 7z.exe и unrar через ЗапуститьПриложение |
| 8.3.27 | WebSocket-клиент, объект конфигурации | сервер, толстый клиент | внешняя компонента |
Каждую строку я вызвал на тестовой базе. Регулярка отличила 12-значный ИИН (казахстанский номер налогоплательщика) от 11 цифр с буквой. ВызватьПаузу(300), аргумент в миллисекундах, в HTTP-сервисе заняла 310 мс. ЧтениеФайлаАрхива я проверил на gzip: файл извлёкся, кириллица в тексте цела, остальные форматы беру из списка изменений. Генератор паролей отдал пароли по 12 символов. WebSocketКлиенты вернул менеджер клиентов. Буфер обмена на сервере не существует, серверная компиляция отвечает "Переменная не определена", как и обещает синтакс-помощник.
Регулярных функций в платформе четыре: СтрНайтиПоРегулярномуВыражению, СтрНайтиВсеПоРегулярномуВыражению, СтрЗаменитьПоРегулярномуВыражению и СтрПодобнаПоРегулярномуВыражению. Пятой, СтрРазделитьПоРегулярномуВыражению, которую легко нафантазировать по аналогии, нет: прогон отвечает "Процедура или функция с указанным именем не определена". И ещё одна поправка к моей памяти: ОбрабатываемаяКартинка есть с 8.3.14, а вовсе не с 8.3.22, так что компоненты для ресайза фото потеряли смысл задолго до этой линейки.
Обратите внимание на графу "Где работает". У регулярок, паузы и генератора паролей нет тонкого клиента. У хеширования, КодироватьСтроку и ТабличныйДокумент.Прочитать тоже. Это графа "Доступность" синтакс-помощника 8.3.27, вызовом в тонком клиенте я её не проверял. Пригодится через раздел.
Что нашлось в типовой конфигурации
Проверял типовую "Управление торговлей для Казахстана" 3.4.4.87: выгрузка в файлы дала 7 157 модулей и 3 534 819 строк кода. Выгрузку прошёл инструментом, про который ниже, а потом открыл глазами каждую находку.
| Что нашлось | Находок | Штатная замена |
|---|---|---|
| посимвольный цикл, проверяющий строку по набору символов | 13 | СтрПодобнаПоРегулярномуВыражению |
| Excel.Application ради чтения или записи таблицы | 7 | ТабличныйДокумент.Прочитать и Записать в xlsx |
| распаковка архива программой 7za.exe | 2 | ЧтениеФайлаАрхива |
| буфер обмена через ClipboardData HTML-поля | 2 | СредстваБуфераОбмена |
| свои функции ПобитовоеИ и ПобитовоеИли | 2 | одноимённые функции платформы |
| пауза пустым циклом по ТекущаяДата | 1 | обработчик ожидания или ВызватьПаузу |
| генератор пароля на ГенераторСлучайныхЧисел | 1 | ГенераторСлучайныхПаролей |
| ScriptControl с JavaScript внутри | 1 | ЧтениеJSON, если это был JSON |
| своя функция URLEncode | 1 | КодироватьСтроку |
Всего 30 находок. После проверки глазами верных 24, ложных 6. В четырёх местах Excel создаётся только затем, чтобы убедиться, что он установлен, или ради автофильтра в уже готовой книге, этого платформа не делает. Одно упоминание 7za.exe оказалось проверкой, что агент резервного копирования на месте. ScriptControl в модуле печати собирает массив COM, JSON там ни при чём. Дальше считаю только 24 верных.
Самое наглядное место - пауза в клиентском модуле подключаемого оборудования:
Процедура Пауза(Секунд) Экспорт ВремяЗавершения = ТекущаяДата() + Секунд; Пока ТекущаяДата() < ВремяЗавершения Цикл КонецЦикла; КонецПроцедуры
Всё время ожидания цикл работает вхолостую. На клиенте штатный путь - обработчик ожидания, но это не замена одной строки: синхронная пауза превращается в продолжение, и код, который её вызывает, придётся перестроить.
ПодключитьОбработчикОжидания("ПродолжитьПослеПаузы", Секунд, Истина);
Вторая заметная пара - функции ПобитовоеИ и ПобитовоеИли в модуле контактной информации. Они собраны руками на массивах бит и называются так же, как функции платформы из 8.3.11. Как такое компилируется, если в платформе эти имена уже заняты?
Я думал, мешает режим совместимости. Проверил: почти нет
У этой типовой режим совместимости 8.3.10. Первая гипотеза напрашивалась сама: режим прячет от кода все функции новее 8.3.10, и регулярки, пауза, архивы в этой конфигурации просто не видны. Подтверждение нашлось быстро. Внешняя обработка с одной функцией Функция ПобитовоеИ(А, Б) Экспорт на базе без режима совместимости не создаётся:
{ВнешняяОбработка.ProbaSovm.МодульОбъекта(1,9)}: Процедура или функция с указанным именем уже определена (ПобитовоеИ)
А вся типовая с такой же функцией в общем модуле проходит проверку модулей конфигуратором без ошибок. Я уже записал вывод в черновик и даже встроил его в инструмент. На вычитке меня спросили, проверял ли я это на чём-то, кроме побитовых функций. Не проверял.
Прямой опыт поставил на базе с режимом совместимости 8.3.17 на платформе 8.3.27. По гипотезе, всё из 8.3.22-8.3.27 там должно быть невидимым. Результат:
| Вызов | Появился в | В режиме 8.3.17 |
|---|---|---|
| СтрПодобнаПоРегулярномуВыражению | 8.3.23 | работает |
| ВызватьПаузу(200) | 8.3.25 | 204 мс |
| ГенераторСлучайныхПаролей | 8.3.22 | пароль из 12 символов |
| Новый ЧтениеФайлаАрхива | 8.3.26 | создан |
| WebSocketКлиенты | 8.3.27 | менеджер клиентов |
Режим совместимости новинки не прячет. Разгадка побитовых функций лежит в списке изменений: в их абзаце прямо написано "В режиме совместимости с версией 8.3.10 поведение не изменилось". У регулярок, паузы, архивов, буфера обмена, генератора паролей и WebSocket такой оговорки нет. Режим прячет ровно то, про что в списке изменений есть эта фраза, и в нашей линейке это только побитовые функции при режиме 8.3.10 и ниже.
Прогона на конфигурации именно с режимом 8.3.10 у меня нет: такой базы под рукой не нашлось, а типовую менять я не стал. Поэтому вывод звучит так: режим 8.3.17 новинки 8.3.22-8.3.27 не прячет, и в списке изменений нет ни одной оговорки, которая спрятала бы их при более низком режиме.
Что мешает на самом деле: тонкий клиент
С исправленной логикой 24 верные находки раскладываются так:
| Вывод | Находок | Какие |
|---|---|---|
| замена доступна | 8 | 3 серверных цикла проверки строк, пауза (с переделкой вызывающего кода), распаковка 7z, 2 буфера обмена, генератор пароля |
| в тонком клиенте замены нет | 14 | 10 циклов в клиент-серверных модулях, 3 места с Excel, URLEncode |
| мешает режим совместимости 8.3.10 | 2 | свои ПобитовоеИ и ПобитовоеИли |
Главная стена - клиентский контекст. Десять посимвольных циклов живут в модулях с суффиксом КлиентСервер, их код исполняется и на тонком клиенте, а регулярок там нет. ТабличныйДокумент.Прочитать тонкому клиенту недоступен, поэтому модули загрузки из Excel держатся за COM. КодироватьСтроку тоже только на сервере, и своя URLEncode в клиентском модуле появилась по понятной причине. В таком коде замена возможна только через серверный вызов, а это уже переделка, а не правка строки.
Для своих доработок вывод получается мягче, чем я ожидал. Режим совместимости поднимать ради регулярок не нужно, они работают и так. Проверить стоит другое: где исполняется код. Если проверка строки или разбор данных живут на сервере, замена на штатную функцию делается сразу. Если на клиенте, её место в серверном вызове.

Где кончается BSL: замер
Вторая половина вопроса. Допустим, штатной функции нет. Когда своя реализация на встроенном языке ещё терпима?
Здесь у меня была заготовлена цифра из прошлого замера: 422 мс на миллион умножений и 352 мс на миллион чтений байта, то есть около 2,8 МБ/с при побайтовой обработке. Перед публикацией я перепроверил её тем же способом и получил другое. Пустой цикл на миллион итераций шёл от 1 626 до 2 690 мс, миллион умножений-сложений от 2 650 до 3 676 мс, миллион чтений байта из БуферДвоичныхДанных от 2 611 до 4 818 мс. Выражение из ещё более раннего замера, С = С + Инд * 1.4142, тогда давало 662 мс, сегодня 3 016-3 364 мс.
Главный подозреваемый нашёлся быстро: служба агента сервера на тестовой машине запущена с ключом -debug, а отладка тормозит интерпретатор. Перезапускать службу ради статьи я не стал, так что отладка остаётся подозреваемой. Зато видно другое: на другом сервере то же выражение шло 6,3-6,6 с. Миллисекунды на итерацию зависят от сервера и его настроек сильнее, чем от кода, и публиковать их как константу платформы нельзя. Дальше в статье старой цифры нет.
Остаётся сравнение своего кода со штатной функцией на одной и той же машине. CRC32 я снял четырьмя заходами, регулярку тремя (в каждом заходе цикл и регулярка шли подряд), SHA-256 одним:
| Задача | Своими руками на BSL | Штатно |
|---|---|---|
| CRC32 одного мегабайта | 6 280-7 421 мс, таблица и побитовые функции | около 1 мс (предел таймера), ХешированиеДанных, суммы совпали |
| проверка "только цифры" для 20 000 строк по 12 символов | 1 461-1 785 мс, цикл по КодСимвола | 110-306 мс, СтрПодобнаПоРегулярномуВыражению |
| SHA-256 от 50 МБ | не пробовал | 307 мс |
Самописный CRC32 проигрывает штатному в тысячи раз. Регулярка в каждом заходе обогнала цикл в 6-13 раз (13,3, 5,8 и 11,1 по парам заходов). Честная оговорка: под отладкой разрыв завышен, потому что отладка тормозит цикл на встроенном языке и почти не трогает функцию, которая работает внутри платформы. Насколько он сожмётся без отладки, я не мерил. Но порядок у CRC32 такой, что никакое ускорение цикла его не догонит.
// было: 1,5-1,8 с на 20 000 строк Для Поз = 1 По СтрДлина(Стр) Цикл Код = КодСимвола(Стр, Поз); Если Код < 48 Или Код > 57 Тогда Возврат Ложь; КонецЕсли; КонецЦикла; Возврат Истина; // стало: 0,1-0,3 с; на сервере или в толстом клиенте Возврат СтрПодобнаПоРегулярномуВыражению(Стр, "[0-9]+");
Две детали к этой замене, обе проверены прогоном. СтрПодобнаПоРегулярномуВыражению сверяет строку целиком: "12а" и "а12" по шаблону [0-9]+ дают Ложь. И шаблон нужен именно [0-9]: \d пропускает арабские цифры, а цикл по кодам 48-57 их не пропускал. На пустой строке цикл возвращает Истина, а регулярка Ложь, так что для пустой строки нужен [0-9]*.

Граница отсюда такая. Пока работа сводится к вызовам платформы (запрос, хеш, архив, регулярка, JSON), встроенного языка хватает. Когда работа превращается в цикл по байтам или символам большого объёма, первым делом ищите штатную функцию, которая сделает этот цикл за вас. Нет её - выбор между компонентой и сервисом. Практики в обсуждении конструктора внешних компонент сходятся в одном: сервис по HTTP проще писать и отлаживать, а компонента оправдана для оборудования на рабочем месте и для мелочи, ради которой отдельный процесс никто держать не будет.
Чего в платформе по-прежнему нет
Обратная проверка. Новый TCPСоединение, Новый СокетСервер, Новый UDPСоединение и Новый TCPСокет отвечают "Тип не определен": произвольного TCP и UDP нет, слушающего сокета тоже. У ЧтениеPDF по синтакс-помощнику есть проверка подписей и получение вложений, методов для текста страниц нет. И FileSystemObject, ADODB.Stream, MSXML - компоненты Windows, на Linux-сервере их взять неоткуда, хотя замена на встроенный язык для всех трёх есть давно.
Для масштаба я разметил глазами полку "Разработка внешних компонент": 477 карточек. Однозначно закрыты платформой задачи семи из них: компонента регулярных выражений, два WebSocket-клиента, распаковщик RAR, ZIP-архиватор, MD5 и ImageMagick для базовых операций над картинками. Ещё около девяти закрыты частично: пауза, но только на сервере, gzip, но только распаковка, буфер обмена. Остальная полка про оборудование, камеры, форматы и подписи, куда платформа не пришла. Свежих среди закрытых две: ZIP-архиватор 2025 года и WebSocket-клиент из вступления.
Ревизор костылей: как я считал
Чтобы не искать такие места поиском по тексту, я собрал обработку "Ревизор костылей: что в вашем коде платформа уже умеет сама". Она выгружает конфигурацию конфигуратором сама или берёт готовую выгрузку, проверяет код расширений и, по желанию, внешних обработок из справочника, и открывает отчёт.
- Код разбирается лексером, который отличает код от комментария и строки. Поэтому
VBScript.RegExpв закомментированном примере и "Msxml2.DOMDocument" в тексте сообщения об ошибке находками не становятся, а COM-объект засчитывается только как аргументНовый COMОбъект(...). - Модуль без признаков костыля лексером не разбирается. Из 7 157 модулей типовой разбор понадобился 137, проверка всей конфигурации заняла 223 секунды на сервере с включённой отладкой, плюс 249 секунд выгрузки конфигуратором.
- По каждой находке отчёт пишет, доступна ли замена на месте: мешает тонкий клиент, нет на сервере, нужна платформа новее или, только для побитовых функций, мешает режим совместимости. Контекст строки берётся из директивы процедуры, а для общих модулей из их свойств в выгрузке.
В каталоге 20 правил. У каждой замены в отчёте указаны версия, где она работает, пример "было-стало" и чем она проверена: прогоном или синтакс-помощником. Правила двух уровней: "Заменить", где признак однозначный, и "На проверку", где правило судит косвенно. На типовой все 4 находки уровня "Заменить" верные, у "На проверку" верных 20 из 26. Версия на обычных формах лежит в той же карточке вторым файлом.
Мне интересно, где проходит ваша граница. Я считаю, что проверку строк и разбор данных в собственных доработках пора уносить на сервер и переводить на регулярки, даже если ради этого приходится добавить серверный вызов. Есть ли у вас код, где цикл по символам на клиенте оправдан чем-то, кроме привычки?
Обработка из этой статьи: Ревизор костылей: что в вашем коде платформа уже умеет сама.
Другие наши инструменты:
- Анализ кода внешних обработок 1С - разбирает код внешних обработок и отчётов и ищет в нём запросы в цикле, опасные вызовы и хардкод.
- Помощник перехода на 1С 8.5 - показывает, что в конфигурации изменится или сломается при переходе на платформу 8.5.
- ИИ-анализ кода 1С - движок находит место, модель объясняет и предлагает правку.
- Выгрузка метаданных для LLM - структура метаданных конфигурации в Markdown и JSON, чтобы нейросеть не выдумывала реквизиты.
- Сводная таблица в Excel из 1С без COM - собирает xlsx со сводной таблицей на сервере, где Microsoft Office не установлен.
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.