БуферДвоичныхДанных.Разделить

Методы · Split

Разделить буфер на части по заданному разделителю.

Синтаксис

Разделить(<Разделитель>)
Разделить()
Разделить(<Разделители>)
Полное описание, параметры и ограничения

БуферДвоичныхДанных.Разделить (BinaryDataBuffer.Split)

БуферДвоичныхДанных (BinaryDataBuffer)

Разделить (Split)

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

Вариант синтаксиса: По двоичному буферу

Синтаксис:
Разделить(<Разделитель>)
Параметры:

<Разделитель> (обязательный)
Тип: БуферДвоичныхДанных.
Разделитель.
Описание варианта метода:
Разделяет буфер на части, используя двоичный буфер-разделитель.
Вариант синтаксиса: По массиву разделителей

Синтаксис:
Разделить()
Описание варианта метода:
Разделить буфер на части по заданным разделителям. Элементы массива имеют тип БуферДвоичныхДанных.
Вариант синтаксиса: По массиву разделителей

Синтаксис:
Разделить(<Разделители>)
Параметры:

<Разделители> (обязательный)
Тип: Массив.
Массив разделителей. Может содержать значения типа БуферДвоичныхДанных.
Описание варианта метода:
Разделить буфер на части по заданным разделителям.
Элементы массива должны иметь тип БуферДвоичныхДанных.
Возвращаемое значение:
Тип: Массив.
Тип элемента массива - БуферДвоичныхДанных.
Описание:

Разделить буфер на части по заданному разделителю.

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

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.

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

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

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

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

Разделить настоящий UTF8 буфер:4поля, один/массив разделителей и неверная сумма

Конкретный парсер Книга;3;250;750 демонстрирует реальные массивы БуферДвоичныхДанных, декодирование только после разделения, альтернативные разделители и отказ сумме751. Без файлов/архивов/сети.

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

Полный модуль собственной управляемой формы толстого Windows-клиента; только memory UTF8/BSL, actual0.

Подготовка

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

  2. В конфигурации0предметных объектов/регистров/общих реквизитов/подписок/заданий/внешних источников. Никаких расширений базы или сеанса. Полный guard server-процедуры проверяет это и отсутствие активной транзакции.

  3. Запускайте только толстый управляемый Windows-клиент8.5.1.1343, не сервер/тонкий/веб/мобильный. Желательно отдельный учебный Windows-профиль с ASCII именем OwnArchive85: legacyZIP API ограничивает национальные символы в исходных путях. SHA256 API доступен в толстом клиенте.

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

  5. Вставьте весь основной модуль одного выбранного урока в форму. Уроки самостоятельны: не объединяйте одноименные процедуры. Буферный урок не создает файлов и не использует ПутьОпыта85.

  6. После подтверждения нового пустого стенда каждая файловая команда генерирует свой свежий UUID и проверяет отсутствие OwnArchive85-UUID в native клиентском временном каталоге. Путь не берется из пользовательской строки. Existing-файлы никогда не перезаписываются.

  7. Архивный fixture — только свои card.txt UTF8безBOM Книга;3;250;750 и manifest.txt со своим UUID/files=2. Файлы сначала реально записываются и сверяются с исходными bytes/размером/SHA256. Пути/маски/имена пользователя в writer не передаются.

  8. Архивы создаются в ПотокВПамяти двумя реальными API-путями: constructor(stream) и new-uninitialized→Открыть(stream). Для modern явно ТипФайлаАрхива.ZIP; пароль пустой, шифрование не заявляется. Записать финализирует writer; метода Закрыть у writer нет, он не выдумывается.

  9. Перед ИзвлечьВсе проверяются ровно2entry, exact whitelist плоских имен,0дубликатов/шифрования и точные размеры исходных байтов. Неизвестные/абсолютные пути/каталоги/traversal отказываются до распаковки. Это только свой только что построенный архив, не универсальный валидатор чужих ZIP.

  10. Output out-1/out-2 создаются внутри только своего UUID каталога после проверки отсутствия/пустоты. ИзвлечьВсе передается лишь обязательный Путь: native modern8.5 описывает второй параметр как Строка, поэтому неподтвержденное enum-значение туда не подставляется. Плоский whitelist не требует восстановленных каталогов.

  11. У ExtractAll результат подтверждается по обоим файлам: exact bytes, размеры иSHA256file=mempayload. Legacy Найти/Получить проверяются на реально полученной коллекции, с missing-name и index=count. Modern Find/Get native ошибочно описаны без аргументов и в этом уроке не угадываются.

  12. Ждать и callback уроки записывают отдельный свой новый payload.txt. Promise дает Неопределено; callback — только К; error callback3аргумента. Имя/bytes не принимаются от незнакомого объекта и completion не выдается за успешность без readback.

  13. Новые собственные учебные файлы/output-папки после ВАШЕГО ручного опыта остаются по показанному пути для контроля. Автоматического/рекурсивного удаления нет. При ошибке не повторяйте запись в старую UUID-папку; не подставляйте рабочий каталог.

  14. Здесь actual1C/files/archivewrites/network0: написаны только примеры и статические тесты. Архивные fixtures в offline-тестах исключительно in-memory и не являются резервными копиями. До ручного запуска итоговые сообщения — ожидаемый протокол.

