ЧтениеДанных.НачатьРазделениеНаЧастиПо

Методы · BeginSplitInPartsOf

Начинает разделение остатка данных по заданным разделителям.

Синтаксис

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

ЧтениеДанных.НачатьРазделениеНаЧастиПо (DataReader.BeginSplitInPartsOf)

ЧтениеДанных (DataReader)

НачатьРазделениеНаЧастиПо (BeginSplitInPartsOf)

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

Синтаксис:
НачатьРазделениеНаЧастиПо(<ОписаниеОповещения>, <РазмерЧасти>)
Параметры:

<ОписаниеОповещения> (обязательный)
Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после завершения работы метода со следующими параметрами:
<Результаты> - Массив, содержащий значения типа РезультатЧтенияДанных.

<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.

<РазмерЧасти> (обязательный)
Тип: Число.
Размер одной части данных в байтах.
Описание:

Начинает разделение остатка данных по заданным разделителям.

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

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

См. также:
ЧтениеДанных, метод Разделить
ЧтениеДанных, метод РазделитьНаЧастиПо
ЧтениеДанных, метод РазделитьНаЧастиПоАсинх
ЧтениеДанных, метод РазделитьАсинх

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

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

Описание изменено в версии 8.3.18.

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

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

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

Два независимых читателя одного набора AA|BBB показывают текстовые записи и порции фиксированной длины.

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

Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.

Подготовка

  1. Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.

  2. В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.

  3. Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.

  4. Пример работает только со своими данными в памяти; записи в базу, файлы и сеть нет.

Перем Выполняется;

&НаКлиенте
Процедура УчебныйПример(Команда)
    Если Выполняется = Истина Тогда
        Сообщить("Дождитесь завершения предыдущей учебной цепочки");
        Возврат;
    КонецЕсли;
    Данные = ПолучитьДвоичныеДанныеИзСтроки("AA|BBB", КодировкаТекста.UTF8, Ложь);
    Чтение = Новый ЧтениеДанных(Данные, КодировкаТекста.UTF8);
    Состояние = Новый Структура("Чтение,ЧтениеЗакрыто,Данные", Чтение, Ложь, Данные);
    Выполняется = Истина;
    Попытка
        Состояние.Чтение.НачатьРазделение(ОповещениеДля("ПослеЗаписей", Состояние), "|", КодировкаТекста.UTF8);
    Исключение
        ОсвободитьУчебныеРесурсы(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Функция ОповещениеДля(ИмяОбработчика, Состояние)
    Возврат Новый ОписаниеОповещения(ИмяОбработчика, ЭтотОбъект, Состояние,
        "ОшибкаОперации", ЭтотОбъект);
КонецФункции

&НаКлиенте
Процедура ОшибкаОперации(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
    ОсвободитьУчебныеРесурсы(Состояние);
    Выполняется = Ложь;
    СтандартнаяОбработка = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОсвободитьУчебныеРесурсы(Состояние)
    Попытка
        Если Не Состояние.ЧтениеЗакрыто Тогда
            Состояние.Чтение.Закрыть();
            Состояние.ЧтениеЗакрыто = Истина;
        КонецЕсли;
    Исключение
        // Не заменяем первичную ошибку вторичной ошибкой освобождения ресурсов.
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписей(Результаты, Состояние) Экспорт
    Сообщить(Результаты.Количество() = 2);
    Сообщить(Результаты[0].Размер = 2 И Результаты[1].Размер = 3);
    Состояние.Чтение.НачатьЗакрытие(ОповещениеДля("ПослеПервогоЗакрытия", Состояние));
КонецПроцедуры

&НаКлиенте
Процедура ПослеПервогоЗакрытия(Состояние) Экспорт
    Состояние.ЧтениеЗакрыто = Истина;
    НовоеЧтение = Новый ЧтениеДанных(Состояние.Данные);
    Состояние.Чтение = НовоеЧтение;
    Состояние.ЧтениеЗакрыто = Ложь;
    Состояние.Чтение.НачатьРазделениеНаЧастиПо(ОповещениеДля("ПослеПорций", Состояние), 2);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПорций(Результаты, Состояние) Экспорт
    Сообщить(Результаты.Количество() = 3);
    Сообщить(Результаты[0].Размер = 2 И Результаты[1].Размер = 2 И Результаты[2].Размер = 2);
    Середина = ПолучитьСтрокуИзДвоичныхДанных(Результаты[1].ПолучитьДвоичныеДанные(), КодировкаТекста.UTF8);
    Сообщить(Середина = "|B");
    Состояние.Чтение.НачатьЗакрытие(ОповещениеДля("ПослеПоследнегоЗакрытия", Состояние));
КонецПроцедуры

&НаКлиенте
Процедура ПослеПоследнегоЗакрытия(Состояние) Экспорт
    Состояние.ЧтениеЗакрыто = Истина;
    Выполняется = Ложь;
КонецПроцедуры

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

  1. Callback НачатьРазделение получает массив РезультатЧтенияДанных и дополнительное состояние.

  2. Текстовая граница | исключена из двух записей AA и BBB, размеры 2/3.

  3. После закрытия первого читателя создаём второй с начала тех же ДвоичныеДанные. Старую позицию не переиспользуем.

  4. НачатьРазделениеНаЧастиПо(2) отдаёт три порции по два байта. Середина |B включает границу, потому что метод не знает структуры записей.

  5. После последнего callback закрываем активного читателя и снимаем запрет повторного запуска.

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

  1. Пять сравнений Истина: два логических поля и три байтовые порции; средняя порция |B.

  2. После повторного запуска результаты одинаковы; файлов нет.

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

Сопоставлены массивы результатов двух callback-методов без смешивания их смысла.

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

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

  2. Этот пример ASCII. Для UTF-8 нельзя произвольно декодировать каждую байтовую порцию.

  3. Возвращаемый массив не содержит готовые строки; сначала получайте нужное представление части.

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

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

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

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

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