Глобальный контекст.КаталогПрограммы

Методы · BinDir

Получает имя каталога, в котором расположены исполняемые файлы программы.

Синтаксис

КаталогПрограммы()

Примеры платформы

ГдеИскать = КаталогПрограммы();
Полное описание, параметры и ограничения

Глобальный контекст.КаталогПрограммы (Global context.BinDir)

Глобальный контекст (Global context)

КаталогПрограммы (BinDir)

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

Синтаксис:
КаталогПрограммы()
Возвращаемое значение:
Тип: Строка.
Имя каталога исполняемых файлов программы.
Описание:

Получает имя каталога, в котором расположены исполняемые файлы программы.

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

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

Пример:

ГдеИскать = КаталогПрограммы();

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

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

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

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

ЗначениеВФайл/ИзФайла: structured snapshot и защита от fallback в каталог программы

Полный собственный учебный маршрут с concrete UTF8/typedrecord/UUID/state, positive readback и отрицательными проверками. Native сигнатуры/результаты проверены; сторонние файлы, настройки и каталоги не принимаются как fixture.

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

Полный модуль управляемой формы только толстого Windows-клиента8.5.1.1343 своей новой пустой файловой ИБ; server только guard, actual0.

Подготовка

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

  2. В этой ИБ0предметных объектов, регистров, внешних источников, общих реквизитов, заданий/подписок;0расширений базы/сеанса. Полный серверный guard проверяет exact версию/metadata/все3nativeисточника расширений и отсутствие транзакции.

  3. Запускайте только толстый управляемый Windows-клиент8.5.1.1343 под отдельным учебным Windows-профилем; thin/web/mobile/server positive пути не заявляются. File value API и SaveValue/RestoreValue поддерживаются в толстом клиенте, не переносите их на сервер или browser.

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

  5. Settings-урок вместо Выполнить85 имеет3отдельные команды/кнопки СоздатьНастройку85, ПрочитатьНастройку85, ОбновитьТолькоСвоюНастройку85. Дополнительно UUIDНастройки85 Строка36. При чтении следующего сеанса вставьте сохраненный собственный UUID, не начинайте новую настройку.

  6. Модули самостоятельны: вставляйте весь выбранный code, не склеивайте одинаковые процедуры/guards из нескольких уроков. Обновите только свою учебную ИБ и подтвердите только этот пустой стенд.

  7. Файловые workflows используют лишь actual native временный каталог толстого клиента. Проверяется локальный абсолютный диск/существующая папка/отличие от КаталогПрограммы; далее fresh OwnGlobalIO85-UUID, отсутствие/пустота. Native ЗначениеВФайл/ИзФайла могут использовать каталог программы при отсутствующем каталоге — эту fallback-ветку блокируем ДО вызова.

  8. Split/merge payload — конкретный UTF8безBOM BEGIN:<ownUUID>|Книга;3;250;750|END. РазделитьФайл получает16БАЙТ, не16символов, и свою пустую parts-папку. Возвращенный массив используется только как count: type его элементов в native не описан и не угадывается.

  9. Documented имена частей own-payload.bin.001/.002... проверяются реально через Файл и размеры16/остаток; порядок для merge array задан explicit. Для merge mask набор предварительно доказывается точным количеством своих частей; именам свойственен lexicographic порядок с ведущими нулями.

  10. Native value-file fixture — сериализуемая реальная Структура из6полей: Версия1,ownUUID,Книга,Количество3,Цена250,Сумма750. ЗначениеВФайл даетBool, проверяем его; ЗначениеИзФайла возвращает actualтип, сверяем все поля/типы/расчет, не любое восстановленное значение.

  11. Настройки SaveValue/RestoreValue имеют область именно текущая параИБ-пользователь. Создается один новый namespace OwnGlobalIO85:<ownUUID> после проверки отсутствия; последующая отдельная команда меняет только доказанную own v3/750 наv4/1000. Никакого перечисления/очистки всех пользовательских настроек нет.

  12. Все созданные собственные files/parts/wrong-order-output и свой namespace сохраняются после ВАШЕГО ручного опыта для контроля. Автоматического/рекурсивного удаления или очистки настроек нет; повторный overwrite не допускается.

  13. При ожидании callback не закрывайте форму/клиент; Занято85 блокирует вторую команду. Completion native tempdir имеет2параметра, error callback3в правильном порядке. Каталог из callback сверяется с реальным native temp, не становится произвольным input-путем.

  14. 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 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

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

  1. Создайте собственную реальную запись Книга3/250/750 сfresh UUID и новую проверенную абсолютную папку native-temp.

  2. ПроверитьСвоюБазуКаталога85 получает КаталогПрограммы не ради getter-демо, а для запрета опасной native fallback/записи рядом сexe. Относительный/несуществующий каталог прекращает опыт.

  3. Own-value.bin должен отсутствовать. ЗначениеВФайл(actual path,actual own record) даетBool; Ложь не считается успехом даже без исключения.

  4. Проверьте actual существование файла/положительный размер. ЗначениеИзФайла читает native сериализацию, не JSON/текст; тип полученной записи подтверждается как Структура.

  5. Проверяются ровно6полей, их фактические типы, ownUUID, значения и3×250=750. Случайное сериализованное значение не пройдет schema-guard.

  6. Изменяем только исходный memory record на4/1000; повторное чтение existing file обязано сохранить snapshot3/750. Файл без явной новой записи не должен измениться.

  7. Own not-a-value.txt создается здесь как plain UTF8. ЗначениеИзФайла либо отказывает parsing, либо результат отвергает наш строгий schema-guard: plain-text не считается native записью.

  8. Общий успех только после positive snapshot и отрицательного non-native файла. Все собственные файлы остаются; actualfilewrites0 до ручного запуска.

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

  1. Пройдены собственные positive данные/actualтип/schema/UUID, не только непустые объекты или отсутствие исключений.

  2. Native аргументы/returns/context совпадают со справкой8.5.1.1343; неоднозначный result не угадывается.

  3. Own absolute root/namespace проверяется до writes; unknown/overwrite/fallback-success не допускается.

  4. Все изменения только при будущем ВАШЕМ ручном опыте в новом стенде. Actualfiles/settings/1C/network0, ничего автоматически не удаляем.

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

