Формы менеджера, форма своего объекта и копия макета

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

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

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

Полный обычный клиентский общий модуль УчебныеВиды85, только толстый клиент. Пульт и модуль объекта отдельными полными блоками ниже; не выполнялся.

Подготовка

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

  2. План видов расчёта Уч85Начисления: Код Строка(10), переменная длина, наименование 100, уникальность кода включена. ИспользованиеПериодаДействия=Да, ЗависимостьОтВидовРасчета=ПоПериодуДействия, в базовых планах только сам Уч85Начисления. Собственный реквизит Уч85Ключ Строка(8), Индексировать. Нет предопределённых элементов, общих реквизитов, разделителей, регистров расчёта или расчётных алгоритмов. Модули пустые.

  3. В стандартном списке своего плана вручную создайте ровно три обычных вида: A — код 10, имя Учебный оклад, ключ A, ПериодДействияБазовый=Истина; B — код 20, имя Учебная премия, ключ B, ПериодДействияБазовый=Ложь; C — код 30, имя Учебное отсутствие, ключ C, ПериодДействияБазовый=Ложь. Все без пометки удаления и не предопределённые.

  4. У B вручную заполните три стандартные таблицы: БазовыеВидыРасчета содержит только ссылку A; ВедущиеВидыРасчета только A; ВытесняющиеВидыРасчета только C. У A/C все три таблицы пустые. Сохраните только эту собственную подготовку. Это технический граф связей, не утверждённая методика начисления зарплаты.

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

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

  7. Для основных опытов используется одна сессия, никаких фоновых обменов, расширений, сторонних обработчиков или других пользователей, меняющих записи. Код читает собственные виды и изменяет полученный объект только в памяти. Записать, удаление, проведение, расчёт регистров, файлы и сеть не вызываются.

  8. ТОЛЬКО ДЛЯ ЭТОГО УРОКА: у своего Уч85Начисления создайте обычную форму списка Уч85Список, обычную форму выбора Уч85Выбор и обычную форму вида Уч85Вид штатным мастером, без обработчиков. Создайте пустую обычную Уч85Просмотр без основного реквизита/обработчиков.

  9. Макет плана Уч85Памятка, тип Табличный документ: R1C1=Уч85ИсходнаяПамятка. Обновите только свою конфигурацию, F7. Эти формы/макет в 1С здесь не создавались.

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

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

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

КонецПроцедуры

Функция ПолучитьСвоиВиды()
    ПроверитьСвойОсновнойПлан();
    Менеджер = ПланыВидовРасчета.Уч85Начисления;
    A = Менеджер.НайтиПоРеквизиту("Уч85Ключ", "A");
    B = Менеджер.НайтиПоРеквизиту("Уч85Ключ", "B");
    C = Менеджер.НайтиПоРеквизиту("Уч85Ключ", "C");
    Если A.Пустая() Или B.Пустая() Или C.Пустая() Или A = B Или A = C Или B = C Тогда
        ВызватьИсключение "Подготовьте три разные реальные ссылки своего основного плана";
    КонецЕсли;
    Коды = Новый Структура("A,B,C", "10", "20", "30");
    Имена = Новый Структура("A,B,C", "Учебный оклад", "Учебная премия", "Учебное отсутствие");
    Свои = Новый Структура("Менеджер,A,B,C,Коды,Имена", Менеджер, A, B, C, Коды, Имена);
    Ключи = Новый Массив;
    Выборка = Менеджер.Выбрать(, "Код Возр");
    Пока Выборка.Следующий() Цикл
        Ключ = Выборка.Уч85Ключ;
        ОжидаемыйКод = Неопределено;
        ОжидаемоеИмя = Неопределено;
        Если Не Коды.Свойство(Ключ, ОжидаемыйКод) Или Не Имена.Свойство(Ключ, ОжидаемоеИмя) Тогда
            ВызватьИсключение "В основной выборке есть лишний учебный вид";
        КонецЕсли;
        Если Выборка.Код <> ОжидаемыйКод Или Выборка.Наименование <> ОжидаемоеИмя
            Или Выборка.ПометкаУдаления Или Выборка.Предопределенный Или Выборка.ИмяПредопределенныхДанных <> ""
            Или Выборка.Ссылка <> Свои[Ключ] Тогда
            ВызватьИсключение "Поля собственного вида не совпали с подготовкой";
        КонецЕсли;
        ПроверитьСвоиСвязи(Выборка, Ключ, Свои);
        Ключи.Добавить(Ключ);
    КонецЦикла;
    Если СтрСоединить(Ключи, ",") <> "A,B,C" Тогда
        ВызватьИсключение "Основной план должен содержать ровно A,B,C в порядке кода";
    КонецЕсли;
    Возврат Свои;
КонецФункции