&НаКлиенте
Процедура Выполнить85(Команда)
    Если Занято85 Тогда
        ВызватьИсключение "Дождитесь своего предыдущего опыта";
    КонецЕсли;
    Занято85 = Истина;
    Статус85 = "Свой binary parser еще не подтвержден";
    Попытка
        ПроверитьСвоегоКлиента85();
        Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("Книга;3;250;750", КодировкаТекста.UTF8, Ложь));
        Разделитель = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(";", КодировкаТекста.UTF8, Ложь));
        Части = Буфер.Разделить(Разделитель);
        ПроверитьСвоиПоля85(Части);
        Разделители = Новый Массив;
        Разделители.Добавить(Разделитель);
        Дополнительный = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("|", КодировкаТекста.UTF8, Ложь));
        Разделители.Добавить(Дополнительный);
        Смешанный = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("Книга;3|250;750", КодировкаТекста.UTF8, Ложь));
        ПроверитьСвоиПоля85(Смешанный.Разделить(Разделители));
        БезРазделителя = Буфер.Разделить(Дополнительный);
        Если ТипЗнч(БезРазделителя) <> Тип("Массив") Или БезРазделителя.Количество() <> 1 Тогда
            ВызватьИсключение "Отсутствующий разделитель должен сохранить весь собственный буфер";
        КонецЕсли;
        Если ПолучитьСтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(БезРазделителя[0]), КодировкаТекста.UTF8) <> "Книга;3;250;750" Тогда
            ВызватьИсключение "Собственный исходный буфер потерян";
        КонецЕсли;
        Испорченный = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("Книга;3;250;751", КодировкаТекста.UTF8, Ложь));
        ОтказИтога = Ложь;
        Попытка
            ПроверитьСвоиПоля85(Испорченный.Разделить(Разделитель));
        Исключение
            ОтказИтога = Истина;
        КонецПопытки;
        Если Не ОтказИтога Тогда
            ВызватьИсключение "Парсер обязан отвергнуть неверную собственную сумму";
        КонецЕсли;
        Статус85 = "Свой UTF8 binary parser:4поля Книга/3/250/750, один/массив разделителей; отсутствующий delimiter не теряет bytes; сумма751 отвергнута. Файлов/сети нет";
    Исключение
        Статус85 = "Свой binary parser не подтвержден";
    КонецПопытки;
    Занято85 = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвоиПоля85(Части)
    Если ТипЗнч(Части) <> Тип("Массив") Или Части.Количество() <> 4 Тогда
        ВызватьИсключение "Own record имеет ровно4поля";
    КонецЕсли;
    Поля = Новый Массив;
    Для Каждого Часть Из Части Цикл
        Если ТипЗнч(Часть) <> Тип("БуферДвоичныхДанных") Тогда
            ВызватьИсключение "Split возвращает массив буферов, не строк";
        КонецЕсли;
        Поля.Добавить(ПолучитьСтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Часть), КодировкаТекста.UTF8));
    КонецЦикла;
    Если Поля[0] <> "Книга" Или Поля[1] <> "3" Или Поля[2] <> "250" Или Поля[3] <> "750"
        Или Число(Поля[1]) * Число(Поля[2]) <> Число(Поля[3]) Тогда
        ВызватьИсключение "Точный own UTF8 record/расчет не совпали";
    КонецЕсли;
КонецПроцедуры

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

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

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

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

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

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

  1. Проверьте собственный пустой стенд/клиент. Этот отдельный урок не создает UUID-папок и не пишет файлы.

  2. Кодирует Книга;3;250;750 в UTF8безBOM и получает actual БуферДвоичныхДанных, не произвольную строку вместо буфера.

  3. Разделитель ; тоже реальный UTF8 буфер. Разделить(буфер) дает массив4буферов.

  4. Каждую часть проверяем как БуферДвоичныхДанных, переводим обратно в ДвоичныеДанные и только затем UTF8 строку.

  5. Проверяем exact Книга/3/250/750 и арифметику3×250=750; числа берутся из собственных действительно распарсенных полей.

  6. Второй вариант создает настоящий массив буферов ; и |; Смешанный Книга;3|250;750 разбирается в те же4поля.

  7. Разделитель | отсутствует в исходном буфере: одна часть и точные исходные bytes сохранены, не пустой массив.

  8. Собственный испорченный record содержит751. Сам Split не валидирует бизнес-данные: наш полный валидатор обязан отказаться и не выдать общий успех.

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

  1. Результат Split — массив буферов, не строк; UTF8 Книга сохранена без разрезания многобайтных символов ASCII разделителем.

  2. Один и массив разделителей дают exact4поля; отсутствующий delimiter сохраняет запись целиком.

  3. Ошибочная сумма751 отказана после полноценного парсинга;3×250 проверено по реальным полям.

  4. Не используется malformed native0args вариант Split: вызываются два четко описанных required-arg варианта. Files/1C/network0.

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

Ожидаемые ручные4поля Книга/3/250/750, сохранение whole-buffer без delimiter и отказ751. Статические UTF8/contract tests — не запуск1С.

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

  1. Делить raw UTF8 по произвольному байту внутри кириллического символа нельзя. Здесь ASCII ;/| — собственный известный формат записи.

  2. Буфер.Разделить сам не проверяет количество/типы/арифметику. Для этого реализован конкретный собственный валидатор, а не обещание корректности любых данных.

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

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

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

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

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