OData: изменить список своих объектов и проверить восстановление исходного состава

Учебные задачи

На своей будущей новой конфигурации с одним справочником и одним документом задать непустой список только одного объекта для стандартного интерфейса OData. Новое чтение проверяет реальные описания и полные имена; на нормальном пути исходное членство восстанавливается и читается заново.

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

Тонкий управляемый клиент собственной новой File ИБ 8.5.1.1343; native функции OData и метаданные используются только на сервере собственной формы/общего модуля.

Подготовка

  1. Только будущая новая одноразовая Windows VM и новая пустая File ИБ C:\1c-labs\OwnOData2_5c925f2b-ef3d-467c-b5fd-9a3e563dc3b2\IB. Сейчас VM/ИБ/CF не создавались и 1С не запускалась. Не применять код к рабочим базам, текущим учетным записям и чужим метаданным.

  2. В новой CF: Имя УчебныйСоставOData85; Версия OwnOData2_c55085b8-5bc3-4a7f-b3bc-cf6e294ab0fb; платформа 8.5.1.1343, русский встроенный язык, управляемое приложение, совместимость НеИспользовать. Единственный собственный пользователь и одна роль УчебныйСоставOData85Администратор с полными правами своей лаборатории. Это консервативная подготовка, не доказанное минимальное требование этих функций.

  3. Создайте только один справочник УчебныеТоварыOData85 и один документ УчебныйЗаказOData85, без дополнительных реквизитов, табличных частей, движений и обработчиков. Оба остаются пустыми: пример работает с описаниями метаданных, а не создает/читает/записывает прикладные записи. Без других объектов данных, расширений, фоновых заданий, подписок, общих реквизитов, внешних соединений и параллельных сеансов.

  4. Общие → Общие модули → УчебныйСоставODataСервер85: Глобальный = Нет; Сервер = Да; ВызовСервера = Нет; Клиент (управляемое приложение), Клиент (обычное приложение), ВнешнееСоединение, Привилегированный = Нет; ПовторноеИспользованиеВозвращаемыхЗначений = НеИспользовать. Вставьте целиком блок «УчебныйСоставODataСервер85» ниже. Общий модуль вызывается из серверного метода своей формы, не прямо с клиента.

  5. Общие → Общие формы → УчебныйСоставOData85: управляемая форма. Реквизиты Согласие85 / Булево / исходно Ложь, Остановка85 / Булево / исходно Ложь и Протокол85 / неограниченная Строка. Согласие85 — флажок «Разрешаю изменить состав интерфейса новой лаборатории»; Остановка85 скрыт; Протокол85 — многострочное поле только просмотра. СохранениеДанныхВНастройках = НеИспользовать и АвтоматическоеСохранениеДанныхВНастройках = НеИспользовать задайте вручную, как значения перечислений, не Булево.

  6. Создайте собственную команду НастроитьУчебныйСостав85 с одноименным действием и настоящую кнопку. Основной код вставьте целиком в модуль формы. ПриСозданииНаСервере свяжите с одноименным штатным обработчиком, сохранив Отказ и СтандартнаяОбработка; у обработчика команды сохраните параметр Команда.

  7. Конфигурация → Открыть модуль управляемого приложения: вставьте полностью отдельный блок «УправляемоеПриложение» ниже. В будущем проверьте собственную конфигурацию, обновите свою новую базу и запустите тонкий клиент. Открытие формы только показывает предупреждение; состав интерфейса не меняется.

  8. Строку регистрации этой учебной ИБ подготовьте именно File="C:\1c-labs\OwnOData2_5c925f2b-ef3d-467c-b5fd-9a3e563dc3b2\IB";. Код проверяет этот конкретный вид записи; другой формат дает остановку, а не исправляется автоматически. Это не универсальное обещание формата native API и не доказательство владения.

  9. Не публикуйте базу на веб-сервере, не создавайте HTTP-сервис, не вводите URL или токен и не выполняйте сетевых запросов. Состав интерфейса не равен правам пользователей, настройке безопасности или проверке работоспособности опубликованного OData. В двух native страницах нет явного ограничения File ИБ/требования веб-публикации; работа File ИБ здесь запуском не подтверждена.

  10. Прочитайте предупреждение, подтвердите согласие и один раз нажмите команду. Сервер расходует согласие и останавливает текущую форму до получения состава и создания своих массивов. Обычно выбирается список только из каталога; если такой исходный список уже был, выбирается только документ. Непустое учебное членство должно реально отличаться от исходного.

  11. В нормальном ходе новый состав проверяется настоящим чтением, затем восстанавливается фактический исходный набор и проверяется снова. Протокол показывает реальные количества, полные имена и флаги включения каталога/документа. Порядок не обещан; восстановление означает то же членство, не тот же порядок.

  12. Любая ошибка означает остановку без последующих Set, очистки, повторов и отката. Собственная лаборатория может остаться с измененным составом. Не обходите Остановка85 и не используйте повторный вызов для восстановления. Для следующего опыта нужна отдельно подготовленная новая лаборатория. Атомарность, конкурентная защита, срок хранения настройки и восстановление после ошибки не обещаются.

