Собственная минимальная схема плана дает реальное readonly-описание стандартной части. Строим диагностический отчет, разбираем все настройки и типы полей, затем сравниваем одну системную часть схемы с нулем строк нового счета в памяти.
Где и как запускать
Полный серверный общий модуль УчебныеСтандартныеЧасти85 собственной конфигурации и отдельный полный клиент-серверный модуль формы. В1С не запускался.
Подготовка
НОВАЯ отдельная пустая файловая база платформы8.5.1.1343. Имя конфигурации УчебныеСтандартныеЧасти85, совместимость Не использовать, основной язык Русский. Не использовать БП/КА2/УТ/УНФ и другие рабочие базы. Это технический опыт метаданных, не настройка бухгалтерского учета.
Конфигуратор → Планы видов характеристик → Добавить → УчебныеАналитики85: тип значения характеристик только Строка30, без дополнительных реквизитов, табличных частей, элементов и предопределенных значений. Все модули оставить пустыми.
Конфигуратор → Планы счетов → Добавить → УчебныеСчета85. Длина кода10, длина наименования100, ВидыСубконто=ПланВидовХарактеристик.УчебныеАналитики85, максимальное количество субконто2. ВидыСубконто — стандартная часть платформы: не добавлять пользовательскую часть с таким же именем.
В собственном плане не создавать реквизиты, пользовательские табличные части, признаки учета, признаки учета субконто, счета, предопределенные счета, формы, макеты и команды. Модуль объекта и модуль менеджера вручную проверить: полностью пусты. Не создавать регистры бухгалтерии, подписки, задания, общие реквизиты и расширения; других прикладных объектов нет.
Общие модули → УчебныеСтандартныеЧасти85: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставить весь основной модуль. Собственная внешняя обработка → управляемая Форма → команда/кнопка Выполнить, действие Выполнить. Весь отдельный модуль формы приведен ниже. Будущая ручная подготовка: сохранить и обновить только собственную базу F7.
Комментарий, синоним, подсказку и проверку заполнения стандартной части не подменять BSL-присваиванием. Отчет читает фактические настройки собственной схемы; пустой текст допустим, точные локализованные подписи заранее не обещаются. Учебные счета и аналитики в базу вручную не вводить: созданный кодом счет остается в памяти.
Функция ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
ОписаниеПлана = Метаданные.ПланыСчетов.Найти("УчебныеСчета85");
Аналитики = Метаданные.ПланыВидовХарактеристик.Найти("УчебныеАналитики85");
Если ОписаниеПлана = Неопределено Или Аналитики = Неопределено Тогда
ВызватьИсключение "Подготовьте только собственные УчебныеСчета85 и УчебныеАналитики85";
КонецЕсли;
Если ОписаниеПлана.ВидыСубконто <> Аналитики Или ОписаниеПлана.МаксКоличествоСубконто <> 2
Или ОписаниеПлана.ДлинаКода <> 10 Или ОписаниеПлана.ДлинаНаименования <> 100
Или ОписаниеПлана.Реквизиты.Количество() <> 0 Или ОписаниеПлана.ТабличныеЧасти.Количество() <> 0
Или ОписаниеПлана.ПризнакиУчета.Количество() <> 0 Или ОписаниеПлана.ПризнакиУчетаСубконто.Количество() <> 0 Тогда
ВызватьИсключение "Схема собственного плана не соответствует подготовке";
КонецЕсли;
Части = ОписаниеПлана.СтандартныеТабличныеЧасти;
Если ТипЗнч(Части) <> Тип("ОписанияСтандартныхТабличныхЧастей") Тогда
ВызватьИсключение "Нужна настоящая коллекция описаний стандартных частей";
КонецЕсли;
СистемнаяЧасть = Неопределено;
КоличествоОписаний = 0;
Для Каждого Часть Из Части Цикл
КоличествоОписаний = КоличествоОписаний + 1;
Если Часть.Имя = "ВидыСубконто" Тогда
СистемнаяЧасть = Часть;
КонецЕсли;
КонецЦикла;
Если КоличествоОписаний <> 1 Или СистемнаяЧасть = Неопределено Тогда
ВызватьИсключение "Ожидается одно реальное описание ВидыСубконто собственного плана";
КонецЕсли;
Если ТипЗнч(СистемнаяЧасть) <> Тип("ОписаниеСтандартнойТабличнойЧасти")
Или Части[0].Имя <> СистемнаяЧасть.Имя Тогда
ВызватьИсключение "Не совпали native-тип описания и допустимый индекс0";
КонецЕсли;
Отчет = "СХЕМА СОБСТВЕННОГО ПЛАНА, НЕ СТРОКИ СЧЕТА" + Символы.ПС;
Отчет = Отчет + "Техническое имя: " + СистемнаяЧасть.Имя + Символы.ПС;
Отчет = Отчет + "Представление: " + СистемнаяЧасть.Представление() + Символы.ПС;
Отчет = Отчет + "Синоним: " + СистемнаяЧасть.Синоним + Символы.ПС;
Отчет = Отчет + "Комментарий: " + СистемнаяЧасть.Комментарий + Символы.ПС;
Отчет = Отчет + "Подсказка: " + СистемнаяЧасть.Подсказка + Символы.ПС;
Если СистемнаяЧасть.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку Тогда
Отчет = Отчет + "Настройка заполнения: ВыдаватьОшибку. Проверка объекта в этом опыте не выполнялась" + Символы.ПС;
ИначеЕсли СистемнаяЧасть.ПроверкаЗаполнения = ПроверкаЗаполнения.НеПроверять Тогда
Отчет = Отчет + "Настройка заполнения: НеПроверять. Это не разрешение любого бухгалтерского учета" + Символы.ПС;
Иначе
ВызватьИсключение "Получен неописанный вариант проверки заполнения";
КонецЕсли;
Поля = СистемнаяЧасть.СтандартныеРеквизиты;
Если ТипЗнч(Поля) <> Тип("ОписанияСтандартныхРеквизитов") Или Поля.Количество() = 0 Тогда
ВызватьИсключение "Описание должно содержать настоящие настройки стандартных полей";
КонецЕсли;
КоличествоПолей = 0;
Для Каждого Поле Из Поля Цикл
Если ТипЗнч(Поле) <> Тип("ОписаниеСтандартногоРеквизита") Тогда
ВызватьИсключение "Получено не описание стандартного реквизита";
КонецЕсли;
КоличествоПолей = КоличествоПолей + 1;
Отчет = Отчет + "Стандартное поле: " + Поле.Имя + "; описание типов: " + Строка(Поле.Тип) + Символы.ПС;
КонецЦикла;
Если КоличествоПолей <> Поля.Количество() Тогда
ВызватьИсключение "Счетчик обхода не совпал с количеством описаний полей";
КонецЕсли;
Счет = ПланыСчетов.УчебныеСчета85.СоздатьСчет();
Счет.Код = "85";
Счет.Наименование = "Свой незаписанный учебный счет";
СтрокиСчета = Счет.ВидыСубконто;
Если СтрокиСчета.Количество() <> 0 Тогда
ВызватьИсключение "В новом собственном счете неожиданно появились строки";
КонецЕсли;
Отчет = Отчет + "Свой счет: " + Счет.Код + " / " + Счет.Наименование + Символы.ПС;
Отчет = Отчет + "Описаний стандартных частей: " + Строка(КоличествоОписаний) + Символы.ПС;
Отчет = Отчет + "Описаний стандартных полей: " + Строка(КоличествоПолей) + Символы.ПС;
Отчет = Отчет + "Строк ВидыСубконто у своего нового счета: " + Строка(СтрокиСчета.Количество()) + Символы.ПС;
Отчет = Отчет + "Пользовательских табличных частей: " + Строка(ОписаниеПлана.ТабличныеЧасти.Количество()) + Символы.ПС;
Отчет = Отчет + "Изменен только свой новый объект в памяти. Записи, проводки и проверки заполнения не выполнялись";
Возврат Отчет;
КонецФункции
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 1 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 1 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыУчебныеСтандартныеЧасти85.Форма
Собственная внешняя обработка → управляемая Форма → Модуль
Полный отдельный модуль формы; на клиент возвращается только отчет. В1С не выполнялся.
&НаКлиенте
Процедура Выполнить(Команда)
Отчет = ВыполнитьНаСервере();
Сообщить(Отчет);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
Возврат УчебныеСтандартныеЧасти85.ВыполнитьПример();
КонецФункцииРазбор по шагам
Сначала проверяются состав собственной конфигурации, отсутствие расширений. Затем два Найти получают реальные объекты метаданных. Проверка Неопределено предшествует чтению их настроек; связь ВидыСубконто сравнивается с собственными метаданными плана характеристик, не со строкой имени.
СтандартныеТабличныеЧасти возвращает ОписанияСтандартныхТабличныхЧастей. В этой коллекции справка не описывает Найти, Получить и Количество. Поэтому счетчик строится обычным обходом Для Каждого, а искомая часть выбирается по техническому Имя. Только после подтверждения одного описания допустимо обращение Части[0].
Реальный элемент имеет тип ОписаниеСтандартнойТабличнойЧасти. У него нет используемого здесь конструктора: создавать Новый ОписаниеСтандартнойТабличнойЧасти или передавать неизвестный объект не требуется. Техническое имя ВидыСубконто отдельно от пользовательского Представление(), Синоним, Комментарий и Подсказка; каждый текст попадает в отчет.
ПроверкаЗаполнения читается как системное перечисление и выбирает пояснение отчета. ВыдаватьОшибку описывает настройку, но ее чтение не вызывает проверку нового счета. НеПроверять не означает готовность произвольного объекта к бухгалтерскому учету. Значение проверки заранее не подменяется учебной константой.
СтандартныеРеквизиты дает другую настоящую коллекцию — ОписанияСтандартныхРеквизитов. У нее Количество действительно есть. Перебор выводит имена и описания типов полей и сверяет число элементов со счетчиком. Это схема полей, а не значения аналитик и не строки табличной части.
СоздатьСчет() создает только свой новый объект в памяти. Код85 и наименование заданы локально, Записать отсутствует. Его ВидыСубконто — уже специализированная коллекция строк, не описание метаданных. У собственного нового счета проверяется0 строк; в схеме при этом1 стандартная часть, а пользовательских частей0.
Сервер возвращает одну строку отчета клиентской форме; объекты метаданных и новый счет клиенту не передаются. Отчет нельзя считать доказательством проводок, прав записи, наличия остатков или успешной записи счета.
Как проверить результат
Будущий результат: в отчете есть техническое имя ВидыСубконто, реальные текстовые настройки, одна из двух веток политики заполнения и реальные имена/типы стандартных полей. Описаний стандартных частей1, пользовательских частей0, строк в собственном новом счете0. Количество полей не выдумано: оно вычисляется из настоящей коллекции.
Будущий отрицательный контроль: в собственной конфигурации измените только имя плана УчебныеСчета85 на ИнойУчебныйПлан85 и обновите свой стенд. Проверка должна остановиться после Найти до чтения стандартной части и создания счета. Верните исходное имя после опыта.
Будущий отрицательный контроль схемы: измените только МаксКоличествоСубконто с2 на1. Аудит должен отклонить отличающуюся схему до обхода частей и создания счета. После опыта вернуть2. Не проверять ошибку изменением рабочего плана.
runtimeVerifiedScenarios=0: конфигуратор, форма, серверный модуль и СоздатьСчет здесь не запускались. Выполнены только проверки исходников и native-контрактов установленной справки. Код не записывает и не удаляет счета, аналитики, файлы или проводки.
Ожидаемый результат
Получен содержательный отчет собственной схемы: отдельно проверены настройки стандартной части, описания ее полей и пустые строки нового незаписанного счета.
На что обратить внимание
Все шесть свойств описания стандартной части readonly. Ни одно не присваивается; изменение схемы выполняется только будущей ручной подготовкой своего Конфигуратора, не заменой чтения на фиктивное значение.
Коллекции стандартных частей, стандартных реквизитов и строк счета имеют разные API. Не переносить Количество/Найти одной коллекции на другую. Индекс0 используется только после доказанного количества1; имя здесь техническое и не зависит от синонима.
Представление и Синоним могут зависеть от языка и настроек. У пустых Комментарий/Подсказка нет ошибки: это отсутствие текста, а не отсутствие стандартной части. Отчет не проверяет появление подсказки в интерфейсе.
Чтение ПроверкаЗаполнения не запускает ПроверитьЗаполнение и не доказывает возможность записи счета. Здесь не проводится отрицательный опыт реальной записи и не проверяются бухгалтерские требования.
Проверки состава и расширений не доказывают пустоту модулей. Поэтому подготовка требует вручную проверить пустые модуль объекта, менеджера и остальные модули собственного стенда. СоздатьСчет нельзя запускать в рабочем плане с чужими обработчиками.
ВидыСубконто у объекта метаданных плана — ссылка на метаданные плана характеристик; у описания стандартной части — техническое имя; у объекта счета — строки настройки аналитик. Эти три одноименных смысла не заменяют друг друга.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.