Проверить два обычных интерфейса и принадлежность табличной части

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

Сравним переключаемый и постоянный интерфейсы и убедимся, что собственная табличная часть действительно принадлежит документу, а её поле — части. Это аудит описаний без создания документов.

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

Полный обычный клиентский общий модуль УчебныеСтруктуры85, только толстый клиент; полный модуль своей формы отдельным блоком. Не выполнялся.

Подготовка

  1. Создайте НОВУЮ отдельную файловую учебную базу 8.5.1.1343 с именем конфигурации УчебныеСтруктуры85, совместимость НеИспользовать, обычное приложение и толстый клиент. Никаких рабочих данных, подключений, подписок или регламентных заданий. Здесь база, подготовка и код не выполнялись: runtimeVerifiedScenarios=0.

  2. Общий модуль УчебныеСтруктуры85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, Привилегированный=Нет, прочие клиентские флаги=Нет. Вставьте полный основной модуль одного выбранного урока. Для следующего урока заменяйте весь текст, поскольку точка входа одинакова.

  3. Создайте обработку УчебныеСтруктуры85, обычную основную форму Пульт, кнопку Выполнить с действием ВыполнитьНажатие. Полный модуль формы приведён отдельным блоком ниже. После подготовки выполните F7 и обновите только собственный стенд; документы не создавайте и не проводите.

  4. Общие → Интерфейсы: УчебныйПереключаемый85, Переключаемый=Да, и УчебныйПостоянный85, Переключаемый=Нет. Синонимы Учебный переключаемый/Учебный постоянный, комментарии guide-switchable-85/guide-always-85. Это обычные интерфейсы, не подсистемы управляемого приложения. Не назначайте интерфейс чужому пользователю.

  5. Документы → УчебныйДокумент85: проведение Разрешить, модуль объекта пустой. Реквизит Ключ85, только Строка(20), переменная длина. Табличная часть Строки85, синоним Учебные строки, комментарий guide-section-85; единственный реквизит Название85, только Строка(40). Движения включают два собственных регистра, описанных далее; код проведения не пишите.

  6. Регистры накопления → УчебныеОстатки85, вид Остатки, измерение Ключ85 только Строка(20), ресурс Количество85 только Число(10,0). Регистратор только УчебныйДокумент85. Последовательности → УчебнаяОчередь85: Документы только УчебныйДокумент85, Движения только УчебныеОстатки85, перемещение границы НеПеремещать. Измерение Ключ85 только Строка(20). В настройке соответствия документам выберите реквизит Ключ85 своего документа; в соответствии движениям — измерение Ключ85 своего регистра накопления. Никаких записей, границ или восстановлений последовательности урок не создаёт.

  7. Планы видов расчёта → УчебныеНачисления85: период действия выключен, зависимость НеИспользовать, без базовых планов, предопределённых видов и кода. Регистры расчёта → УчебныйРасчет85: план УчебныеНачисления85, периодичность Месяц, период действия и базовый период выключены, измерение Ключ85 Строка(20), ресурс Результат85 Число(12,2), регистратор УчебныйДокумент85. Перерасчеты → Очередь85: режим блокировок Автоматический, одно измерение Ключ85, ИзмерениеРегистра=Ключ85 родительского регистра; данные ведущих регистров пустые, модуль набора пустой. Это определения, не расчёт зарплаты.

  8. Для урока CFE только в Конфигураторе своего стенда подготовьте собственное новое расширение УчебноеРасширение85 с префиксом Уч85_ и одним собственным справочником Уч85_Заметки, синоним Учебные заметки. Без заимствованных объектов, модулей, подписок и заданий. Сохраните ЕГО в локальный файл C:\1CStudy85\УчебноеРасширение85.cfe через команду сохранения расширения; папку создайте самостоятельно. Не применяйте расширение к конфигурации базы и не активируйте. Этот файл не приложен и здесь не создавался; код читает только файл, конструктор не устанавливает расширение.

  9. Будущий запуск — только Пульт своего толстого клиента. Отчёт открывается в новом табличном документе в памяти; не печатайте и не сохраняйте через команды окна. Статический аудит структуры не подтверждает расчёты, проведение, границы последовательности или применение расширения.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойКонтекст();
    Паспорт = СоздатьСвоюТаблицу();
    Имена = Новый Массив;
    Имена.Добавить("УчебныйПереключаемый85");
    Имена.Добавить("УчебныйПостоянный85");
    Для Каждого Имя Из Имена Цикл
        МДИнтерфейса = Метаданные.Интерфейсы.Найти(Имя);
        Если МДИнтерфейса = Неопределено Тогда
            ВызватьИсключение "Не найден свой обычный интерфейс";
        КонецЕсли;
        ДобавитьСвойПаспорт(Паспорт, МДИнтерфейса, Имя, Метаданные);
        Если МДИнтерфейса.Интерфейс <> Неопределено Тогда
            ВызватьИсключение "Свойство Интерфейс не возвращает объект меню";
        КонецЕсли;
        ОжидаемыйФлаг = Имя = "УчебныйПереключаемый85";
        Если МДИнтерфейса.Переключаемый <> ОжидаемыйФлаг Тогда
            ВызватьИсключение "Не совпала настройка переключаемости собственного интерфейса";
        КонецЕсли;
        ДобавитьСтроку(Паспорт, МДИнтерфейса.ПолноеИмя(), "Переключаемый", МДИнтерфейса.Переключаемый);
        ДобавитьСтроку(Паспорт, МДИнтерфейса.ПолноеИмя(), "Интерфейс: ожидается Неопределено", МДИнтерфейса.Интерфейс);
    КонецЦикла;
    МДДокумента = Метаданные.Документы.Найти("УчебныйДокумент85");
    Если МДДокумента = Неопределено Тогда
        ВызватьИсключение "Не найден собственный документ";
    КонецЕсли;
    МДЧасти = МДДокумента.ТабличныеЧасти.Найти("Строки85");
    Если МДЧасти = Неопределено Тогда
        ВызватьИсключение "Не найдена собственная табличная часть";
    КонецЕсли;
    ДобавитьСвойПаспорт(Паспорт, МДЧасти, "Строки85", МДДокумента);
    Поле = МДЧасти.Реквизиты.Найти("Название85");
    Если Поле = Неопределено Или МДЧасти.Реквизиты.Количество() <> 1 Тогда
        ВызватьИсключение "Табличная часть должна содержать одно собственное поле Название85";
    КонецЕсли;
    Если Поле.Родитель() <> МДЧасти Или Не Поле.Тип.СодержитТип(Тип("Строка")) Тогда
        ВызватьИсключение "Не совпал родитель или тип реквизита своей табличной части";
    КонецЕсли;
    ДобавитьСтроку(Паспорт, МДЧасти.ПолноеИмя(), "Поле своего определения", Поле.ПолноеИмя());
    ДобавитьСтроку(Паспорт, МДЧасти.ПолноеИмя(), "Описание типа поля", Поле.Тип);
    ПоказатьСвойПаспорт(Паспорт, "Свои интерфейсы и табличная часть без бизнес-объектов");
