Разработка и Конфигурация · 12 мин
Какие функции отсутствуют во встроенном языке 1С:Предприятие
Разбор отсутствующих возможностей встроенного языка 1С: регулярные выражения, работа с датами, строками, коллекциями. Способы обойти ограничения на практике.
Разработчики, приходящие в 1С из других языков, быстро сталкиваются с тем, что многие привычные инструменты здесь отсутствуют. Встроенный язык 1С:Предприятие создавался как предметно-ориентированный инструмент для описания бизнес-логики, а не как язык общего назначения, поэтому в нём нет целого ряда возможностей, которые в Python, C# или JavaScript считаются базовыми.
Отсутствие функции не всегда означает тупик: часть задач решается штатными объектами платформы, часть — внешними компонентами, часть — переносом логики на уровень СУБД или запросов. Но важно понимать границы языка заранее, чтобы не проектировать решения, опирающиеся на несуществующие механизмы.
Ниже разобраны основные категории отсутствующих возможностей: работа со строками и датами, регулярные выражения, коллекции, функциональные конструкции, файловые и сетевые операции. Для каждой категории приведены практические способы обхода ограничения.
Регулярные выражения и сложный разбор строк
Самое известное ограничение — полное отсутствие регулярных выражений во встроенном языке. Проверить, соответствует ли строка шаблону (например, является ли введённое значение корректным ИНН, телефоном или номером документа заданного формата), штатными средствами напрямую нельзя. Приходится писать посимвольный разбор с проверками через функции СтрДлина, Сред, СтрНайти и ручную валидацию каждого символа.
Второй пробел — скудный набор строковых функций. Нет встроенных аналогов trim для произвольных символов (функция СокрЛП убирает только пробельные символы), нет форматирования строк по шаблону с позиционными аргументами, нет функции разворота строки, нет проверки вхождения с регистронезависимым поиском без предварительного приведения через ВРег или НРег. Функция СтрЗаменить работает только с учётом регистра.
Практические обходные пути: для валидации по шаблону пишут функцию-проверку с перебором символов и допустимых алфавитов; для сложного разбора текста используют СтрРазделить и СтрСоединить с последующей обработкой массива; для тяжёлых сценариев подключают внешние компоненты по технологии Native API, где регулярные выражения доступны.
Функция ЭтоЦифры(Строка)
Для Позиция = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Позиция, 1);
Если СтрНайти("0123456789", Символ) = 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункцииРабота с датами, временем и часовыми поясами
Дата в 1С хранится с точностью до секунды — миллисекунды недоступны, что мешает при точном замере производительности и интеграции с системами, где метки времени точнее. Отсутствуют встроенные функции для определения номера недели в году, дня недели текстом на произвольном языке, разницы между датами в месяцах и годах с учётом календарных особенностей.
Часть задач закрывается функциями ДобавитьМесяц, НачалоДня, КонецДня и арифметикой дат в секундах, но вычисление, например, количества рабочих дней между датами требует обращения к регистру сведений с производственным календарём — встроенной функции для этого нет.
Работа с часовыми поясами ограничена: есть ТекущаяДатаСеанса, УниверсальноеВремя и смещение сеанса, но нет встроенной конвертации произвольной даты между произвольными поясами по базе IANA. В распределённых системах это приходится решать хранением времени в UTC и ручным пересчётом.
Коллекции: чего не хватает массивам и соответствиям
В языке нет множеств (set) как отдельного типа — уникальность элементов обеспечивают через соответствие, где значение ключа игнорируется. Нет встроенной сортировки массива по произвольному условию: массив нельзя отсортировать штатным методом вообще, приходится перекладывать данные в таблицу значений, сортировать её и выгружать обратно.
Отсутствуют и привычные методы функционального стиля: filter, map, reduce, поиск элемента по предикату. Любая выборка из коллекции — это цикл с условием. Для таблиц значений частично помогают методы НайтиСтроки и Найти, но они работают только по равенству значений, без сложных условий.
Нет встроенных операций над коллекциями как над множествами: пересечение, объединение без дубликатов, разность. Всё это реализуется вручную через соответствия или запросы к временным таблицам, когда объём данных велик.
Способы сортировки данных
Подходит для структурированных данных; требует перекладки из массива и обратно
Оптимально для больших объёмов и данных из базы; не работает с произвольными коллекциями в памяти
Универсально, но медленно на больших объёмах и требует аккуратной реализации
Функциональные конструкции и метапрограммирование
Во встроенном языке нет лямбда-функций, замыканий и анонимных процедур. Нельзя передать функцию как параметр — только имя экспортной процедуры строкой с последующим вызовом через Выполнить или оповещения в клиентском коде. Это усложняет обратные вызовы и делает код обработчиков менее гибким.
Отсутствуют генераторы и ленивые вычисления: любая функция, возвращающая коллекцию, материализует её целиком в памяти. При обработке больших файлов или выгрузок это приводит к пиковому потреблению памяти, которое приходится сглаживать порционной обработкой через запросы с пакетной выборкой.
Оператор Выполнить и функция Вычислить позволяют исполнять код из строки, но это не полноценное метапрограммирование: нет инспекции сигнатур процедур, нет доступа к списку методов объекта в рантайме (кроме ограниченных случаев через метаданные), нет декораторов и перехвата вызовов.
Файловая система, сеть и интеграции
Базовые объекты ЧтениеТекста, ЗаписьТекста, ЧтениеXML, ЧтениеJSON покрывают типовые сценарии, но нет встроенных средств для работы с архивами (ZIP поддерживается объектами ЧтениеZipФайла/ЗаписьZipФайла, а вот RAR и 7z — нет), нет вычисления хеш-сумм файлов произвольными алгоритмами (доступен ограниченный набор через объект ХешированиеДанных), нет встроенного FTP-клиента в некоторых сценариях приходится заменять внешними утилитами.
Криптографические возможности ограничены: штатные средства электронной подписи завязаны на установленные криптопровайдеры операционной системы, и их поведение различается между Windows и Linux. Нет встроенной поддержки отдельных современных алгоритмов и форматов, что усложняет интеграцию с внешними API.
HTTP-запросы выполняются через HTTPСоединение, но нет встроенного механизма повторных попыток, таймаутов на уровне отдельных этапов, удобной работы с multipart-формами и потоковой загрузки больших ответов. Всё это реализуется обёртками в общих модулях.
- 1Проверьте, нет ли задачи в возможностях языка запросов — выборки, группировки и соединения эффективнее циклов
- 2Поищите подходящий объект платформы: ЧтениеJSON, ХешированиеДанных, ЗащищенноеСоединениеOpenSSL и другие
- 3Оцените вариант внешней компоненты Native API, если требуется регулярные выражения или специфические алгоритмы
- 4Вынесите повторяющиеся обходные решения в общий модуль с понятными именами функций
- 5Задокументируйте ограничение и выбранный обход в комментарии к модулю
Типичные ошибки при обходе ограничений
Первая ошибка — реализация в циклах того, что должен делать запрос. Разработчики, не нашедшие нужной функции в языке, пишут выборку всех записей и фильтрацию в памяти, хотя язык запросов 1С содержит группировки, соединения, вложенные запросы и функции работы с датами. На больших таблицах это приводит к деградации производительности в десятки раз.
Вторая ошибка — неограниченное наращивание собственных «велосипедов» без выноса в общие модули. Одна и та же функция проверки строки или расчёта разницы дат дублируется в десятке мест, и при нахождении дефекта исправлять её приходится по всей конфигурации.
Третья ошибка — использование внешних компонент без контроля их наличия и версии на всех рабочих местах. Код, работающий у разработчика, падает у пользователей, потому что компонента не установлена или заблокирована политиками безопасности.
Как проверить, что обходное решение корректно
Любую собственную функцию, заменяющую отсутствующую штатную, следует покрывать проверками на граничных значениях: пустая строка, строка из одного символа, максимально длинное значение, даты на границах месяца и года, високосный год. Именно на границах самодельные реализации чаще всего дают сбои.
Для функций, влияющих на учётные данные (расчёт дат оплаты, сроков, валидация номеров документов), полезно прогнать проверку на копии базы с реальными данными и сравнить результат с ручным расчётом на нескольких контрольных примерах.
Как проверить результат
Функция возвращает предсказуемый результат без исключений
Ошибка времени выполнения или молчаливый неверный результат
Время выполнения растёт линейно и приемлемо для пользователей
Резкий рост времени при увеличении объёма — признак циклов вместо запроса
Результаты совпадают на контрольных примерах
Расхождения на отдельных датах или строках — дефект логики
Что важно запомнить
Встроенный язык 1С намеренно ограничен: нет регулярных выражений, лямбд, множеств, расширенной работы с датами и части системных функций. Основные способы обхода — язык запросов, объекты платформы, общие модули с собственными библиотеками и внешние компоненты. Критично избегать исполнения кода из непроверенных строк и проверять обходные решения на граничных значениях.
Часто задаваемые вопросы
Можно ли использовать регулярные выражения в 1С без внешних компонент?
Штатных средств нет. Варианты: написать посимвольный разбор с проверкой допустимых символов, использовать внешнюю компоненту Native API с библиотекой регулярных выражений или вынести проверку на сторону внешнего сервиса при интеграционной архитектуре. Для простых шаблонов (только цифры, фиксированная длина, допустимый алфавит) посимвольная проверка обычно достаточна и прозрачна для сопровождения.
Как отсортировать массив по произвольному условию?
Прямого метода у массива нет. Типовой приём — переложить элементы в таблицу значений с дополнительной колонкой ключа сортировки, вызвать метод Сортировать, затем выгрузить колонку обратно в массив. Для данных из базы эффективнее сразу использовать запрос с предложением УПОРЯДОЧИТЬ ПО.
Почему нельзя просто использовать Выполнить для обхода ограничений языка?
Оператор исполняет произвольный код в контексте текущих прав пользователя. Если в исполняемую строку попадают данные извне — из файлов, HTTP-запросов, полей ввода — появляется возможность выполнить вредоносный код: изменить или удалить данные, отправить их наружу. Допустимо исполнять только полностью контролируемые строки, сформированные внутри конфигурации.
Чем заменить отсутствующие лямбда-функции при обработке коллекций?
Передачей имени экспортной процедуры строкой вместе с именем модуля и вызовом через механизм оповещений (на клиенте) или через Вычислить с жёстко заданным списком допустимых имён (на сервере). На практике чаще применяют таблицу значений с колонками параметров и единый цикл обработки с ветвлением по типу операции.
Как получить разницу между датами в месяцах с учётом календаря?
Встроенной функции нет. Используют комбинацию Год, Месяц и День с корректировкой на неполный месяц, либо запрос с функциями РАЗНОСТЬДАТ, которая умеет считать разницу в заданной единице измерения. Для рабочих дней дополнительно требуется регистр с производственным календарём.
Стоит ли подключать внешние компоненты ради одной функции?
Только если задача критична и не решается штатными средствами: каждая компонента требует установки на все рабочие места или серверы, контроля версий и учёта в политиках безопасности. Для разовой валидации строки собственная функция на встроенном языке обычно дешевле в сопровождении, чем сопровождение компоненты.