Глобальный контекст.Сред

Методы · Mid

Выбирает строку символов, начиная с символа <НачальныйНомер>, общим количеством <ЧислоСимволов>.

Синтаксис

Сред(<Строка>, <НачальныйНомер>, <ЧислоСимволов>)

Примеры платформы

ЦифрыНомера = Сред(ОсновноеСредство.ГосНомер, 2, 3);
Полное описание, параметры и ограничения

Глобальный контекст.Сред (Global context.Mid)

Глобальный контекст (Global context)

Сред (Mid)

Доступен, начиная с версии 8.0.

Синтаксис:
Сред(<Строка>, <НачальныйНомер>, <ЧислоСимволов>)
Параметры:

<Строка> (обязательный)
Тип: Строка.
Исходная строка.

<НачальныйНомер> (обязательный)
Тип: Число.
Начальный номер символа, с которого начинается выборка. Нумерация символов в строке начинается с 1. Если указано значение, меньшее или равное нулю, то параметр принимает значение 1.

<ЧислоСимволов> (необязательный)
Тип: Число.
Количество выбираемых символов. Если параметр не указан или его значение меньше 0, то выбираются символы до конца строки.
Возвращаемое значение:
Тип: Строка.
Строка выбранных символов.
Описание:

Выбирает строку символов, начиная с символа <НачальныйНомер>, общим количеством <ЧислоСимволов>.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

Внимание: Данный метод не поддерживается при работе через COM-соединение
Пример:

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

// в виде х999хх99, где последние две цифры - код региона.

// Получим цифровую часть номера.

ЦифрыНомера = Сред(ОсновноеСредство.ГосНомер, 2, 3);

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Проверить календарную дату YYYY-MM-DD из учебного обмена

Проверяем форму строки и затем существование календарной даты. Три контрольных строки показывают два разных класса отказа.

Где и как запускать

В учебной базе создайте серверный общий модуль УчебныеЗадачи. Вставьте приведённые функции и процедуру целиком в модуль, не внутрь другой процедуры. Вызовите УчебныеЗадачи.ВыполнитьПример() из серверного обработчика команды учебной обработки. Каждый урок запускайте отдельно, без дублирования одноимённых процедур.

Подготовка

  1. Используется фиксированная дата, а не ТекущаяДата: результаты можно сравнить независимо от дня запуска.

  2. Данные создаются только в памяти учебной базы; рабочие документы и регистры не меняются.

  3. Урок поддерживает только календарную дату без времени и смещения. Это не универсальный разбор ISO 8601.


Функция УчебнаяДатаИзСтроки(Текст) Экспорт
    Если ТипЗнч(Текст) <> Тип("Строка") Тогда
        ВызватьИсключение "Дата должна быть строкой YYYY-MM-DD";
    КонецЕсли;
    Если СтрДлина(Текст) <> 10 Или Не СтрПодобнаПоРегулярномуВыражению(Текст, "^[0-9]{4}-[0-9]{2}-[0-9]{2}$") Тогда
        ВызватьИсключение "Неверный формат календарной даты";
    КонецЕсли;
    НомерГода = Число(Лев(Текст, 4));
    НомерМесяца = Число(Сред(Текст, 6, 2));
    НомерДня = Число(Прав(Текст, 2));
    Результат = Дата(НомерГода, НомерМесяца, НомерДня);
    Если Год(Результат) <> НомерГода Или Месяц(Результат) <> НомерМесяца Или День(Результат) <> НомерДня Тогда
        ВызватьИсключение "Дата не соответствует календарю";
    КонецЕсли;
    Возврат Результат;
КонецФункции

Процедура ВыполнитьПример() Экспорт
    Входящие = Новый Массив;
    Входящие.Добавить("2026-02-28");
    Входящие.Добавить("2026-02-30");
    Входящие.Добавить("28.02.2026");
    Для Каждого Текст Из Входящие Цикл
        Попытка
            ЗначениеДаты = УчебнаяДатаИзСтроки(Текст);
            Сообщить("Принято: " + Формат(ЗначениеДаты, "ДФ=yyyy-MM-dd"));
        Исключение
            Сообщить("Отклонено: " + Текст);
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры

Разбор по шагам

  1. Проверяем тип, длину и расположение ASCII-цифр и дефисов до выделения частей.

  2. Извлекаем год, месяц и день в числовом виде.

  3. Дата создаёт календарное значение; дополнительно сверяем компоненты, чтобы не принять преобразованный другой день.

  4. В вызывающей процедуре ошибка одной строки не останавливает проверку остальных учебных входов.

Как проверить результат

  1. 2026-02-28 принято; 2026-02-30 и 28.02.2026 отклонены.

  2. Замените первую строку на 2024-02-29: она должна быть принята.

  3. Строка 2026-02-28T10:00:00Z отклоняется: такой формат не входит в учебный контракт.

Ожидаемый результат

Форма строки и календарная корректность проверены отдельными этапами.

На что обратить внимание

  1. Регулярное выражение проверяет структуру текста, но само не знает, сколько дней в феврале.

  2. Исходные строки здесь вымышленные; в рабочем журнале учитывайте требования к личным данным.

  3. Не подавляйте ошибку без статуса: вызывающий код должен отличать отказ от успешно разобранной даты.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

ЗначениеВФайл/ИзФайла: structured snapshot и защита от fallback в каталог программы

Полный собственный учебный маршрут с concrete UTF8/typedrecord/UUID/state, positive readback и отрицательными проверками. Native сигнатуры/результаты проверены; сторонние файлы, настройки и каталоги не принимаются как fixture.

Где и как запускать

Полный модуль управляемой формы только толстого Windows-клиента8.5.1.1343 своей новой пустой файловой ИБ; server только guard, actual0.

Подготовка

  1. Создайте новую пустую файловую ИБ платформы ровно8.5.1.1343, имя корня УчебноеФайловоеСостояние85, русский встроенный язык/управляемое приложение, совместимость Не использовать. Никакие реальные настройки, документы/архивы или рабочие папки не использовать.

  2. В этой ИБ0предметных объектов, регистров, внешних источников, общих реквизитов, заданий/подписок;0расширений базы/сеанса. Полный серверный guard проверяет exact версию/metadata/все3nativeисточника расширений и отсутствие транзакции.

  3. Запускайте только толстый управляемый Windows-клиент8.5.1.1343 под отдельным учебным Windows-профилем; thin/web/mobile/server positive пути не заявляются. File value API и SaveValue/RestoreValue поддерживаются в толстом клиенте, не переносите их на сервер или browser.

  4. Создайте внешнюю обработку OwnGlobalIO85 с собственной управляемой формой. Реквизиты ПодтверждаюСвойОпыт85 Булево начальноЛожь, Статус85 Строка0 многострочный ТолькоПросмотр, ПутьОпыта85 Строка0 ТолькоПросмотр. Назначьте ПриОткрытии и команду/действие Выполнить85 из выбранного целого модуля.

  5. Settings-урок вместо Выполнить85 имеет3отдельные команды/кнопки СоздатьНастройку85, ПрочитатьНастройку85, ОбновитьТолькоСвоюНастройку85. Дополнительно UUIDНастройки85 Строка36. При чтении следующего сеанса вставьте сохраненный собственный UUID, не начинайте новую настройку.

  6. Модули самостоятельны: вставляйте весь выбранный code, не склеивайте одинаковые процедуры/guards из нескольких уроков. Обновите только свою учебную ИБ и подтвердите только этот пустой стенд.

  7. Файловые workflows используют лишь actual native временный каталог толстого клиента. Проверяется локальный абсолютный диск/существующая папка/отличие от КаталогПрограммы; далее fresh OwnGlobalIO85-UUID, отсутствие/пустота. Native ЗначениеВФайл/ИзФайла могут использовать каталог программы при отсутствующем каталоге — эту fallback-ветку блокируем ДО вызова.

  8. Split/merge payload — конкретный UTF8безBOM BEGIN:<ownUUID>|Книга;3;250;750|END. РазделитьФайл получает16БАЙТ, не16символов, и свою пустую parts-папку. Возвращенный массив используется только как count: type его элементов в native не описан и не угадывается.

  9. Documented имена частей own-payload.bin.001/.002... проверяются реально через Файл и размеры16/остаток; порядок для merge array задан explicit. Для merge mask набор предварительно доказывается точным количеством своих частей; именам свойственен lexicographic порядок с ведущими нулями.

  10. Native value-file fixture — сериализуемая реальная Структура из6полей: Версия1,ownUUID,Книга,Количество3,Цена250,Сумма750. ЗначениеВФайл даетBool, проверяем его; ЗначениеИзФайла возвращает actualтип, сверяем все поля/типы/расчет, не любое восстановленное значение.

  11. Настройки SaveValue/RestoreValue имеют область именно текущая параИБ-пользователь. Создается один новый namespace OwnGlobalIO85:<ownUUID> после проверки отсутствия; последующая отдельная команда меняет только доказанную own v3/750 наv4/1000. Никакого перечисления/очистки всех пользовательских настроек нет.

  12. Все созданные собственные files/parts/wrong-order-output и свой namespace сохраняются после ВАШЕГО ручного опыта для контроля. Автоматического/рекурсивного удаления или очистки настроек нет; повторный overwrite не допускается.

  13. При ожидании callback не закрывайте форму/клиент; Занято85 блокирует вторую команду. Completion native tempdir имеет2параметра, error callback3в правильном порядке. Каталог из callback сверяется с реальным native temp, не становится произвольным input-путем.

  14. Actual1C/files/user-settings/network0: здесь только авторство/статические source/native tests. Никаких резервных копий/архивов не создаем. До ручного опыта сообщения успеха — ожидаемый протокол, не runtime-доказательство.