&НаСервере
Процедура ПроверитьСтенд85()
    Система = Новый СистемнаяИнформация;
    Если ТипЗнч(Система) <> Тип("СистемнаяИнформация") Тогда
        ВызватьИсключение "Нужна собственная лаборатория на платформе 8.5.1.1343";
    КонецЕсли;
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnOData2_5c925f2b-ef3d-467c-b5fd-9a3e563dc3b2\IB"";" Или ИмяФормы <> "ОбщаяФорма.УчебныйСоставOData85" Тогда
        ВызватьИсключение "Нужна только своя новая одноразовая база и форма";
    КонецЕсли;
    Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Документы.Количество() <> 1
        Или ТипЗнч(Согласие85) <> Тип("Булево") Или ТипЗнч(Остановка85) <> Тип("Булево") Или ТипЗнч(Протокол85) <> Тип("Строка") Тогда
        ВызватьИсключение "Не совпала собственная подготовка конфигурации и формы";
    КонецЕсли;
    Если Остановка85 Тогда
        ВызватьИсключение "Текущая форма уже остановлена; повтор запрещен";
    КонецЕсли;
КонецПроцедуры

&НаСервере
Функция НастроитьСоставНаСервере85()
    ПроверитьСтенд85();
    Если Не Согласие85 Тогда
        ВызватьИсключение "Сначала разрешите изменение состава интерфейса своей новой лаборатории";
    КонецЕсли;
    Согласие85 = Ложь;
    Остановка85 = Истина;
    Каталог = Метаданные.Справочники.Найти("УчебныеТоварыOData85");
    Документ = Метаданные.Документы.Найти("УчебныйЗаказOData85");
    Если Каталог = Неопределено Или Документ = Неопределено Или Каталог = Документ Тогда
        ВызватьИсключение "Не получены два собственных описания метаданных";
    КонецЕсли;
    Если ТипЗнч(Каталог.ПолноеИмя()) <> Тип("Строка") Или Каталог.ПолноеИмя() <> "Справочник.УчебныеТоварыOData85"
        Или ТипЗнч(Документ.ПолноеИмя()) <> Тип("Строка") Или Документ.ПолноеИмя() <> "Документ.УчебныйЗаказOData85" Тогда
        ВызватьИсключение "Не совпали реальные имена собственных метаданных";
    КонецЕсли;
    Исходный = УчебныйСоставODataСервер85.ПроверитьСостав85(ПолучитьСоставСтандартногоИнтерфейсаOData(), Каталог, Документ);
    Разрешенный = Каталог;
    Если Исходный.КаталогЕсть И Не Исходный.ДокументЕсть Тогда
        Разрешенный = Документ;
    КонецЕсли;
    Разрешенные = Новый Массив;
    Разрешенные.Добавить(Разрешенный);
    План = УчебныйСоставODataСервер85.ПроверитьСостав85(Разрешенные, Каталог, Документ);
    Если План.Объекты.Количество() <> 1 Или План.КаталогЕсть = Исходный.КаталогЕсть И План.ДокументЕсть = Исходный.ДокументЕсть Тогда
        ВызватьИсключение "Нужен непустой список из одного собственного объекта с новым членством";
    КонецЕсли;
    УстановитьСоставСтандартногоИнтерфейсаOData(Разрешенные);
    Учебный = УчебныйСоставODataСервер85.ПроверитьСостав85(ПолучитьСоставСтандартногоИнтерфейсаOData(), Каталог, Документ);
    Если Учебный.Объекты.Количество() <> 1 Или Учебный.КаталогЕсть <> План.КаталогЕсть Или Учебный.ДокументЕсть <> План.ДокументЕсть Тогда
        ВызватьИсключение "Свежий фактический состав не совпал с собственным списком";
    КонецЕсли;
    УстановитьСоставСтандартногоИнтерфейсаOData(Исходный.Объекты);
    Восстановленный = УчебныйСоставODataСервер85.ПроверитьСостав85(ПолучитьСоставСтандартногоИнтерфейсаOData(), Каталог, Документ);
    Если Восстановленный.Объекты.Количество() <> Исходный.Объекты.Количество()
        Или Восстановленный.КаталогЕсть <> Исходный.КаталогЕсть Или Восстановленный.ДокументЕсть <> Исходный.ДокументЕсть Тогда
        ВызватьИсключение "Исходный состав не подтвержден новым чтением";
    КонецЕсли;
    Возврат "Исходный состав: " + Строка(Исходный.Объекты.Количество()) + " / " + Исходный.Представление
        + Символы.ПС + "Учебный состав: " + Строка(Учебный.Объекты.Количество()) + " / " + Учебный.Представление
        + Символы.ПС + "Включен каталог: " + Строка(Учебный.КаталогЕсть) + "; включен документ: " + Строка(Учебный.ДокументЕсть)
        + Символы.ПС + "Восстановленный состав: " + Строка(Восстановленный.Объекты.Количество()) + " / " + Восстановленный.Представление;
