Məzmuna keç
Tez Base

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

· Dərc edilib:

Типовые для Казахстана

Типичная картина в живой конфигурации: строку проверяют циклом по КодСимвола, паузу делают пустым циклом по ТекущаяДата(), архив распаковывают через 7z.exe, а ради чтения таблицы поднимают Excel.Application. Всё это когда-то было единственным способом. Сейчас почти у каждого такого места есть штатная замена, и часть из них появилась совсем недавно, в 8.3.22-8.3.27.

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

Короткий ответ

  • Строка исполняется на сервере или в толстом клиенте, платформа 8.3.27: почти всё из таблицы ниже меняется на месте.
  • Строка в тонком клиенте или в модуле КлиентСервер: регулярок, ВызватьПаузу, хеширования, КодироватьСтроку, генератора паролей и чтения xlsx там нет. Замена возможна только через серверный вызов, то есть это уже переделка.
  • Режим совместимости новинки 8.3.22-8.3.27 не прячет. Мы проверили это исполнением в базе с режимом 8.3.17 на платформе 8.3.27: регулярка, пауза, генератор паролей, ЧтениеФайлаАрхива и WebSocketКлиенты отработали. Исключение одно: побитовые функции при режиме 8.3.10 и ниже.

Карта замен: что было и чем заменить

Версия - с какой платформы есть штатное средство. Доступность взята из синтакс-помощника 8.3.27, каждая замена вызвана кодом на тестовой базе 8.3.27.1606, кроме буфера обмена: его на сервере нет, и проверка там сводится к тому, что серверная компиляция отвечает “Переменная не определена”.

Самописный кодШтатная заменаС версииЧего нет
VBScript.RegExp, компонента регулярокСтрНайтиПоРегулярномуВыражению и ещё три функции8.3.23тонкий и веб-клиент
посимвольный цикл проверки или чистки строкиСтрПодобнаПоРегулярномуВыражению, СтрЗаменитьПоРегулярномуВыражению8.3.23тонкий и веб-клиент
компонента WebSocketобъект конфигурации “WebSocket-клиент”, WebSocketКлиенты8.3.27тонкий клиент
пауза пустым циклом или pingВызватьПаузу(Миллисекунды)8.3.25клиент и серверный вызов с клиента
7z.exe, unrar через ЗапуститьПриложениеЧтениеФайлаАрхива: GZIP, RAR, 7-ZIP, XZ, TAR8.3.26упаковки в эти форматы
буфер обмена через ClipboardData HTML-поляСредстваБуфераОбмена8.3.24сервер
пароль на ГенераторСлучайныхЧиселГенераторСлучайныхПаролей8.3.22тонкий клиент
свой MD5, SHA, CRC32ХешированиеДанных8.3.1 (SHA256 с 8.3.3)тонкий клиент
свой Base64Base64Строка, Base64Значение8.0-
ADODB.Stream ради кодировкиПолучитьДвоичныеДанныеИзСтроки с кодировкой8.3.10-
MSXML2.XMLHTTPHTTPСоединение, HTTPЗапрос8.0веб-клиент
MSXML2.DOMDocumentЧтениеXML, ПостроительDOM8.0-
Scriptlet.TypeLib ради GUIDНовый УникальныйИдентификатор8.0-
Scripting.FileSystemObjectКопироватьФайл, НайтиФайлы, УдалитьФайлы8.0-
WIA.ImageFile и компоненты ресайзаОбрабатываемаяКартинка8.3.14тонкий клиент
Excel.Application ради значенийТабличныйДокумент.Прочитать и Записать в xlsx8.3.6Прочитать в тонком клиенте
ScriptControl ради JSONПрочитатьJSON, ЗаписатьJSON8.3.6-
свои ПобитовоеИ, ПобитовоеИлиодноимённые функции платформы8.3.11режим совместимости 8.3.10 и ниже
своя URLEncodeКодироватьСтроку с КодировкаURL8.3.1тонкий клиент
компонента под любую задачу вышештатный объект этой задачи-смотреть, что компонента делает на деле

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

