Объединяет несколько файлов в один.
Синтаксис
ОбъединитьФайлы(<ИменаЧастей>, <ИмяРезультирующегоФайла>)ОбъединитьФайлы(<ШаблонПоиска>, <ИмяРезультирующегоФайла>)Примеры платформы
МассивИмен = Новый Массив(3);
МассивИмен.Добавить("C:\Windows\Temp\Presentation.ppt.1");
МассивИмен.Добавить("C:\Windows\Temp\Presentation.ppt.2");
МассивИмен.Добавить("C:\Windows\Temp\Presentation.ppt.3");
ОбъединитьФайлы(МассивИмен,"C:\Windows\Temp\Presentation.ppt");Полное описание, параметры и ограничения
Глобальный контекст.ОбъединитьФайлы (Global context.MergeFiles)
Глобальный контекст (Global context)
ОбъединитьФайлы (MergeFiles)
Доступен, начиная с версии 8.0.
Вариант синтаксиса: По массиву имен частей файла
Синтаксис:
ОбъединитьФайлы(<ИменаЧастей>, <ИмяРезультирующегоФайла>)
Параметры:
<ИменаЧастей> (обязательный)
Тип: Массив.
Массив имен частей файла, которые требуется объединить. Объединение будет происходить в порядке, в котором заданы имена файлов в массиве.
<ИмяРезультирующегоФайла> (обязательный)
Тип: Строка.
Имя файла, который требуется создать при объединении частей.
Вариант синтаксиса: По маске
Синтаксис:
ОбъединитьФайлы(<ШаблонПоиска>, <ИмяРезультирующегоФайла>)
Параметры:
<ШаблонПоиска> (обязательный)
Тип: Строка.
Шаблон поиска частей.
<ИмяРезультирующегоФайла> (обязательный)
Тип: Строка.
Имя файла, который требуется создать путем объединения найденных частей.
Описание варианта метода:
При объединении файлов по маске необходимо задать маску поиска файлов и имя файла, который требуется создать.
Например, в каталоге "C:\MySplittedData\" содержатся файлы:
C:\MySplittedData\BigSplittedData.zip.001
C:\MySplittedData\BigSplittedData.zip.002
C:\MySplittedData\BigSplittedData.zip.003
C:\MySplittedData\BigSplittedData.zip.004
Выполнение кода вида:
ОбъединитьФайлы("C:\MySplittedData\BigSplittedData.zip.*", "C:\MySplittedData\BigSplittedData.zip")
приведет к объединению вышеперечисленных файлов в файл с заданным именем.
Внимание! Файлы объединяются в порядке возрастания имен.
Описание:
Объединяет несколько файлов в один.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Пример:
МассивИмен = Новый Массив(3);
МассивИмен.Добавить("C:\Windows\Temp\Presentation.ppt.1");
МассивИмен.Добавить("C:\Windows\Temp\Presentation.ppt.2");
МассивИмен.Добавить("C:\Windows\Temp\Presentation.ppt.3");
ОбъединитьФайлы(МассивИмен,"C:\Windows\Temp\Presentation.ppt");
См. также:
Глобальный контекст, метод СоединитьДвоичныеДанные
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Разделить свой UTF8 файл16байт и объединить по массиву/маске без потери данных
Полный собственный учебный маршрут с 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 Тогда
ВызватьИсключение "Свой split/merge опыт еще выполняется";
КонецЕсли;
Занято85 = Истина;
Статус85 = "Свой split/merge roundtrip еще не подтвержден";
Попытка
К = СоздатьСвойКорень85(КаталогВременныхФайлов());
ПутьОпыта85 = К.Корень;
Исходный = К.Корень + "own-payload.bin";
ПроверитьОтсутствиеСвоегоФайла85(Исходный);
Данные = ПолучитьДвоичныеДанныеИзСтроки("BEGIN:" + К.UUID + "|Книга;3;250;750|END", КодировкаТекста.UTF8, Ложь);
Данные.Записать(Исходный);
Если Данные.Размер() <= 32 Тогда
ВызватьИсключение "Own payload должен дать несколько real16byte частей";
КонецЕсли;
ПапкаЧастей = К.Корень + "parts\";
СоздатьКаталог(ПапкаЧастей);
Если НайтиФайлы(ПапкаЧастей, "*", Ложь).Количество() <> 0 Тогда
ВызватьИсключение "Разделять можно только в новую own пустую parts-папку";
КонецЕсли;
Возвращенное = РазделитьФайл(Исходный, 16, ПапкаЧастей);
Ожидается = Цел((Данные.Размер() + 15) / 16);
Если ТипЗнч(Возвращенное) <> Тип("Массив") Или Возвращенное.Количество() <> Ожидается
Или Ожидается < 2 Или Ожидается > 9 Тогда
ВызватьИсключение "Не подтверждено actual число собственных частей";
КонецЕсли;
Имена = Новый Массив;
Для Номер = 1 По Ожидается Цикл
Суффикс = Прав("000" + Строка(Номер), 3);
Путь = ПапкаЧастей + "own-payload.bin." + Суффикс;
Часть = Новый Файл(Путь);
Размер = Мин(16, Данные.Размер() - (Номер - 1) * 16);
Если Не Часть.Существует() Или Не Часть.ЭтоФайл() Или Часть.Размер() <> Размер Тогда
ВызватьИсключение "Не совпали own документированное имя .001... и размер16/остаток";
КонецЕсли;
Имена.Добавить(Путь);
КонецЦикла;
Если НайтиФайлы(ПапкаЧастей, "*", Ложь).Количество() <> Ожидается Тогда
ВызватьИсключение "В own parts нет посторонних файлов перед merge по маске";
КонецЕсли;
ПоМассиву = К.Корень + "own-merge-array.bin";
ПоМаске = К.Корень + "own-merge-mask.bin";
ПроверитьОтсутствиеСвоегоФайла85(ПоМассиву);
ПроверитьОтсутствиеСвоегоФайла85(ПоМаске);
ОбъединитьФайлы(Имена, ПоМассиву);
ОбъединитьФайлы(ПапкаЧастей + "own-payload.bin.*", ПоМаске);
ПроверитьСвойPayload85(ПоМассиву, Данные);
ПроверитьСвойPayload85(ПоМаске, Данные);
Обратные = Новый Массив;
Для Индекс = 0 По Имена.Количество() - 1 Цикл
Обратные.Добавить(Имена[Имена.Количество() - 1 - Индекс]);
КонецЦикла;
Неверный = К.Корень + "own-wrong-order.bin";
ПроверитьОтсутствиеСвоегоФайла85(Неверный);
ОбъединитьФайлы(Обратные, Неверный);
ОтказПорядка = Ложь;
Попытка
ПроверитьСвойPayload85(Неверный, Данные);
Исключение
ОтказПорядка = Истина;
КонецПопытки;
Если Не ОтказПорядка Тогда
ВызватьИсключение "Merge с обратным actual порядком обязан не совпасть с own payload";
КонецЕсли;
Статус85 = "UUID " + К.UUID + ": split16bytes → " + Строка(Ожидается) + "parts; merge array/mask exact bytes; reversed-order отвергнут нашим контролем. Own файлы оставлены";
Исключение
Статус85 = "Own split/merge/состав/bytes не подтверждены; никакие файлы автоматически не удаляются";
КонецПопытки;
Занято85 = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвойPayload85(Путь, Ожидание)
Файл = Новый Файл(Путь);
Если Не Файл.Существует() Или Не Файл.ЭтоФайл() Или Файл.Размер() <> Ожидание.Размер() Тогда
ВызватьИсключение "Own объединенный файл не имеет ожидаемого размера";
КонецЕсли;
Если Base64Строка(Новый ДвоичныеДанные(Путь)) <> Base64Строка(Ожидание) Тогда
ВызватьИсключение "Own объединенный файл не совпадает побайтно";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ПроверитьСвоюБазуКаталога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 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Проверьте свой пустой Windows-стенд и создайте fresh native-temp UUID root. Перед исходным файлом доказывается отсутствие; файл содержит только собственный UTF8 payload.
Создайте новую пустую parts-папку. РазделитьФайл(actual own source,16,parts) возвращает массив; count сверяется с округлением фактического числаБАЙТ, содержимое массива не трактуется как неподтвержденный тип.
Имена .001... соответствуют native документации; создаем проверенный ordered array путей из этого правила и подтверждаем actual существование/тип/размер каждого файла.
Parts-folder содержит ровно ожидаемые свои части, никаких дополнительных файлов перед wildcard merge. Outputs array/mask обязаны отсутствовать.
ОбъединитьФайлы(array,path) сохраняет explicit порядок; ОбъединитьФайлы(mask,path) сортирует возрастающие имена. С padded числовыми суффиксами оба восстанавливают исходные bytes.
Проверяйте actual размер и Base64 целого нового файла. Разрез внутри многобайтной UTF8 буквы допустим только потому, что файл объединяется до декодирования.
Третий собственный output создается из reversed array. Native merge не обязан знать правильность порядка; наш exact-byte контроль обязан отказаться. Ошибка бизнес-целостности не приписывается native исключению.
Итог после обоих положительных маршрутов и отрицательного reversed-order теста. Parts/files остаются в своей UUID-папке, ничего не удаляется.
Как проверить результат
Пройдены собственные 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, ничего автоматически не удаляем.
Ожидаемый результат
Реальные свои parts16/остаток, array/mask exact-byte roundtrip и отказ reversed-order нашим контролем. Ни один foreign file или глобальная wildcard-папка не используется.
На что обратить внимание
ЗначениеВФайл/ИзФайла — внутренний native формат, не человекочитаемыйJSON. Здесь сохранение и schema readback выполняются только для own записи.
РазделитьФайл работает сбайтами; ОбъединитьФайлы не проверяет смысл порядка. СохранитьЗначение хранит значение по пареИБ-пользователь, а не по произвольному глобальномуключу всей системы.
Прямой actual запуск здесь не выполнялся. Ложь/Undefined/неверная schema не маскируются успехом или новым default-object.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.