КонецПроцедуры

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

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

Процедура ДобавитьСтроку(Таблица, Объект, Свойство, Значение)
    СтрокаПаспорта = Таблица.Добавить();
    СтрокаПаспорта.Объект = Объект;
    СтрокаПаспорта.Свойство = Свойство;
    СтрокаПаспорта.Значение = Строка(Значение);
КонецПроцедуры

Функция СоздатьСвоюТаблицу()
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Объект");
    Таблица.Колонки.Добавить("Свойство");
    Таблица.Колонки.Добавить("Значение");
    Возврат Таблица;
КонецФункции

Процедура ПоказатьСвойПаспорт(Таблица, Заголовок)
    Если Таблица.Количество() = 0 Тогда
        ВызватьИсключение "Собственный паспорт пуст";
    КонецЕсли;
    Документ = Новый ТабличныйДокумент;
    Документ.Область("R1C1").Текст = "Объект";
    Документ.Область("R1C2").Текст = "Свойство";
    Документ.Область("R1C3").Текст = "Значение";
    Номер = 2;
    Для Каждого Запись Из Таблица Цикл
        Документ.Область(Номер, 1).Текст = Запись.Объект;
        Документ.Область(Номер, 2).Текст = Запись.Свойство;
        Документ.Область(Номер, 3).Текст = Запись.Значение;
        Номер = Номер + 1;
    КонецЦикла;
    Документ.Показать(Заголовок, "", Истина);
