На своей будущей новой конфигурации с одним справочником и одним документом задать непустой список только одного объекта для стандартного интерфейса OData. Новое чтение проверяет реальные описания и полные имена; на нормальном пути исходное членство восстанавливается и читается заново.
Где и как запускать
Тонкий управляемый клиент собственной новой File ИБ 8.5.1.1343; native функции OData и метаданные используются только на сервере собственной формы/общего модуля.
Подготовка
Только будущая новая одноразовая Windows VM и новая пустая File ИБ C:\1c-labs\OwnOData2_5c925f2b-ef3d-467c-b5fd-9a3e563dc3b2\IB. Сейчас VM/ИБ/CF не создавались и 1С не запускалась. Не применять код к рабочим базам, текущим учетным записям и чужим метаданным.
В новой CF: Имя УчебныйСоставOData85; Версия OwnOData2_c55085b8-5bc3-4a7f-b3bc-cf6e294ab0fb; платформа 8.5.1.1343, русский встроенный язык, управляемое приложение, совместимость НеИспользовать. Единственный собственный пользователь и одна роль УчебныйСоставOData85Администратор с полными правами своей лаборатории. Это консервативная подготовка, не доказанное минимальное требование этих функций.
Создайте только один справочник УчебныеТоварыOData85 и один документ УчебныйЗаказOData85, без дополнительных реквизитов, табличных частей, движений и обработчиков. Оба остаются пустыми: пример работает с описаниями метаданных, а не создает/читает/записывает прикладные записи. Без других объектов данных, расширений, фоновых заданий, подписок, общих реквизитов, внешних соединений и параллельных сеансов.
Общие → Общие модули → УчебныйСоставODataСервер85: Глобальный = Нет; Сервер = Да; ВызовСервера = Нет; Клиент (управляемое приложение), Клиент (обычное приложение), ВнешнееСоединение, Привилегированный = Нет; ПовторноеИспользованиеВозвращаемыхЗначений = НеИспользовать. Вставьте целиком блок «УчебныйСоставODataСервер85» ниже. Общий модуль вызывается из серверного метода своей формы, не прямо с клиента.
Общие → Общие формы → УчебныйСоставOData85: управляемая форма. Реквизиты Согласие85 / Булево / исходно Ложь, Остановка85 / Булево / исходно Ложь и Протокол85 / неограниченная Строка. Согласие85 — флажок «Разрешаю изменить состав интерфейса новой лаборатории»; Остановка85 скрыт; Протокол85 — многострочное поле только просмотра. СохранениеДанныхВНастройках = НеИспользовать и АвтоматическоеСохранениеДанныхВНастройках = НеИспользовать задайте вручную, как значения перечислений, не Булево.
Создайте собственную команду НастроитьУчебныйСостав85 с одноименным действием и настоящую кнопку. Основной код вставьте целиком в модуль формы. ПриСозданииНаСервере свяжите с одноименным штатным обработчиком, сохранив Отказ и СтандартнаяОбработка; у обработчика команды сохраните параметр Команда.
Конфигурация → Открыть модуль управляемого приложения: вставьте полностью отдельный блок «УправляемоеПриложение» ниже. В будущем проверьте собственную конфигурацию, обновите свою новую базу и запустите тонкий клиент. Открытие формы только показывает предупреждение; состав интерфейса не меняется.
Строку регистрации этой учебной ИБ подготовьте именно File="C:\1c-labs\OwnOData2_5c925f2b-ef3d-467c-b5fd-9a3e563dc3b2\IB";. Код проверяет этот конкретный вид записи; другой формат дает остановку, а не исправляется автоматически. Это не универсальное обещание формата native API и не доказательство владения.
Не публикуйте базу на веб-сервере, не создавайте HTTP-сервис, не вводите URL или токен и не выполняйте сетевых запросов. Состав интерфейса не равен правам пользователей, настройке безопасности или проверке работоспособности опубликованного OData. В двух native страницах нет явного ограничения File ИБ/требования веб-публикации; работа File ИБ здесь запуском не подтверждена.
Прочитайте предупреждение, подтвердите согласие и один раз нажмите команду. Сервер расходует согласие и останавливает текущую форму до получения состава и создания своих массивов. Обычно выбирается список только из каталога; если такой исходный список уже был, выбирается только документ. Непустое учебное членство должно реально отличаться от исходного.
В нормальном ходе новый состав проверяется настоящим чтением, затем восстанавливается фактический исходный набор и проверяется снова. Протокол показывает реальные количества, полные имена и флаги включения каталога/документа. Порядок не обещан; восстановление означает то же членство, не тот же порядок.
Любая ошибка означает остановку без последующих 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");
#Иначе
ВызватьИсключение "Запускайте собственную лабораторию в тонком управляемом клиенте";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Подготовить новую пустую собственную лабораторию, два объекта метаданных, роль, форму и все три полных модуля. Ничего не публиковать и не добавлять прикладные записи.
В настоящем открытии формы прочитать предупреждение. Явно подтвердить изменение; сервер расходует согласие до первого получения состава и своей рабочей коллекции.
Получить реальные описания своего каталога и документа; проверить весь исходный состав, типы и отсутствие дубликатов/чужих значений. Сохранить собственный массив исходных описаний.
Построить непустой список одного объекта с отличающимся членством; установить состав как процедуру без присваивания результата. Новое чтение должно вернуть именно этот фактический объект и его полное имя.
На нормальном пути установить исходный фактический список и подтвердить все восстановленное членство новым чтением. Показать реальный протокол; после ошибки новых изменений не выполнять.
Как проверить результат
До команды флажок согласия снят, состав не меняется. Перед первой операцией в серверной функции согласие сбрасывается, Остановка85 устанавливается в Истина; повтор текущей формы запрещен.
Исходное значение Get — настоящий Массив только из0..2 собственных описаний без дубликатов. Тип каждого элемента сравнивается с типом удержанного настоящего описания, а сам элемент — с этим описанием; заголовок справки не превращается в выдуманное имя типа.
Учебный массив имеет один объект и реально другое членство. Новое Get подтверждает ровно один выбранный объект: каталог включен и документ исключен либо наоборот. ПолноеИмя и оба флага в протоколе получены фактически.
После нормального восстановления новое Get содержит точно исходные свои объекты, без чужих значений и дубликатов. Количество и оба фактических флага совпадают с исходным снимком; порядок элементов не является условием.
Ошибку типов, отказ API или несовпадение состава не считать успехом. Сейчас работа в 1С не проверялась; особенно проверьте собственную File ИБ и права в будущей одноразовой лаборатории. Сетевой доступ OData не проверяется этим уроком.
Ожидаемый результат
Ожидаемый будущий результат: в собственной новой лаборатории состав OData временно содержит один реальный выбранный объект с новым членством; отдельное чтение подтверждает полное восстановление исходного набора. Протокол содержит фактические количества, имена и флаги, без веб-публикации и работы с прикладными данными.
На что обратить внимание
Get возвращает описания метаданных, а не ссылки на записи. Set требует один Массив описаний и/или имен и не имеет документированного возвращаемого результата. В этом уроке используются только настоящие удержанные собственные описания.
Native OData доступен на сервере, в толстом клиенте, внешнем соединении и интеграции; прямого вызова в тонком или мобильном клиенте нет. Клиент вызывает свой серверный метод формы, который обращается к своему серверному общему модулю.
В совместимости8.3.4 Get возвращает все доступные для включения объекты. Здесь нужна новая CF с совместимостью НеИспользовать; исходный состав и порядок не предполагаются по умолчанию.
Меняется состав интерфейса базы, а не только локальный массив. Ни минимальные права, ни сохранение на заданный срок, ни область только текущего сеанса, ни HTTP-доступность не объявляются доказанными.
Имена, путь, версия и проверки схемы не доказывают владение. Подготовку выполняет владелец новой одноразовой лаборатории. Восстановление предусмотрено лишь на нормальном пути; после ошибки нет повторов/очистки/автоматического отката.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.