КонецФункции

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если ТипЗнч(Отказ) <> Тип("Булево") Или ТипЗнч(СтандартнаяОбработка) <> Тип("Булево") Тогда
        ВызватьИсключение "Неверные штатные параметры создания формы";
    КонецЕсли;
    Если Отказ Тогда
        Возврат;
    КонецЕсли;
    Попытка
        ПроверитьСтенд85();
        Протокол85 = "Будет изменен состав OData только новой собственной лаборатории, затем на нормальном пути восстановлен исходный. После ошибки состав может остаться измененным. Публикация и HTTP не выполняются.";
    Исключение
        Остановка85 = Истина;
        Отказ = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура НастроитьУчебныйСостав85(Команда)
    Если ТипЗнч(Остановка85) <> Тип("Булево") Или Остановка85 Тогда
        ВызватьИсключение "Повтор в текущей форме запрещен";
    КонецЕсли;
    Попытка
        Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> "НастроитьУчебныйСостав85" Или Команда.Действие <> "НастроитьУчебныйСостав85" Тогда
            ВызватьИсключение "Нужна настоящая собственная команда формы";
        КонецЕсли;
        Протокол = НастроитьСоставНаСервере85();
        Если ТипЗнч(Протокол) <> Тип("Строка") Тогда
            ВызватьИсключение "Не получен проверенный строковый результат";
        КонецЕсли;
        Протокол85 = Протокол;
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры
Проверить весь собственный состав и собрать фактический снимок

Общие → Общие модули → УчебныйСоставODataСервер85 → Модуль

Сервер; общий модуль своей новой конфигурации, ВызовСервера = Нет

Функция ПроверитьСостав85(Состав, Каталог, Документ) Экспорт
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnOData2_5c925f2b-ef3d-467c-b5fd-9a3e563dc3b2\IB"";" Тогда
        ВызватьИсключение "Проверять можно только собственную новую лабораторию";
    КонецЕсли;
    Если Каталог = Неопределено Или Документ = Неопределено
        Или Каталог <> Метаданные.Справочники.Найти("УчебныеТоварыOData85") Или Документ <> Метаданные.Документы.Найти("УчебныйЗаказOData85") Тогда
        ВызватьИсключение "Нужны только настоящие собственные описания метаданных";
    КонецЕсли;
    Если ТипЗнч(Состав) <> Тип("Массив") Тогда
        ВызватьИсключение "Состав должен быть настоящим массивом";
    КонецЕсли;
    Если Состав.Количество() > 2 Тогда
        ВызватьИсключение "В собственной конфигурации допускаются только два описания";
    КонецЕсли;
    Объекты = Новый Массив;
    Снимок = Новый Структура("Объекты,КаталогЕсть,ДокументЕсть,Представление", Объекты, Ложь, Ложь, "");
    Для Каждого Элемент Из Состав Цикл
        Если ТипЗнч(Элемент) = ТипЗнч(Каталог) И Элемент = Каталог И Не Снимок.КаталогЕсть Тогда
            Снимок.КаталогЕсть = Истина;
        ИначеЕсли ТипЗнч(Элемент) = ТипЗнч(Документ) И Элемент = Документ И Не Снимок.ДокументЕсть Тогда
            Снимок.ДокументЕсть = Истина;
        Иначе
            ВызватьИсключение "Неверный тип, чужое описание или повтор в фактическом составе";
        КонецЕсли;
        Имя = Элемент.ПолноеИмя();
        Если ТипЗнч(Имя) <> Тип("Строка") Тогда
            ВызватьИсключение "Не получено фактическое полное имя";
        КонецЕсли;
        Объекты.Добавить(Элемент);
        Снимок.Представление = Снимок.Представление + Имя + "; ";
    КонецЦикла;
    Если Объекты.Количество() <> Состав.Количество() Тогда
        ВызватьИсключение "Не проверен весь состав";
    КонецЕсли;
    Возврат Снимок;
