Начинает разделение остатка данных по заданным разделителям.
Синтаксис
НачатьРазделениеНаЧастиПо(<ОписаниеОповещения>, <РазмерЧасти>)Полное описание, параметры и ограничения
ЧтениеДанных.НачатьРазделениеНаЧастиПо (DataReader.BeginSplitInPartsOf)
ЧтениеДанных (DataReader)
НачатьРазделениеНаЧастиПо (BeginSplitInPartsOf)
Доступен, начиная с версии 8.3.9.
Синтаксис:
НачатьРазделениеНаЧастиПо(<ОписаниеОповещения>, <РазмерЧасти>)
Параметры:
<ОписаниеОповещения> (обязательный)
Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после завершения работы метода со следующими параметрами:
<Результаты> - Массив, содержащий значения типа РезультатЧтенияДанных.
<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
<РазмерЧасти> (обязательный)
Тип: Число.
Размер одной части данных в байтах.
Описание:
Начинает разделение остатка данных по заданным разделителям.
Доступность:
Тонкий клиент, веб-клиент, толстый клиент.
См. также:
ЧтениеДанных, метод Разделить
ЧтениеДанных, метод РазделитьНаЧастиПо
ЧтениеДанных, метод РазделитьНаЧастиПоАсинх
ЧтениеДанных, метод РазделитьАсинх
Использование в версии:
Доступен, начиная с версии 8.3.9.
Описание изменено в версии 8.3.18.
Методическая информация
Практические примеры
Получить массив частей через callback и сравнить два способа разделения
Два независимых читателя одного набора AA|BBB показывают текстовые записи и порции фиксированной длины.
Где и как запускать
Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.
Подготовка
Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.
В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.
Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.
Пример работает только со своими данными в памяти; записи в базу, файлы и сеть нет.
Перем Выполняется;
&НаКлиенте
Процедура УчебныйПример(Команда)
Если Выполняется = Истина Тогда
Сообщить("Дождитесь завершения предыдущей учебной цепочки");
Возврат;
КонецЕсли;
Данные = ПолучитьДвоичныеДанныеИзСтроки("AA|BBB", КодировкаТекста.UTF8, Ложь);
Чтение = Новый ЧтениеДанных(Данные, КодировкаТекста.UTF8);
Состояние = Новый Структура("Чтение,ЧтениеЗакрыто,Данные", Чтение, Ложь, Данные);
Выполняется = Истина;
Попытка
Состояние.Чтение.НачатьРазделение(ОповещениеДля("ПослеЗаписей", Состояние), "|", КодировкаТекста.UTF8);
Исключение
ОсвободитьУчебныеРесурсы(Состояние);
Выполняется = Ложь;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Функция ОповещениеДля(ИмяОбработчика, Состояние)
Возврат Новый ОписаниеОповещения(ИмяОбработчика, ЭтотОбъект, Состояние,
"ОшибкаОперации", ЭтотОбъект);
КонецФункции
&НаКлиенте
Процедура ОшибкаОперации(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
ОсвободитьУчебныеРесурсы(Состояние);
Выполняется = Ложь;
СтандартнаяОбработка = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ОсвободитьУчебныеРесурсы(Состояние)
Попытка
Если Не Состояние.ЧтениеЗакрыто Тогда
Состояние.Чтение.Закрыть();
Состояние.ЧтениеЗакрыто = Истина;
КонецЕсли;
Исключение
// Не заменяем первичную ошибку вторичной ошибкой освобождения ресурсов.
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписей(Результаты, Состояние) Экспорт
Сообщить(Результаты.Количество() = 2);
Сообщить(Результаты[0].Размер = 2 И Результаты[1].Размер = 3);
Состояние.Чтение.НачатьЗакрытие(ОповещениеДля("ПослеПервогоЗакрытия", Состояние));
КонецПроцедуры
&НаКлиенте
Процедура ПослеПервогоЗакрытия(Состояние) Экспорт
Состояние.ЧтениеЗакрыто = Истина;
НовоеЧтение = Новый ЧтениеДанных(Состояние.Данные);
Состояние.Чтение = НовоеЧтение;
Состояние.ЧтениеЗакрыто = Ложь;
Состояние.Чтение.НачатьРазделениеНаЧастиПо(ОповещениеДля("ПослеПорций", Состояние), 2);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПорций(Результаты, Состояние) Экспорт
Сообщить(Результаты.Количество() = 3);
Сообщить(Результаты[0].Размер = 2 И Результаты[1].Размер = 2 И Результаты[2].Размер = 2);
Середина = ПолучитьСтрокуИзДвоичныхДанных(Результаты[1].ПолучитьДвоичныеДанные(), КодировкаТекста.UTF8);
Сообщить(Середина = "|B");
Состояние.Чтение.НачатьЗакрытие(ОповещениеДля("ПослеПоследнегоЗакрытия", Состояние));
КонецПроцедуры
&НаКлиенте
Процедура ПослеПоследнегоЗакрытия(Состояние) Экспорт
Состояние.ЧтениеЗакрыто = Истина;
Выполняется = Ложь;
КонецПроцедурыРазбор по шагам
Callback НачатьРазделение получает массив РезультатЧтенияДанных и дополнительное состояние.
Текстовая граница | исключена из двух записей AA и BBB, размеры 2/3.
После закрытия первого читателя создаём второй с начала тех же ДвоичныеДанные. Старую позицию не переиспользуем.
НачатьРазделениеНаЧастиПо(2) отдаёт три порции по два байта. Середина |B включает границу, потому что метод не знает структуры записей.
После последнего callback закрываем активного читателя и снимаем запрет повторного запуска.
Как проверить результат
Пять сравнений Истина: два логических поля и три байтовые порции; средняя порция |B.
После повторного запуска результаты одинаковы; файлов нет.
Ожидаемый результат
Сопоставлены массивы результатов двух callback-методов без смешивания их смысла.
На что обратить внимание
Размер фиксированной порции должен быть больше нуля.
Этот пример ASCII. Для UTF-8 нельзя произвольно декодировать каждую байтовую порцию.
Возвращаемый массив не содержит готовые строки; сначала получайте нужное представление части.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.