Сначала узнайте, где исполняется строка

Все главные новинки последних версий живут на сервере и в толстом клиенте. Тонкий клиент их не получил. Отсюда простой порядок проверки для каждой находки:

  1. Директива процедуры. &НаСервере и &НаСервереБезКонтекста - замена на месте. &НаКлиенте - смотрите столбец “Чего нет”.
  2. Общий модуль. Флажки “Сервер”, “Клиент (управляемое приложение)”, “Вызов сервера” в свойствах модуля. Модуль с флажками и клиента, и сервера (по соглашению у него суффикс КлиентСервер) исполняется и там, и там, поэтому регулярка в нём упадёт на клиенте.
  3. Откуда вызывается серверный код. ВызватьПаузу бросает исключение в серверном вызове, пришедшем с клиента. Её место - фоновые и регламентные задания, HTTP- и веб-сервисы.

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

Режим совместимости: что он прячет на самом деле

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

Проверка исполнением показывает другое. В базе с режимом 8.3.17 на платформе 8.3.27:

ВызовПоявилсяРезультат в режиме 8.3.17
СтрПодобнаПоРегулярномуВыражению8.3.23работает
ВызватьПаузу(200)8.3.25204 мс
Новый ГенераторСлучайныхПаролей8.3.22пароль из 12 символов
Новый ЧтениеФайлаАрхива8.3.26объект создан
WebSocketКлиенты8.3.27менеджер клиентов

Режим прячет то, у чего в списке изменений платформы стоит оговорка “в режиме совместимости поведение не изменилось”. В линейке 8.3.22-8.3.27 у новых функций такой оговорки нет. Есть она у побитовых функций 8.3.11, и поэтому в типовой с режимом 8.3.10 свои ПобитовоеИ и ПобитовоеИли компилируются, а внешняя обработка с той же функцией на базе без режима не создаётся с ошибкой “Процедура или функция с указанным именем уже определена (ПобитовоеИ)”.

Базы с режимом ровно 8.3.10 под рукой не было, так что честный предел вывода такой: в режиме 8.3.17 новинки видны, и в списке изменений нет оговорки, которая спрятала бы их при режиме ниже.

Рецепты: было и стало

Проверка строки регуляркой

// Было: цикл по символам
Для Поз = 1 По СтрДлина(Код) Цикл
	Если СтрНайти("0123456789", Сред(Код, Поз, 1)) = 0 Тогда
		Возврат Ложь;
	КонецЕсли;
КонецЦикла;
Возврат Истина;

// Стало: сервер или толстый клиент, 8.3.23+
Возврат СтрПодобнаПоРегулярномуВыражению(Код, "[0-9]+");

Три детали, каждая проверена прогоном:

  • СтрПодобнаПоРегулярномуВыражению сверяет строку целиком. “12а” и “а12” по шаблону [0-9]+ дают Ложь, якоря ^ и $ не нужны.
  • \d в этом движке (ICU) принимает и цифры других алфавитов, например арабские. Цикл по кодам 48-57 их отвергал. Для ИИН, БИН, кодов и номеров пишите [0-9].
  • На пустой строке цикл возвращает Истина, а [0-9]+ - Ложь. Если пустое значение допустимо, шаблон [0-9]*.

Проверка ИИН целиком, 12 цифр:

ЭтоИИН = СтрПодобнаПоРегулярномуВыражению(Строка, "[0-9]{12}");

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

Пауза

// Было: процессор крутит пустой цикл всё время ожидания
ВремяЗавершения = ТекущаяДата() + 2;
Пока ТекущаяДата() < ВремяЗавершения Цикл
КонецЦикла;

// Стало: фоновое задание, HTTP-сервис, 8.3.25+
ВызватьПаузу(2000); // аргумент в миллисекундах