Процедура ПроверитьСвоиСвязи(Выборка, Ключ, Свои)
    Если ТипЗнч(Выборка.ПериодДействияБазовый) <> Тип("Булево") Или Выборка.ПериодДействияБазовый <> (Ключ = "A") Тогда
        ВызватьИсключение "Только собственный A имеет подготовленный признак базового периода";
    КонецЕсли;
    Если Ключ = "B" Тогда
        Если Выборка.БазовыеВидыРасчета.Количество() <> 1 Или Выборка.ВедущиеВидыРасчета.Количество() <> 1
            Или Выборка.ВытесняющиеВидыРасчета.Количество() <> 1 Тогда
            ВызватьИсключение "У B нужны три реальные подготовленные строки зависимостей";
        КонецЕсли;
        Если Выборка.БазовыеВидыРасчета.Получить(0).ВидРасчета <> Свои.A
            Или Выборка.ВедущиеВидыРасчета.Получить(0).ВидРасчета <> Свои.A
            Или Выборка.ВытесняющиеВидыРасчета.Получить(0).ВидРасчета <> Свои.C Тогда
            ВызватьИсключение "У B базовый/ведущий A и вытесняющий C, не плановые случайные ссылки";
        КонецЕсли;
    Иначе
        Если Выборка.БазовыеВидыРасчета.Количество() <> 0 Или Выборка.ВедущиеВидыРасчета.Количество() <> 0
            Или Выборка.ВытесняющиеВидыРасчета.Количество() <> 0 Тогда
            ВызватьИсключение "У A/C таблицы зависимостей должны быть пустыми";
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
УчебныеВиды85.Пульт

УчебныеМенеджерыРасчетов85 → Обработки → УчебныеВиды85 → Формы → Пульт → Модуль

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

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

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

  1. Менеджер относится к собственному Уч85Начисления, реальные A/B/C и метаданные проверены. Но форма объекта в этом уроке создаётся для отдельного нового черновика, а не для редактирования A/B/C.

  2. ПолучитьФормуСписка и ПолучитьФормуВыбора получают свои заранее созданные обычные формы. ПолучитьФормуНовогоВидаРасчета получает форму нового вида, а ПолучитьФорму менеджера — обязательное имя произвольной формы Уч85Просмотр.

  3. Черновик создан штатным СоздатьВидРасчета. Его ПолучитьФорму использует форму Уч85Вид и относится к этому экземпляру объекта; это не менеджерская форма для произвольной сохранённой ссылки.

  4. У всех вызовов слот владельца пропущен, третий слот — новый УникальныйИдентификатор. Это ключ выбора экземпляра обычной формы, не структура параметров управляемой формы и не плановая ссылка вида.

  5. Все результаты отдельно проверяются на Неопределено и тип Форма. Ни одно окно не открывается и команды записи не выполняются; получение новой формы не выдаётся за сохранение вида.

  6. ПолучитьМакет вызывается у своего конкретного черновика и получает подготовленную памятку плана. Тип ТабличныйДокумент и R1C1 проверяются до локальной правки.

  7. Локально изменённый текст не должен менять макет метаданных: второй ПолучитьМакет опять возвращает Уч85ИсходнаяПамятка. Нет Показать, печати или записи на диск.

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

  1. Будущий тест: F7 → Пульт → Выполнить в обычном толстом клиенте. Пять возвращённых значений — обычная Форма, не управляемая форма/Неопределено.

  2. Имена Уч85Список, Уч85Выбор, Уч85Вид и Уч85Просмотр соответствуют реально созданным собственным формам.

  3. Памятка — ТабличныйДокумент; исходная R1C1=Уч85ИсходнаяПамятка, повторное получение после локальной правки содержит тот же исходный текст.

  4. Список собственного основного плана по-прежнему содержит только A/B/C. Новый объект и новые формы не записывают четвёртый вид.

  5. Повторное нажатие использует новые ключи уникальности. Визуальное открытие и редактирование окна здесь не проверено, поскольку Открыть не вызывается.

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

Будущий результат: пять полученных собственных обычных форм и локальная копия макета, без открытия/сохранения вида.

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

  1. ПолучитьФорму менеджера требует имя; у объекта и специальных менеджерских форм имя необязательно. Все нужные имена здесь подготовлены явно.

  2. Формы по этим контрактам только в толстом клиенте. Тонкий клиент/сервер и глобальный управляемый ПолучитьФорму не являются заменой с теми же аргументами.

  3. Макеты бывают разных видов. Проверка на ТабличныйДокумент необходима прежде чем читать R1C1; произвольный объект макета не объявляется таблицей.

  4. Ключ уникальности формы не является ссылкой вида расчёта. Новый объект в памяти и плановый/сохранённый идентификатор базы — разные состояния.

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

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

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

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

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