&НаКлиенте
Процедура Выполнить85(Команда)
    Если Занято85 Тогда
        ВызватьИсключение "Свой value-file опыт еще выполняется";
    КонецЕсли;
    Занято85 = Истина;
    Статус85 = "Свой native value-file еще не подтвержден";
    Попытка
        К = СоздатьСвойКорень85(КаталогВременныхФайлов());
        ПутьОпыта85 = К.Корень;
        СохранитьПрочитатьСвойФайл85(К);
        Статус85 = "UUID " + К.UUID + ": ЗначениеВФайл=Истина; actual structured readback Книга/3/250/750; после изменения memory Qty4 file остается3; non-native plain text отказан. Own файлы оставлены";
    Исключение
        Статус85 = "Own value-file/typed readback не подтверждены. Не используйте относительный/несуществующий каталог и чужой файл";
    КонецПопытки;
    Занято85 = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура СохранитьПрочитатьСвойФайл85(К)
    Путь = К.Корень + "own-value.bin";
    ПроверитьОтсутствиеСвоегоФайла85(Путь);
    Исходная = СоздатьСвоюЗапись85(К.UUID, 3);
    Если Не ЗначениеВФайл(Путь, Исходная) Тогда
        ВызватьИсключение "Native ЗначениеВФайл вернул Ложь, сериализация не подтверждена";
    КонецЕсли;
    Файл = Новый Файл(Путь);
    Если Не Файл.Существует() Или Не Файл.ЭтоФайл() Или Файл.Размер() <= 0 Тогда
        ВызватьИсключение "Нужен actual собственный непустой native value-file";
    КонецЕсли;
    ИзФайла = ЗначениеИзФайла(Путь);
    ПроверитьСвоюЗапись85(ИзФайла, К.UUID, 3);
    Исходная.Количество = 4;
    Исходная.Сумма = 1000;
    Повторно = ЗначениеИзФайла(Путь);
    ПроверитьСвоюЗапись85(Повторно, К.UUID, 3);
    Если Повторно.Количество = Исходная.Количество Тогда
        ВызватьИсключение "File snapshot не должен измениться вслед за исходным memory object";
    КонецЕсли;
    НеФормат = К.Корень + "not-a-value.txt";
    ПроверитьОтсутствиеСвоегоФайла85(НеФормат);
    НеДанные = ПолучитьДвоичныеДанныеИзСтроки("Own not a native value:" + К.UUID, КодировкаТекста.UTF8, Ложь);
    НеДанные.Записать(НеФормат);
    ОтказФормата = Ложь;
    Попытка
        ЧужойФормат = ЗначениеИзФайла(НеФормат);
        ПроверитьСвоюЗапись85(ЧужойФормат, К.UUID, 3);
    Исключение
        ОтказФормата = Истина;
    КонецПопытки;
    Если Не ОтказФормата Тогда
        ВызватьИсключение "Собственный plain text не должен пройти как наша native structured record";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция СоздатьСвоюЗапись85(UUID, Количество)
    Если Количество <> 3 И Количество <> 4 Тогда
        ВызватьИсключение "Разрешены только две конкретные own учебные версии";
    КонецЕсли;
    Возврат Новый Структура("Версия,UUID,Номенклатура,Количество,Цена,Сумма", 1, UUID, "Книга", Количество, 250, Количество * 250);