КонецПроцедуры
УчебныеСтруктуры85.Пульт

УчебныеСтруктуры85 → Обработки → УчебныеСтруктуры85 → Формы → Пульт → Модуль

Полный модуль обычной формы собственного стенда; не выполнялся.

Процедура ВыполнитьНажатие(Кнопка)
    УчебныеСтруктуры85.ВыполнитьПример();
КонецПроцедуры

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

  1. ПроверитьСвойКонтекст требует точную 8.5.1.1343, свой стенд, отключённую совместимость и отсутствие активной транзакции. Работаем с описаниями, не бизнес-объектами.

  2. ДобавитьСвойПаспорт разделяет программное Имя, Синоним и Представление. ПолноеИмя нужно для отчёта, Родитель сравнивается с фактическим объектом, а не с подписью.

  3. ПринадлежностьОбъекта, РасширениеКонфигурации и ЕстьИзмененияРасширениямиКонфигурации проверяются отдельно. ОбъектРасширяемойКонфигурации выводится как привязка заимствования, не выдаётся за самостоятельную проверку отсутствия расширений.

  4. Отчёт показывается только после всех проверок. Показ табличного документа не является записью документа, проведением, перерасчётом или применением расширения.

  5. У обоих интерфейсов Интерфейс всегда Неопределено. Не вызываем у него методы меню; структура интерфейса этим свойством не возвращается.

  6. Переключаемый=Истина позволяет управлять отображением обычного интерфейса. Ложь означает, что он показывается всегда. Урок проверяет описание, не переключает интерфейс пользователя.

  7. ТабличныеЧасти принадлежат МДДокумента. Проверяем Родитель части именно как документ; у реквизита Название85 родитель именно найденная часть.

  8. Реквизиты определения не являются строками табличной части. Проверяется одно поле и строковый тип; строки документа и данные формы не создаются.

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

  1. Будущий тест: подготовить свой стенд, F7 и Выполнить в толстом клиенте. Проверить программные имена, подписи и фактические связи в новом отчёте; здесь запуск не проводился.

  2. Изменить в своей подготовке только Синоним: паспорт меняет подпись, но программный поиск не ломается. Изменить программное Имя без изменения урока: ожидается понятный отказ поиска.

  3. В будущем отчёте УчебныйПереключаемый85 имеет Истина, УчебныйПостоянный85 — Ложь, оба Интерфейс неопределены. Строки85 принадлежит УчебныйДокумент85.

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

  5. Добавить второй реквизит своей части: аудит должен отказать на составе. Вернуть одно Название85. Его одноимённый реквизит документа не может заменить реквизит табличной части.

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

Будущий результат — паспорт реальной структуры собственного определения и её проверенных связей. Бизнес-данные не записываются. Код не выполнялся в 1С: runtimeVerifiedScenarios=0.

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

  1. Метаданные — описания. Их наличие не доказывает существование записей базы, успешное проведение или отсутствие ошибок прикладного алгоритма.

  2. Readonly-свойства и коллекции не заменяются присваиванием. Подготовка через Конфигуратор относится только к новой собственной базе.

  3. Ни F7, ни выполнение BSL здесь не происходили. Сверка справки, Python-тесты и HTML-поиск не заменяют проверку в 1С.

  4. Обычный интерфейс не равен управляемому командному интерфейсу или подсистеме. Этот урок требует обычное приложение.

  5. Интерфейс=Неопределено не доказывает отсутствие определённого в Конфигураторе меню. Свойство не предоставляет такое значение встроенному языку.

  6. Собственный объект расширения тоже может иметь ПринадлежностьОбъекта.Собственный; поэтому проверка расширения и изменений выполняется дополнительно.

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

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

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

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

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