Макет в метаданных справочника содержит одну известную строку. Проверяем вид документа и текст, подставляем Книга/BOOK-A, ничего не печатаем и не сохраняем в файл.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Создайте НОВУЮ пустую файловую базу на точной платформе 8.5.1.1343. Имя конфигурации УчебныеВыборкиКаталога85, совместимость НеИспользовать. Это не копия рабочих УТ/КА/УНФ/БП; исходные конфигурации и рабочие базы не трогайте. Здесь код не запускался: runtimeVerifiedScenarios=0.
Создайте единственный справочник УчебныеТовары: иерархия групп и элементов, владельцы не назначены, предопределенных данных нет, код Строка длиной 10, автонумерация выключена, контроль уникальности включён, наименование длиной 100. Других объектов хранения данных не добавляйте.
Добавьте единственный реквизит Артикул: Строка длиной 20, использование для групп и элементов, Индексировать. Индекс обязателен для отбора Выбрать по этому реквизиту. Табличных частей нет. Модули справочника/менеджера, подписки, регламентные задания, разделители и расширения должны быть пустыми/отсутствовать.
Создайте два неглобальных общих модуля: УчебныйКаталог85 и УчебныеПримерыКаталога85, Сервер=Да, клиентские флаги=Нет, Вызов сервера=Да, привилегированный режим=Нет. В первый вставьте полный общий модуль подготовки ниже; во второй — полный основной код только одного выбранного урока. Не склеивайте разные процедуры ВыполнитьПример.
Создайте собственную обработку УчебныйПульт85, управляемую форму Пульт, команду Выполнить и кнопку этой команды. В модуль формы вставьте полный отдельный модуль запуска ниже и назначьте действие команды Выполнить. Обновите конфигурацию базы, проверьте F7; до запуска вручную сверяйте настройки справочника.
Данные создаёт сам урок: G01 Основной и G02 Архив в корне; A01 Книга/BOOK-A и A02 Ручка/PEN-A в Основной; B01 Книга/BOOK-B в Архив. Все пять записей существуют лишь внутри собственной транзакции. При успехе и ошибке выполняется откат; фиксации нет.
Будущий ручной запуск вызывает настоящую запись пяти собственных строк в учебной базе до отката. Откат не отменяет внешние действия неизвестных обработчиков, поэтому рабочая конфигурация или её копия здесь недопустима. Запускайте одним пользователем, вне чужой транзакции; существующие данные код не удаляет.
Только для этого урока: УчебныеТовары → Макеты → Добавить, имя УчебноеСообщение, тип ТекстовыйДокумент. В редакторе одна строка Товар: %1; артикул: %2 без кавычек; обновите конфигурацию базы. Данные пяти товаров здесь не создаются, общий модуль используется только для проверки стенда.
Процедура ВыполнитьПример() Экспорт
УчебныйКаталог85.ПроверитьСвойСтенд();
Макет = Справочники.УчебныеТовары.ПолучитьМакет("УчебноеСообщение");
Если ТипЗнч(Макет) <> Тип("ТекстовыйДокумент") Тогда
ВызватьИсключение "Нужен собственный текстовый макет, не табличный документ";
КонецЕсли;
Шаблон = СокрЛП(Макет.ПолучитьТекст());
Если Шаблон <> "Товар: %1; артикул: %2" Тогда
ВызватьИсключение "Сверьте точный текст собственного макета";
КонецЕсли;
Сообщение = СтрШаблон(Шаблон, "Книга", "BOOK-A");
Если Сообщение <> "Товар: Книга; артикул: BOOK-A" Тогда
ВызватьИсключение "Неожиданная подстановка в собственный текст";
КонецЕсли;
Сообщить(Сообщение);
КонецПроцедурыУчебныйКаталог85
УчебныеВыборкиКаталога85 → Общие → Общие модули → УчебныйКаталог85
Полный серверный общий модуль: защита стенда, подготовка пяти записей и проверка отката. Не выполнялся.
Процедура ПроверитьСвойСтенд() Экспорт
Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Каталог = Метаданные.Справочники[0];
Если Каталог.Имя <> "УчебныеТовары" Или Не Каталог.Иерархический
Или Каталог.Реквизиты.Количество() <> 1 Или Каталог.Реквизиты.Найти("Артикул") = Неопределено Тогда
ВызватьИсключение "Нужен собственный иерархический справочник с единственным реквизитом Артикул";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Функция ПодготовитьСвоиТовары() Экспорт
Если Не ТранзакцияАктивна() Тогда
ВызватьИсключение "Подготовка допустима только внутри собственной отменяемой транзакции";
КонецЕсли;
ПроверкаПустоты = Справочники.УчебныеТовары.Выбрать();
Если ПроверкаПустоты.Следующий() Тогда
ВызватьИсключение "Учебный справочник должен быть пуст; чужие записи не изменяются";
КонецЕсли;
Пустая = Справочники.УчебныеТовары.ПустаяСсылка();
Данные = Новый Структура;
Данные.Вставить("G01", СоздатьСвоюСтроку("G01", "Основной", "GROUP-A", Пустая, Истина));
Данные.Вставить("G02", СоздатьСвоюСтроку("G02", "Архив", "GROUP-B", Пустая, Истина));
Данные.Вставить("A01", СоздатьСвоюСтроку("A01", "Книга", "BOOK-A", Данные.G01, Ложь));
Данные.Вставить("A02", СоздатьСвоюСтроку("A02", "Ручка", "PEN-A", Данные.G01, Ложь));
Данные.Вставить("B01", СоздатьСвоюСтроку("B01", "Книга", "BOOK-B", Данные.G02, Ложь));
Данные.Вставить("Пустая", Пустая);
Возврат Данные;
КонецФункции
Функция СоздатьСвоюСтроку(Код, Наименование, Артикул, Родитель, Группа)
Если Группа Тогда
Объект = Справочники.УчебныеТовары.СоздатьГруппу();
Иначе
Объект = Справочники.УчебныеТовары.СоздатьЭлемент();
КонецЕсли;
Ссылка = Справочники.УчебныеТовары.ПолучитьСсылку(Новый УникальныйИдентификатор);
Объект.УстановитьСсылкуНового(Ссылка);
Объект.Код = Код;
Объект.Наименование = Наименование;
Объект.Артикул = Артикул;
Объект.Родитель = Родитель;
Объект.Записать();
Прочитанный = Ссылка.ПолучитьОбъект();
Если Прочитанный = Неопределено Тогда
ВызватьИсключение "Собственная учебная запись не прочитана";
КонецЕсли;
Если Прочитанный.Код <> Код Или Прочитанный.Наименование <> Наименование
Или Прочитанный.Артикул <> Артикул Или Прочитанный.Родитель <> Родитель
Или Прочитанный.ЭтоГруппа <> Группа Тогда
ВызватьИсключение "Прочитанная учебная строка отличается от подготовленной";
КонецЕсли;
Возврат Ссылка;
КонецФункции
Процедура ПроверитьОткат(Данные) Экспорт
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Собственная транзакция не завершена";
КонецЕсли;
Для Каждого Имя Из СтрРазделить("G01,G02,A01,A02,B01", ",") Цикл
Если Данные[Имя].ПолучитьОбъект() <> Неопределено Тогда
ВызватьИсключение "Собственная запись осталась после отката: " + Имя;
КонецЕсли;
КонецЦикла;
ПроверкаПустоты = Справочники.УчебныеТовары.Выбрать();
Если ПроверкаПустоты.Следующий() Тогда
ВызватьИсключение "После отката справочник не пуст";
КонецЕсли;
КонецПроцедурыУчебныйПульт85.Пульт
УчебныеВыборкиКаталога85 → Обработки → УчебныйПульт85 → Формы → Пульт → Модуль
Полный модуль управляемой формы только собственной обработки. Не выполнялся.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеПримерыКаталога85.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
ПолучитьМакет получает объект по реальному имени УчебноеСообщение, подготовленному в этом справочнике. Это не имя произвольного файла и не общий макет всей конфигурации.
Возвращаемый тип зависит от типа макета. Сначала явно проверяем ТекстовыйДокумент и только потом вызываем ПолучитьТекст; для табличного документа этот код неприменим.
СокрЛП убирает крайние пробельные символы редактора. Внутренний текст остаётся точным; проверка отказывает при замене или отсутствии маркеров %1/%2.
СтрШаблон подставляет подготовленные название и артикул. Выводим полученную строку через Сообщить; методы печати, записи файла и внешние службы не вызываются.
Как проверить результат
Ожидается сообщение Товар: Книга; артикул: BOOK-A. В этом уроке нет транзакции и нет вызова подготовки пяти записей.
В собственной копии учебного макета поменяйте %2 на %3: проверка точного шаблона должна отказать до подстановки. Верните исходный текст для повторного опыта.
Ожидаемый результат
Из своего текстового макета получено известное сообщение о книге без записи данных, файлов и печати. runtimeVerifiedScenarios=0.
На что обратить внимание
Текстовый макет не превращается автоматически в табличную печатную форму. Табличные области, параметры и вывод требуют другого подготовленного макета.
СтрШаблон здесь используется для сообщения, не для вставки внешних значений в запрос или SQL.
Отсутствующее имя макета вызывает ошибку; не маскируйте её успешным пустым текстом.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.