КонецФункции
Проверить версию и штатно открыть собственную форму

Конфигурация → Открыть модуль управляемого приложения

Тонкий управляемый клиент

Процедура ПриНачалеРаботыСистемы()
    Система = Новый СистемнаяИнформация;
    Если ТипЗнч(Система) <> Тип("СистемнаяИнформация") Тогда
        ВызватьИсключение "Нужна платформа 8.5.1.1343";
    КонецЕсли;
    #Если ТонкийКлиент Тогда
        ОткрытьФорму("ОбщаяФорма.УчебныйСоставOData85");
    #Иначе
        ВызватьИсключение "Запускайте собственную лабораторию в тонком управляемом клиенте";
    #КонецЕсли
КонецПроцедуры

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

  1. Подготовить новую пустую собственную лабораторию, два объекта метаданных, роль, форму и все три полных модуля. Ничего не публиковать и не добавлять прикладные записи.

  2. В настоящем открытии формы прочитать предупреждение. Явно подтвердить изменение; сервер расходует согласие до первого получения состава и своей рабочей коллекции.

  3. Получить реальные описания своего каталога и документа; проверить весь исходный состав, типы и отсутствие дубликатов/чужих значений. Сохранить собственный массив исходных описаний.

  4. Построить непустой список одного объекта с отличающимся членством; установить состав как процедуру без присваивания результата. Новое чтение должно вернуть именно этот фактический объект и его полное имя.

  5. На нормальном пути установить исходный фактический список и подтвердить все восстановленное членство новым чтением. Показать реальный протокол; после ошибки новых изменений не выполнять.

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

  1. До команды флажок согласия снят, состав не меняется. Перед первой операцией в серверной функции согласие сбрасывается, Остановка85 устанавливается в Истина; повтор текущей формы запрещен.

  2. Исходное значение Get — настоящий Массив только из0..2 собственных описаний без дубликатов. Тип каждого элемента сравнивается с типом удержанного настоящего описания, а сам элемент — с этим описанием; заголовок справки не превращается в выдуманное имя типа.

  3. Учебный массив имеет один объект и реально другое членство. Новое Get подтверждает ровно один выбранный объект: каталог включен и документ исключен либо наоборот. ПолноеИмя и оба флага в протоколе получены фактически.

  4. После нормального восстановления новое Get содержит точно исходные свои объекты, без чужих значений и дубликатов. Количество и оба фактических флага совпадают с исходным снимком; порядок элементов не является условием.

  5. Ошибку типов, отказ API или несовпадение состава не считать успехом. Сейчас работа в 1С не проверялась; особенно проверьте собственную File ИБ и права в будущей одноразовой лаборатории. Сетевой доступ OData не проверяется этим уроком.

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

Ожидаемый будущий результат: в собственной новой лаборатории состав OData временно содержит один реальный выбранный объект с новым членством; отдельное чтение подтверждает полное восстановление исходного набора. Протокол содержит фактические количества, имена и флаги, без веб-публикации и работы с прикладными данными.

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

  1. Get возвращает описания метаданных, а не ссылки на записи. Set требует один Массив описаний и/или имен и не имеет документированного возвращаемого результата. В этом уроке используются только настоящие удержанные собственные описания.

  2. Native OData доступен на сервере, в толстом клиенте, внешнем соединении и интеграции; прямого вызова в тонком или мобильном клиенте нет. Клиент вызывает свой серверный метод формы, который обращается к своему серверному общему модулю.

  3. В совместимости8.3.4 Get возвращает все доступные для включения объекты. Здесь нужна новая CF с совместимостью НеИспользовать; исходный состав и порядок не предполагаются по умолчанию.

  4. Меняется состав интерфейса базы, а не только локальный массив. Ни минимальные права, ни сохранение на заданный срок, ни область только текущего сеанса, ни HTTP-доступность не объявляются доказанными.

  5. Имена, путь, версия и проверки схемы не доказывают владение. Подготовку выполняет владелец новой одноразовой лаборатории. Восстановление предусмотрено лишь на нормальном пути; после ошибки нет повторов/очистки/автоматического отката.

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

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

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

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

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