Проверить два источника ключа измерения последовательности

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

Собственное измерение Ключ85 должно получать ключ из реквизита документа и измерения движения. Сверяем две коллекции реальных метаданных и выводим полные имена источников, не восстанавливая границу.

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

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

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

  8. Содержит получает объект описания метаданного, не имя Ключ85. В каждой карте требуем одно конкретное подготовленное поле, затем обходом выводим его ПолноеИмя.

  9. Одинаковое имя Ключ85 не делает реквизит документа и измерение регистра одним объектом. Раздельные строки отчёта показывают происхождение ключа.

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

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

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

  3. Будущий отчёт показывает две разные полные ссылки: Ключ85 реквизитов УчебныйДокумент85 и Ключ85 измерений УчебныеОстатки85. Родитель самого проверяемого измерения — УчебнаяОчередь85.

  4. Очистите одну карту соответствий только в своём Конфигураторе: аудит должен отказать на количестве или Содержит, а не молча принять одинаковое имя поля.

  5. Добавьте другое одноимённое поле в иной свой документ и выберите его в карте, если платформа допускает такую схему: аудит должен отказать по фактической ссылке. Верните точную подготовку.

  6. Не создаются записи документов или регистров и не меняется граница последовательности. Отчёт проверяет структуру связи, не правильность порядка проведения.

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

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

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

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

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

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

  4. Коллекция значений свойства содержит метаданные, а не Структуру с парами имя/значение и не значения измерений из записей базы.

  5. Успешное сопоставление полей не доказывает корректность кода проведения. Перепроведение и восстановление границы — отдельные операции, здесь отсутствующие.

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

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

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

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

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