Выбирает строку символов, начиная с символа <НачальныйНомер>, общим количеством <ЧислоСимволов>.
Синтаксис
Сред(<Строка>, <НачальныйНомер>, <ЧислоСимволов>)Примеры платформы
ЦифрыНомера = Сред(ОсновноеСредство.ГосНомер, 2, 3);Полное описание, параметры и ограничения
Глобальный контекст.Сред (Global context.Mid)
Глобальный контекст (Global context)
Сред (Mid)
Доступен, начиная с версии 8.0.
Синтаксис:
Сред(<Строка>, <НачальныйНомер>, <ЧислоСимволов>)
Параметры:
<Строка> (обязательный)
Тип: Строка.
Исходная строка.
<НачальныйНомер> (обязательный)
Тип: Число.
Начальный номер символа, с которого начинается выборка. Нумерация символов в строке начинается с 1. Если указано значение, меньшее или равное нулю, то параметр принимает значение 1.
<ЧислоСимволов> (необязательный)
Тип: Число.
Количество выбираемых символов. Если параметр не указан или его значение меньше 0, то выбираются символы до конца строки.
Возвращаемое значение:
Тип: Строка.
Строка выбранных символов.
Описание:
Выбирает строку символов, начиная с символа <НачальныйНомер>, общим количеством <ЧислоСимволов>.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Внимание: Данный метод не поддерживается при работе через COM-соединение
Пример:
// Пусть номер автомобиля в справочнике основных средств задается
// в виде х999хх99, где последние две цифры - код региона.
// Получим цифровую часть номера.
ЦифрыНомера = Сред(ОсновноеСредство.ГосНомер, 2, 3);
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Проверить календарную дату YYYY-MM-DD из учебного обмена
Проверяем форму строки и затем существование календарной даты. Три контрольных строки показывают два разных класса отказа.
Где и как запускать
В учебной базе создайте серверный общий модуль УчебныеЗадачи. Вставьте приведённые функции и процедуру целиком в модуль, не внутрь другой процедуры. Вызовите УчебныеЗадачи.ВыполнитьПример() из серверного обработчика команды учебной обработки. Каждый урок запускайте отдельно, без дублирования одноимённых процедур.
Подготовка
Используется фиксированная дата, а не ТекущаяДата: результаты можно сравнить независимо от дня запуска.
Данные создаются только в памяти учебной базы; рабочие документы и регистры не меняются.
Урок поддерживает только календарную дату без времени и смещения. Это не универсальный разбор 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"));
Исключение
Сообщить("Отклонено: " + Текст);
КонецПопытки;
КонецЦикла;
КонецПроцедурыРазбор по шагам
Проверяем тип, длину и расположение ASCII-цифр и дефисов до выделения частей.
Извлекаем год, месяц и день в числовом виде.
Дата создаёт календарное значение; дополнительно сверяем компоненты, чтобы не принять преобразованный другой день.
В вызывающей процедуре ошибка одной строки не останавливает проверку остальных учебных входов.
Как проверить результат
2026-02-28 принято; 2026-02-30 и 28.02.2026 отклонены.
Замените первую строку на 2024-02-29: она должна быть принята.
Строка 2026-02-28T10:00:00Z отклоняется: такой формат не входит в учебный контракт.
Ожидаемый результат
Форма строки и календарная корректность проверены отдельными этапами.
На что обратить внимание
Регулярное выражение проверяет структуру текста, но само не знает, сколько дней в феврале.
Исходные строки здесь вымышленные; в рабочем журнале учитывайте требования к личным данным.
Не подавляйте ошибку без статуса: вызывающий код должен отличать отказ от успешно разобранной даты.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
ЗначениеВФайл/ИзФайла: structured snapshot и защита от fallback в каталог программы
Полный собственный учебный маршрут с concrete UTF8/typedrecord/UUID/state, positive readback и отрицательными проверками. Native сигнатуры/результаты проверены; сторонние файлы, настройки и каталоги не принимаются как fixture.
Где и как запускать
Полный модуль управляемой формы только толстого Windows-клиента8.5.1.1343 своей новой пустой файловой ИБ; server только guard, actual0.
Подготовка
Создайте новую пустую файловую ИБ платформы ровно8.5.1.1343, имя корня УчебноеФайловоеСостояние85, русский встроенный язык/управляемое приложение, совместимость Не использовать. Никакие реальные настройки, документы/архивы или рабочие папки не использовать.
В этой ИБ0предметных объектов, регистров, внешних источников, общих реквизитов, заданий/подписок;0расширений базы/сеанса. Полный серверный guard проверяет exact версию/metadata/все3nativeисточника расширений и отсутствие транзакции.
Запускайте только толстый управляемый Windows-клиент8.5.1.1343 под отдельным учебным Windows-профилем; thin/web/mobile/server positive пути не заявляются. File value API и SaveValue/RestoreValue поддерживаются в толстом клиенте, не переносите их на сервер или browser.
Создайте внешнюю обработку OwnGlobalIO85 с собственной управляемой формой. Реквизиты ПодтверждаюСвойОпыт85 Булево начальноЛожь, Статус85 Строка0 многострочный ТолькоПросмотр, ПутьОпыта85 Строка0 ТолькоПросмотр. Назначьте ПриОткрытии и команду/действие Выполнить85 из выбранного целого модуля.
Settings-урок вместо Выполнить85 имеет3отдельные команды/кнопки СоздатьНастройку85, ПрочитатьНастройку85, ОбновитьТолькоСвоюНастройку85. Дополнительно UUIDНастройки85 Строка36. При чтении следующего сеанса вставьте сохраненный собственный UUID, не начинайте новую настройку.
Модули самостоятельны: вставляйте весь выбранный code, не склеивайте одинаковые процедуры/guards из нескольких уроков. Обновите только свою учебную ИБ и подтвердите только этот пустой стенд.
Файловые workflows используют лишь actual native временный каталог толстого клиента. Проверяется локальный абсолютный диск/существующая папка/отличие от КаталогПрограммы; далее fresh OwnGlobalIO85-UUID, отсутствие/пустота. Native ЗначениеВФайл/ИзФайла могут использовать каталог программы при отсутствующем каталоге — эту fallback-ветку блокируем ДО вызова.
Split/merge payload — конкретный UTF8безBOM BEGIN:<ownUUID>|Книга;3;250;750|END. РазделитьФайл получает16БАЙТ, не16символов, и свою пустую parts-папку. Возвращенный массив используется только как count: type его элементов в native не описан и не угадывается.
Documented имена частей own-payload.bin.001/.002... проверяются реально через Файл и размеры16/остаток; порядок для merge array задан explicit. Для merge mask набор предварительно доказывается точным количеством своих частей; именам свойственен lexicographic порядок с ведущими нулями.
Native value-file fixture — сериализуемая реальная Структура из6полей: Версия1,ownUUID,Книга,Количество3,Цена250,Сумма750. ЗначениеВФайл даетBool, проверяем его; ЗначениеИзФайла возвращает actualтип, сверяем все поля/типы/расчет, не любое восстановленное значение.
Настройки SaveValue/RestoreValue имеют область именно текущая параИБ-пользователь. Создается один новый namespace OwnGlobalIO85:<ownUUID> после проверки отсутствия; последующая отдельная команда меняет только доказанную own v3/750 наv4/1000. Никакого перечисления/очистки всех пользовательских настроек нет.
Все созданные собственные files/parts/wrong-order-output и свой namespace сохраняются после ВАШЕГО ручного опыта для контроля. Автоматического/рекурсивного удаления или очистки настроек нет; повторный overwrite не допускается.
При ожидании callback не закрывайте форму/клиент; Занято85 блокирует вторую команду. Completion native tempdir имеет2параметра, error callback3в правильном порядке. Каталог из callback сверяется с реальным native temp, не становится произвольным input-путем.
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 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Создайте собственную реальную запись Книга3/250/750 сfresh UUID и новую проверенную абсолютную папку native-temp.
ПроверитьСвоюБазуКаталога85 получает КаталогПрограммы не ради getter-демо, а для запрета опасной native fallback/записи рядом сexe. Относительный/несуществующий каталог прекращает опыт.
Own-value.bin должен отсутствовать. ЗначениеВФайл(actual path,actual own record) даетBool; Ложь не считается успехом даже без исключения.
Проверьте actual существование файла/положительный размер. ЗначениеИзФайла читает native сериализацию, не JSON/текст; тип полученной записи подтверждается как Структура.
Проверяются ровно6полей, их фактические типы, ownUUID, значения и3×250=750. Случайное сериализованное значение не пройдет schema-guard.
Изменяем только исходный memory record на4/1000; повторное чтение existing file обязано сохранить snapshot3/750. Файл без явной новой записи не должен измениться.
Own not-a-value.txt создается здесь как plain UTF8. ЗначениеИзФайла либо отказывает parsing, либо результат отвергает наш строгий schema-guard: plain-text не считается native записью.
Общий успех только после positive snapshot и отрицательного non-native файла. Все собственные файлы остаются; actualfilewrites0 до ручного запуска.
Как проверить результат
Пройдены собственные positive данные/actualтип/schema/UUID, не только непустые объекты или отсутствие исключений.
Native аргументы/returns/context совпадают со справкой8.5.1.1343; неоднозначный result не угадывается.
Own absolute root/namespace проверяется до writes; unknown/overwrite/fallback-success не допускается.
Все изменения только при будущем ВАШЕМ ручном опыте в новом стенде. Actualfiles/settings/1C/network0, ничего автоматически не удаляем.
Ожидаемый результат
Native BoolSave/readback всех6полей, стабильный file snapshot после memory-изменения и обязательное неприятие plain-text. Guard блокирует fallback к каталогу программы.
На что обратить внимание
ЗначениеВФайл/ИзФайла — внутренний native формат, не человекочитаемыйJSON. Здесь сохранение и schema readback выполняются только для own записи.
РазделитьФайл работает сбайтами; ОбъединитьФайлы не проверяет смысл порядка. СохранитьЗначение хранит значение по пареИБ-пользователь, а не по произвольному глобальномуключу всей системы.
Прямой actual запуск здесь не выполнялся. Ложь/Undefined/неверная schema не маскируются успехом или новым default-object.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.