Native BoolSave/readback всех6полей, стабильный file snapshot после memory-изменения и обязательное неприятие plain-text. Guard блокирует fallback к каталогу программы.

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

  1. ЗначениеВФайл/ИзФайла — внутренний native формат, не человекочитаемыйJSON. Здесь сохранение и schema readback выполняются только для own записи.

  2. РазделитьФайл работает сбайтами; ОбъединитьФайлы не проверяет смысл порядка. СохранитьЗначение хранит значение по пареИБ-пользователь, а не по произвольному глобальномуключу всей системы.

  3. Прямой actual запуск здесь не выполнялся. Ложь/Undefined/неверная schema не маскируются успехом или новым default-object.

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

Разделить свой UTF8 файл16байт и объединить по массиву/маске без потери данных

Полный собственный учебный маршрут с concrete UTF8/typedrecord/UUID/state, positive readback и отрицательными проверками. Native сигнатуры/результаты проверены; сторонние файлы, настройки и каталоги не принимаются как fixture.

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

Полный модуль управляемой формы только толстого Windows-клиента8.5.1.1343 своей новой пустой файловой ИБ; server только guard, actual0.

Подготовка

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

  2. В этой ИБ0предметных объектов, регистров, внешних источников, общих реквизитов, заданий/подписок;0расширений базы/сеанса. Полный серверный guard проверяет exact версию/metadata/все3nativeисточника расширений и отсутствие транзакции.

  3. Запускайте только толстый управляемый Windows-клиент8.5.1.1343 под отдельным учебным Windows-профилем; thin/web/mobile/server positive пути не заявляются. File value API и SaveValue/RestoreValue поддерживаются в толстом клиенте, не переносите их на сервер или browser.

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

  5. Settings-урок вместо Выполнить85 имеет3отдельные команды/кнопки СоздатьНастройку85, ПрочитатьНастройку85, ОбновитьТолькоСвоюНастройку85. Дополнительно UUIDНастройки85 Строка36. При чтении следующего сеанса вставьте сохраненный собственный UUID, не начинайте новую настройку.

  6. Модули самостоятельны: вставляйте весь выбранный code, не склеивайте одинаковые процедуры/guards из нескольких уроков. Обновите только свою учебную ИБ и подтвердите только этот пустой стенд.

  7. Файловые workflows используют лишь actual native временный каталог толстого клиента. Проверяется локальный абсолютный диск/существующая папка/отличие от КаталогПрограммы; далее fresh OwnGlobalIO85-UUID, отсутствие/пустота. Native ЗначениеВФайл/ИзФайла могут использовать каталог программы при отсутствующем каталоге — эту fallback-ветку блокируем ДО вызова.

  8. Split/merge payload — конкретный UTF8безBOM BEGIN:<ownUUID>|Книга;3;250;750|END. РазделитьФайл получает16БАЙТ, не16символов, и свою пустую parts-папку. Возвращенный массив используется только как count: type его элементов в native не описан и не угадывается.

  9. Documented имена частей own-payload.bin.001/.002... проверяются реально через Файл и размеры16/остаток; порядок для merge array задан explicit. Для merge mask набор предварительно доказывается точным количеством своих частей; именам свойственен lexicographic порядок с ведущими нулями.

  10. Native value-file fixture — сериализуемая реальная Структура из6полей: Версия1,ownUUID,Книга,Количество3,Цена250,Сумма750. ЗначениеВФайл даетBool, проверяем его; ЗначениеИзФайла возвращает actualтип, сверяем все поля/типы/расчет, не любое восстановленное значение.

  11. Настройки SaveValue/RestoreValue имеют область именно текущая параИБ-пользователь. Создается один новый namespace OwnGlobalIO85:<ownUUID> после проверки отсутствия; последующая отдельная команда меняет только доказанную own v3/750 наv4/1000. Никакого перечисления/очистки всех пользовательских настроек нет.

  12. Все созданные собственные files/parts/wrong-order-output и свой namespace сохраняются после ВАШЕГО ручного опыта для контроля. Автоматического/рекурсивного удаления или очистки настроек нет; повторный overwrite не допускается.

  13. При ожидании callback не закрывайте форму/клиент; Занято85 блокирует вторую команду. Completion native tempdir имеет2параметра, error callback3в правильном порядке. Каталог из callback сверяется с реальным native temp, не становится произвольным input-путем.

  14. 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 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

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

  1. Проверьте свой пустой Windows-стенд и создайте fresh native-temp UUID root. Перед исходным файлом доказывается отсутствие; файл содержит только собственный UTF8 payload.

  2. Создайте новую пустую parts-папку. РазделитьФайл(actual own source,16,parts) возвращает массив; count сверяется с округлением фактического числаБАЙТ, содержимое массива не трактуется как неподтвержденный тип.

  3. Имена .001... соответствуют native документации; создаем проверенный ordered array путей из этого правила и подтверждаем actual существование/тип/размер каждого файла.

  4. Parts-folder содержит ровно ожидаемые свои части, никаких дополнительных файлов перед wildcard merge. Outputs array/mask обязаны отсутствовать.

  5. ОбъединитьФайлы(array,path) сохраняет explicit порядок; ОбъединитьФайлы(mask,path) сортирует возрастающие имена. С padded числовыми суффиксами оба восстанавливают исходные bytes.

  6. Проверяйте actual размер и Base64 целого нового файла. Разрез внутри многобайтной UTF8 буквы допустим только потому, что файл объединяется до декодирования.

  7. Третий собственный output создается из reversed array. Native merge не обязан знать правильность порядка; наш exact-byte контроль обязан отказаться. Ошибка бизнес-целостности не приписывается native исключению.

  8. Итог после обоих положительных маршрутов и отрицательного reversed-order теста. Parts/files остаются в своей UUID-папке, ничего не удаляется.

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

  1. Пройдены собственные positive данные/actualтип/schema/UUID, не только непустые объекты или отсутствие исключений.

  2. Native аргументы/returns/context совпадают со справкой8.5.1.1343; неоднозначный result не угадывается.

  3. Own absolute root/namespace проверяется до writes; unknown/overwrite/fallback-success не допускается.

  4. Все изменения только при будущем ВАШЕМ ручном опыте в новом стенде. Actualfiles/settings/1C/network0, ничего автоматически не удаляем.

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

Реальные свои parts16/остаток, array/mask exact-byte roundtrip и отказ reversed-order нашим контролем. Ни один foreign file или глобальная wildcard-папка не используется.

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

  1. ЗначениеВФайл/ИзФайла — внутренний native формат, не человекочитаемыйJSON. Здесь сохранение и schema readback выполняются только для own записи.

  2. РазделитьФайл работает сбайтами; ОбъединитьФайлы не проверяет смысл порядка. СохранитьЗначение хранит значение по пареИБ-пользователь, а не по произвольному глобальномуключу всей системы.

  3. Прямой actual запуск здесь не выполнялся. Ложь/Undefined/неверная schema не маскируются успехом или новым default-object.

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

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

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

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

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