КонецФункции

&НаКлиенте
Процедура ПроверитьСвоюЗапись85(Запись, UUID, Количество)
    Если ТипЗнч(Запись) <> Тип("Структура") Или Запись.Количество() <> 6 Тогда
        ВызватьИсключение "Нужна реальная own Структура с шестью точными полями";
    КонецЕсли;
    Для Каждого Имя Из СтрРазделить("Версия,UUID,Номенклатура,Количество,Цена,Сумма", ",") Цикл
        Если Не Запись.Свойство(Имя) Тогда
            ВызватьИсключение "Отсутствует own поле " + Имя;
        КонецЕсли;
    КонецЦикла;
    Если ТипЗнч(Запись.Версия) <> Тип("Число") Или Запись.Версия <> 1
        Или ТипЗнч(Запись.UUID) <> Тип("Строка") Или Запись.UUID <> UUID
        Или ТипЗнч(Запись.Номенклатура) <> Тип("Строка") Или Запись.Номенклатура <> "Книга"
        Или ТипЗнч(Запись.Количество) <> Тип("Число") Или Запись.Количество <> Количество
        Или ТипЗнч(Запись.Цена) <> Тип("Число") Или Запись.Цена <> 250
        Или ТипЗнч(Запись.Сумма) <> Тип("Число") Или Запись.Сумма <> Количество * 250 Тогда
        ВызватьИсключение "Нарушены actual типы, ownUUID или расчет собственной записи";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ПроверитьСвоюБазуКаталога85(База)
    Если ТипЗнч(База) <> Тип("Строка") Или СтрДлина(База) < 4 Или Сред(База, 2, 2) <> ":\" Тогда
        ВызватьИсключение "Для этого Windows опыта нужна actual абсолютная локальная папка, не относительный или UNC путь";
    КонецЕсли;
    Каталог = Новый Файл(База);
    Если Не Каталог.Существует() Или Не Каталог.ЭтоКаталог() Тогда
        ВызватьИсключение "Native value-file API не должен переходить в каталог программы из-за отсутствующего каталога";
    КонецЕсли;
    Полный = Каталог.ПолноеИмя;
    Если Прав(Полный, 1) <> "\" Тогда
        Полный = Полный + "\";
    КонецЕсли;
    Программа = КаталогПрограммы();
    Если Прав(Программа, 1) <> "\" Тогда
        Программа = Программа + "\";
    КонецЕсли;
    Если НРег(Полный) = НРег(Программа) Тогда
        ВызватьИсключение "Нельзя писать учебные данные в каталог исполняемой программы";
    КонецЕсли;
    Возврат Полный;
КонецФункции

&НаКлиенте
Функция СоздатьСвойКорень85(База)
    ПроверитьСвоегоКлиента85();
    ПолнаяБаза = ПроверитьСвоюБазуКаталога85(База);
    UUID = Строка(Новый УникальныйИдентификатор);
    Если UUID = "00000000-0000-0000-0000-000000000000" Тогда
        ВызватьИсключение "Нужен fresh ненулевой own UUID";
    КонецЕсли;
    Путь = ПолнаяБаза + "OwnGlobalIO85-" + UUID + "\";
    Папка = Новый Файл(Путь);
    Если Папка.Существует() Тогда
        ВызватьИсключение "Нельзя занять или перезаписать существующий UUID-каталог";
    КонецЕсли;
    СоздатьКаталог(Путь);
    Если Не Папка.Существует() Или Не Папка.ЭтоКаталог() Тогда
        ВызватьИсключение "Own абсолютная папка не создана";
    КонецЕсли;
    Если НайтиФайлы(Путь, "*", Ложь).Количество() <> 0 Тогда
        ВызватьИсключение "Новая собственная UUID-папка обязана быть пустой";
    КонецЕсли;
    Возврат Новый Структура("UUID,Корень", UUID, Путь);