ВызватьПаузу(300) в HTTP-сервисе заняла 310 мс. На клиенте замена другая: ПодключитьОбработчикОжидания("ПродолжитьПослеПаузы", Секунд, Истина). Синхронная пауза превращается в продолжение, и вызывающий код переписывается целиком.

Распаковка архива

// Было
ЗапуститьПриложение("""C:\Program Files\7-Zip\7z.exe"" x """ + Архив + """", , Истина);

// Стало: 8.3.26+, тонкий и толстый клиент, сервер
Чтение = Новый ЧтениеФайлаАрхива(Архив);
Чтение.ИзвлечьВсе(Каталог);
Чтение.Закрыть();

Проверено на gzip: файл извлёкся, кириллица в тексте цела. RAR, 7-ZIP, XZ и TAR взяты из списка изменений. Платформа эти форматы только читает. Если 7z.exe в коде нужен для упаковки, замены нет. И ещё одно: ЧтениеZipФайла и ЗаписьZipФайла с 8.3.26 объявлены устаревшими, писать новый код на них не стоит.

Хеш и контрольная сумма

Хеш = Новый ХешированиеДанных(ХешФункция.CRC32);
Хеш.Добавить(ДвоичныеДанные);
Црц = Хеш.ХешСумма;

Самописный CRC32 одного мегабайта на встроенном языке занимал 6,3-7,4 секунды, штатный - около миллисекунды, на пределе точности таймера, суммы совпали. SHA-256 от 50 МБ штатно - 307 мс. Разница в тысячи раз, и никакая оптимизация цикла её не закроет. HMAC отдельной функцией в платформе нет: если код считает HMAC, заменяется хеш внутри, обвязка остаётся.

Буфер обмена

&НаКлиенте
Асинх Процедура КопироватьСсылку(Команда)
	Если СредстваБуфераОбмена.ИспользованиеДоступно() Тогда
		Ждать СредстваБуфераОбмена.ПоместитьДанныеАсинх(Ссылка);
	КонецЕсли;
КонецПроцедуры

Методы асинхронные, процедура становится Асинх. На сервере объекта нет вовсе.

Генератор пароля и URL-кодирование

Генератор = Новый ГенераторСлучайныхПаролей;
Пароль = Генератор.СлучайныйПароль(12, Ложь); // Истина - запоминаемый

Кодированная = КодироватьСтроку(Строка, СпособКодированияСтроки.КодировкаURL);

Оба есть только на сервере и в толстом клиенте. Своя URLEncode в клиентском модуле появляется как раз поэтому, и там она может быть оправдана.

Что нашлось в двух типовых

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

Управление торговлей для Казахстана 3.4.4.87, режим совместимости 8.3.10. 7 157 модулей, 3,5 млн строк, проверка 223 секунды на сервере с включённой отладкой плюс 249 секунд выгрузки конфигуратором. 30 находок, каждую открыли глазами, верных 24.

Вывод по верной находкеСколькоЧто это
замена на месте83 серверных цикла проверки строк, пауза (с переделкой вызова), распаковка 7z, 2 буфера обмена, генератор пароля
мешает тонкий клиент1410 циклов в модулях КлиентСервер, 3 места с Excel, URLEncode
мешает режим 8.3.102свои ПобитовоеИ и ПобитовоеИли

Шесть ложных находок поучительны сами по себе: четыре раза Excel создавался только ради проверки, что он установлен, или ради автофильтра в готовой книге, один раз 7za.exe упоминался в проверке установленного агента копирования, и один раз ScriptControl собирал массив COM, а не разбирал JSON. Все шесть пришли от правил уровня “На проверку”, которые судят по косвенным признакам. У правил уровня “Заменить”, где признак однозначный, верными оказались 4 находки из 4.

Бухгалтерия предприятия 3.0.204.22, платформа 8.3.27.2325, режим совместимости 8.3.27. 20 167 модулей, 17,4 млн строк, лексером разобрано 804 модуля. Выгрузка конфигуратором заняла около 55 минут, проверка 65. Эти находки вручную не размечались, ниже то, что выдал отчёт.

ПравилоНаходокЗамена на месте
посимвольный цикл проверки или чистки строки7119
буфер обмена через HTML-поле или COM88
свой Base6477
Excel через COM61
свои побитовые функции66
свой хеш или контрольная сумма20
JavaScript через ScriptControl22
компонента под закрытую задачу22
пауза пустым циклом11
Всего10546

Две вещи видны сразу. Побитовые функции здесь меняются все шесть, потому что режим совместимости 8.3.27: та же находка, что в УТ упиралась в режим 8.3.10, в БП уходит одной правкой. А из 71 цикла по строкам на месте меняется только 19, остальные живут в клиентском и клиент-серверном коде. Тонкий клиент снова главная стена.

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

Чего в платформе по-прежнему нет

Обратная проверка, тоже вызовом кода. Новый TCPСоединение, Новый СокетСервер, Новый UDPСоединение, Новый TCPСокет отвечают “Тип не определен”: произвольного TCP и UDP нет, слушающего сокета тоже. ЧтениеPDF по синтакс-помощнику умеет проверять подписи и доставать вложения, но не текст страниц. FileSystemObject, ADODB.Stream и MSXML на Linux-сервере взять неоткуда, хотя замена на встроенный язык для всех трёх давно есть.

Когда штатной функции нет, а работа сводится к циклу по байтам или символам большого объёма, выбор лежит между внешней компонентой и отдельным сервисом. Сколько компонента реально выигрывает и почему на 8.3.27 первым делом надо смотреть на параметр подключения, мы разобрали на замере 31 задачи.

Как пройти свой код

Руками это делается поиском по выгрузке, но поиск по подстроке тонет в комментариях, текстах сообщений и похожих именах. Ревизор костылей делает то же лексером: 20 правил из таблицы выше, по каждой находке модуль, строка, процедура и вывод “замена доступна”, “в тонком клиенте замены нет” или “нужна платформа новее”. Конфигурацию он выгружает сам пакетным конфигуратором или берёт готовую выгрузку, базу не меняет.

Если находок много и они в своих доработках, а переписывать некогда, напишите нам в WhatsApp: разберём отчёт, отделим замены на месте от тех, что требуют серверного вызова, и сделаем.

В конфигурации много старого кода под то, что платформа уже умеет сама

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

Qiyməti
450 000 - 600 000 ₸разбор идеи и ТЗ со сметой, без налогов; сама разработка - по смете отдельным договором после ТЗ
Müddət
от 3 дней

Yazmaq tezdir? Özünüz ölçün

Ревизор костылей: где ваш код делает руками то, что платформа 1С уже умеет сама

Emalı aç

INFOSTART TECH EVENT 2026: конференция для 1с-специалистов. если собираетесь, регистрируйтесь по нашей ссылке. Регистрация →

Bunu da oxuyun

Защита тиражной обработки 1С от копирования: три уровня и где у каждого потолок

Файл .epf копируется мышкой, и договор это не останавливает. Защиту обычно начинают с проверки ИНН в коде - и зря: она снимается за минуту, потому что логика лежит рядом открытым текстом. Разложили защиту на три уровня по убыванию дыр: от бесполезной проверки ИНН через шифрование тела процедуры под ИНН покупателя до настоящей лицензии на асимметричной криптографии. По каждому - что он реально закрывает, чего не закрывает и когда его стоит брать.

Доработка формы 1С через нейросеть: что дать модели на вход и что проверить в её ответе

Form.xml даёт модели точные имена, но молчит о том, что форма достраивает при создании и что пользователь видит в работе. На типовой УТ для Казахстана 127 полей формы номенклатуры видимы по XML и скрыты в работе, а условное оформление строится кодом в 400 модулях форм. Разбираем три источника для модели, перехват формы с четырьмя ошибками и проверку ответа за пять минут.

Тесты проходят, а ошибка в коде есть: четыре класса проверок, которые ловят пропущенное

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