КонецФункции

&НаКлиенте
Процедура ПроверитьОтсутствиеСвоегоФайла85(Путь)
    Файл = Новый Файл(Путь);
    Если Файл.Существует() Тогда
        ВызватьИсключение "Own файл должен быть новым; overwrite запрещен";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Перем Занято85;

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Занято85 = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвоегоКлиента85()
    ПроверитьСеанс85();
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        Система = Новый СистемнаяИнформация;
        Если (Система.ТипПлатформы <> ТипПлатформы.Windows_x86 И Система.ТипПлатформы <> ТипПлатформы.Windows_x86_64) Или Не ПодтверждаюСвойОпыт85 Тогда
            ВызватьИсключение "Нужна своя новая пустая файловая ИБ и толстый Windows-клиент8.5.1.1343";
        КонецЕсли;
    #Иначе
        ВызватьИсключение "Полный урок поддерживает только толстый управляемый Windows-клиент";
    #КонецЕсли
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьСеанс85()
    ПроверитьСвойПустойСтенд();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Разбор по шагам

  1. Создайте собственную реальную запись Книга3/250/750 сfresh UUID и новую проверенную абсолютную папку native-temp.

  2. ПроверитьСвоюБазуКаталога85 получает КаталогПрограммы не ради getter-демо, а для запрета опасной native fallback/записи рядом сexe. Относительный/несуществующий каталог прекращает опыт.

  3. Own-value.bin должен отсутствовать. ЗначениеВФайл(actual path,actual own record) даетBool; Ложь не считается успехом даже без исключения.

  4. Проверьте actual существование файла/положительный размер. ЗначениеИзФайла читает native сериализацию, не JSON/текст; тип полученной записи подтверждается как Структура.

  5. Проверяются ровно6полей, их фактические типы, ownUUID, значения и3×250=750. Случайное сериализованное значение не пройдет schema-guard.

  6. Изменяем только исходный memory record на4/1000; повторное чтение existing file обязано сохранить snapshot3/750. Файл без явной новой записи не должен измениться.

  7. Own not-a-value.txt создается здесь как plain UTF8. ЗначениеИзФайла либо отказывает parsing, либо результат отвергает наш строгий schema-guard: plain-text не считается native записью.

  8. Общий успех только после positive snapshot и отрицательного non-native файла. Все собственные файлы остаются; actualfilewrites0 до ручного запуска.

Как проверить результат

  1. Пройдены собственные positive данные/actualтип/schema/UUID, не только непустые объекты или отсутствие исключений.

  2. Native аргументы/returns/context совпадают со справкой8.5.1.1343; неоднозначный result не угадывается.

  3. Own absolute root/namespace проверяется до writes; unknown/overwrite/fallback-success не допускается.

  4. Все изменения только при будущем ВАШЕМ ручном опыте в новом стенде. Actualfiles/settings/1C/network0, ничего автоматически не удаляем.

Ожидаемый результат

Native BoolSave/readback всех6полей, стабильный file snapshot после memory-изменения и обязательное неприятие plain-text. Guard блокирует fallback к каталогу программы.

На что обратить внимание

  1. ЗначениеВФайл/ИзФайла — внутренний native формат, не человекочитаемыйJSON. Здесь сохранение и schema readback выполняются только для own записи.

  2. РазделитьФайл работает сбайтами; ОбъединитьФайлы не проверяет смысл порядка. СохранитьЗначение хранит значение по пареИБ-пользователь, а не по произвольному глобальномуключу всей системы.

  3. Прямой actual запуск здесь не выполнялся. Ложь/Undefined/неверная schema не маскируются успехом или новым default-object.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.