Построить собственную таблицу с числовым итогом, проверить фактическое имя для документированного системного ключа и прочитать настоящий серверный профиль. Узкая compatibility-диагностика, без обещания алиаса старого и нового свойств.
Где и как запускать
Серверный неглобальный общий модуль своей новой файловой ИБ 8.5.1.1343; толстый управляемый клиент. Запуск и компиляция в 1С не проверены.
Подготовка
Урок посвящён конкретному непрозрачному типу НастройкиПечатиТабличногоДокумента. Его создаёт и сохраняет сама платформа. Мы создаём только свою полезную таблицу с двумя товарами и числовым итогом 1300, вручную настраиваем её страницу без печати и читаем настоящий профиль в серверной части. Результат — паспорт с реальным типом, собственным ключом и назначением, а не доступ к скрытым полям.
Создайте отдельную НОВУЮ VM, нового пользователя Windows и НОВУЮ пустую файловую ИБ C:\1c-labs\OwnSpreadsheetPrint85_41bdc2f8-57cb-4e5c-9f49-82fd7071b636\IB. Не переносите рабочие УТ, КА2, УНФ, БП, их копии и личные настройки. Новая лаборатория нужна потому, что ручной UI может автоматически сохранить собственный профиль. Здесь VM, база, пользователи, принтеры и 1С не создавались и не запускались.
Платформа 8.5.1.1343, Windows, русский встроенный язык, толстый управляемый клиент. Имя конфигурации УчебнаяДиагностикаПечати85; Версия 41bdc2f8-57cb-4e5c-9f49-82fd7071b636; ОсновнойРежимЗапуска УправляемоеПриложение; РежимСовместимости НеИспользовать. Точная строка подключения File="этот полный путь";. Путь, имя и GUID — ограничители стенда, не универсальное доказательство владения.
Создайте только свой общий модуль УчебнаяДиагностикаПечати85, управляемую общую форму ДиагностикаПечати85, общую команду ОткрытьДиагностикуПечати85, учебный раздел и роль Печать85УчебнаяРоль. Нет бизнес-объектов, всех видов регистров, внешних источников, расширений, общих реквизитов, подписок и заданий. Модуль приложения пуст. Один новый пользователь Печать85Ученик с этой ролью; права СохранениеДанныхПользователя нужны лишь для будущего ручного UI, Администрирование и АктивныеПользователи — для проверки своего пользователя и подключений. Перед кнопками закройте Конфигуратор и другие клиенты.
Общие → Общие модули → УчебнаяДиагностикаПечати85 → Модуль: вставьте основной блок целиком. Сервер Да; Глобальный, ВызовСервера, оба клиентских флага, ВнешнееСоединение и Привилегированный Нет; ПовторноеИспользованиеВозвращаемыхЗначений НеИспользовать. Обе экспортные функции вызываются локально серверными функциями своей формы, а не непосредственно клиентом.
В управляемой форме ДиагностикаПечати85 добавьте два реквизита: Протокол85 — неограниченная многострочная Строка для показа; ПроверенноеИмя85 — Строка только для внутреннего состояния формы, без редактируемого поля. Добавьте две команды и кнопки: ПодготовитьТаблицу85, Действие ПодготовитьТаблицу85(Команда); ПрочитатьПрофиль85, Действие ПрочитатьПрофиль85(Команда). Вставьте поддерживающий модуль формы целиком, подключите ПриСозданииНаСервере к реальному событию. Реквизит ТабличныйДокумент НЕ добавлять: таблица создаётся локально и самостоятельно, не является реквизитом формы.
В свою общую команду ОткрытьДиагностикуПечати85 без параметра вставьте отдельный поддерживающий модуль команды; включите её в свой учебный раздел. Она только открывает свою форму в толстом управляемом клиенте, не создаёт таблицу автоматически и не читает хранилище. Вручную обновите лишь эту новую конфигурацию и скомпилируйте все три модуля.
Нажмите ПодготовитьТаблицу85. Код задаёт только актуальное КлючПараметровПечати с собственным GUID, затем читает фактическое устаревшее ИмяПараметровПечати. Это чтение оправдано только узкой диагностикой: таблица SavingSettings описывает суффикс именно через имя. Связь со значением нового ключа не объявляется гарантией API. Если фактическое старое имя не равно собственному GUID, пример останавливается ДО Показать и Load. Никакого присваивания старому свойству нет. В обычном новом коде пользуйтесь КлючПараметровПечати.
В открытой собственной таблице должно быть 4 × 250 = 1000, 2 × 150 = 300, итог 1300. Только в её окне откройте Файл → Параметры страницы, измените размер или поля, подтвердите ОК и закройте окно без печати и сохранения файла. При зависимости диалога от драйвера используйте только уже имеющийся виртуальный драйвер своей новой VM; не подключайте физический или сетевой принтер, не меняйте принтер рабочего Windows-профиля. Не нажимайте Печать или предварительный просмотр. Если собственной безопасной среды нет, остановитесь.
Нажмите ПрочитатьПрофиль85. Сервер повторно проверит стенд и фактического текущего пользователя, выполнит Load точного собственного объектного ключа с пустым ключом настройки и явным именем пользователя. Подготовка принята только при настоящем результате НастройкиПечатиТабличногоДокумента. Момент фиксации UI не обещается; если профиль не найден, остановитесь и проверьте ручную подготовку в своей лаборатории. Не заменять значение заглушкой или объектом другого пользователя.
Функция ПроверитьСтендПечати85() Экспорт
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnSpreadsheetPrint85_41bdc2f8-57cb-4e5c-9f49-82fd7071b636\IB"";" Или Метаданные.ОсновнойРежимЗапуска <> РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение Или Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Откройте только новую собственную учебную файловую базу 8.5.1.1343";
КонецЕсли;
Если РасширенияКонфигурации.Получить().Количество() <> 0
Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Справочники.Количество() <> 0
Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0
Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0
Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0
Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0
Или Метаданные.РегламентныеЗадания.Количество() <> 0
Или Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.ОбщиеФормы.Количество() <> 1
Или Метаданные.ОбщиеКоманды.Количество() <> 1 Или Метаданные.Роли.Количество() <> 1 Тогда
ВызватьИсключение "В лаборатории не должно быть бизнес-объектов или сторонних обработчиков";
КонецЕсли;
Модуль = Метаданные.ОбщиеМодули.Найти("УчебнаяДиагностикаПечати85");
Если Модуль = Неопределено
Или Метаданные.ОбщиеФормы.Найти("ДиагностикаПечати85") = Неопределено
Или Метаданные.ОбщиеКоманды.Найти("ОткрытьДиагностикуПечати85") = Неопределено
Или Метаданные.Роли.Найти("Печать85УчебнаяРоль") = Неопределено Тогда
ВызватьИсключение "Подготовьте собственные модуль, форму, команду и роль";
КонецЕсли;
Если Не Модуль.Сервер Или Модуль.Глобальный Или Модуль.ВызовСервера
Или Модуль.КлиентОбычноеПриложение Или Модуль.КлиентУправляемоеПриложение
Или Модуль.ВнешнееСоединение Или Модуль.Привилегированный
Или Модуль.ПовторноеИспользованиеВозвращаемыхЗначений <> Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать Тогда
ВызватьИсключение "Общий модуль должен быть только серверным, неглобальным и непривилегированным";
КонецЕсли;
Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если ТипЗнч(Пользователь) <> Тип("ПользовательИнформационнойБазы")
Или Пользователи.Количество() <> 1 Или Пользователь.Имя <> "Печать85Ученик"
Или ТипЗнч(Пользователь.УникальныйИдентификатор) <> Тип("УникальныйИдентификатор")
Или Пользователи[0].УникальныйИдентификатор <> Пользователь.УникальныйИдентификатор Тогда
ВызватьИсключение "Нужен единственный новый пользователь своей лаборатории";
КонецЕсли;
Соединения = ПолучитьСоединенияИнформационнойБазы();
Если Соединения.Количество() <> 1 Или ТипЗнч(Соединения[0]) <> Тип("СоединениеИнформационнойБазы")
Или Соединения[0].НомерСоединения <> НомерСоединенияИнформационнойБазы()
Или ТипЗнч(Соединения[0].Пользователь) <> Тип("ПользовательИнформационнойБазы") Тогда
ВызватьИсключение "Закройте Конфигуратор и все остальные подключения";
КонецЕсли;
Если ТипЗнч(Соединения[0].Пользователь.УникальныйИдентификатор) <> Тип("УникальныйИдентификатор")
Или Соединения[0].Пользователь.УникальныйИдентификатор <> Пользователь.УникальныйИдентификатор
Или Соединения[0].Пользователь.Имя <> Пользователь.Имя Тогда
ВызватьИсключение "Не совпал реальный пользователь текущего соединения";
КонецЕсли;
Возврат Пользователь.Имя;
КонецФункции
Функция ПолучитьПаспортПечати85(ФактическоеИмяПараметров) Экспорт
ИмяПользователя = ПроверитьСтендПечати85();
Если ТипЗнч(ФактическоеИмяПараметров) <> Тип("Строка")
Или ФактическоеИмяПараметров <> "41bdc2f8-57cb-4e5c-9f49-82fd7071b636" Тогда
ВызватьИсключение "Сначала проверьте фактическое имя параметров своего самостоятельного табличного документа";
КонецЕсли;
КлючОбъекта = "Общее/НастройкиПечатиТабличногоДокумента/" + ФактическоеИмяПараметров;
Если ТипЗнч(ХранилищеСистемныхНастроек) <> Тип("СтандартноеХранилищеНастроекМенеджер") Тогда
ВызватьИсключение "Нужен настоящий менеджер системного хранилища";
КонецЕсли;
Настройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта, "", , ИмяПользователя);
Если ТипЗнч(Настройки) <> Тип("НастройкиПечатиТабличногоДокумента") Тогда
ВызватьИсключение "Подготовка не завершена: вручную настройте страницу только своей таблицы, подтвердите и закройте её окно. Профиль должен реально появиться; момент сохранения не гарантируется";
КонецЕсли;
Возврат "Пользователь: " + ИмяПользователя + Символы.ПС
+ "Фактический суффикс из ИмяПараметровПечати: " + ФактическоеИмяПараметров + Символы.ПС
+ "Прочитанный ключ: " + КлючОбъекта + Символы.ПС
+ "Реальный тип: " + Строка(ТипЗнч(Настройки)) + Символы.ПС
+ "Назначение: сохранённый платформой профиль печати своей табличной накладной" + Символы.ПС
+ "Проверить вручную: Файл → Параметры страницы; печать не выполнять" + Символы.ПС
+ "Ограничение: бумага, поля и другие скрытые значения из профиля не прочитаны; совпадение старого имени с новым ключом не объявлено гарантией API";
КонецФункцииСвоя форма: две реальные команды, standalone таблица и отдельное чтение
Общие → Общие формы → ДиагностикаПечати85 → Модуль
Толстый управляемый клиент; серверные функции формы возвращают только строки
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПроверенноеИмя85 = "";
Протокол85 = "Сначала ПодготовитьТаблицу85, затем вручную Параметры страницы без печати, закрыть таблицу и ПрочитатьПрофиль85.";
КонецПроцедуры
&НаКлиенте
Процедура ПодготовитьТаблицу85(Команда)
#Если ТолстыйКлиентУправляемоеПриложение Тогда
ПроверенноеИмя85 = "";
Протокол85 = "";
ИмяПользователя = ПроверитьПодготовкуНаСервере85();
Если ТипЗнч(ИмяПользователя) <> Тип("Строка") Или ИмяПользователя <> "Печать85Ученик" Тогда
ВызватьИсключение "Не подтверждён собственный лабораторный пользователь";
КонецЕсли;
СобственныйКлюч = "41bdc2f8-57cb-4e5c-9f49-82fd7071b636";
ТабДок = Новый ТабличныйДокумент;
ТабДок.КлючПараметровПечати = СобственныйКлюч;
ФактическоеИмя = ТабДок.ИмяПараметровПечати;
Если ТипЗнч(ФактическоеИмя) <> Тип("Строка") Или ФактическоеИмя <> СобственныйКлюч Тогда
ВызватьИсключение "Узкая диагностика не подготовлена: фактическое старое имя не совпало с собственным ключом. Не открывать UI и не загружать профиль";
КонецЕсли;
ТабДок.Область(1, 1, 4, 4).СодержитЗначение = Ложь;
ТабДок.Область(1, 1).Текст = "Товар";
ТабДок.Область(1, 2).Текст = "Количество";
ТабДок.Область(1, 3).Текст = "Цена";
ТабДок.Область(1, 4).Текст = "Сумма";
ТабДок.Область(2, 1).Текст = "Учебный кабель";
ТабДок.Область(3, 1).Текст = "Учебный разъём";
ТабДок.Область(4, 1).Текст = "Итого";
ТабДок.Область(2, 2, 3, 4).СодержитЗначение = Истина;
ТабДок.Область(2, 2).Значение = 4;
ТабДок.Область(2, 3).Значение = 250;
ТабДок.Область(2, 4).Значение = ТабДок.Область(2, 2).Значение * ТабДок.Область(2, 3).Значение;
ТабДок.Область(3, 2).Значение = 2;
ТабДок.Область(3, 3).Значение = 150;
ТабДок.Область(3, 4).Значение = ТабДок.Область(3, 2).Значение * ТабДок.Область(3, 3).Значение;
ТабДок.Область(4, 4).СодержитЗначение = Истина;
ТабДок.Область(4, 4).Значение = ТабДок.Область(2, 4).Значение + ТабДок.Область(3, 4).Значение;
Если ТипЗнч(ТабДок.Область(4, 4).Значение) <> Тип("Число") Или ТабДок.Область(4, 4).Значение <> 1300 Тогда
ВызватьИсключение "Не совпал рассчитанный итог собственной таблицы";
КонецЕсли;
ТабДок.РазмерСтраницы = "A4";
ТабДок.Показать("Своя учебная накладная: только настройка страницы", "", Истина);
ПроверенноеИмя85 = ФактическоеИмя;
Протокол85 = "Создана своя таблица: 4 × 250 + 2 × 150 = 1300. В её окне откройте Параметры страницы, подтвердите, закройте окно без печати и сохранения файла. Затем ПрочитатьПрофиль85.";
#Иначе
ВызватьИсключение "Урок предназначен только для толстого управляемого клиента";
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПрочитатьПрофиль85(Команда)
Протокол85 = "";
Если ТипЗнч(ПроверенноеИмя85) <> Тип("Строка") Или ПроверенноеИмя85 <> "41bdc2f8-57cb-4e5c-9f49-82fd7071b636" Тогда
ВызватьИсключение "Сначала создайте свою таблицу и проверьте её фактическое имя параметров";
КонецЕсли;
Паспорт = ПрочитатьНаСервере85(ПроверенноеИмя85);
Если ТипЗнч(Паспорт) <> Тип("Строка") Или Паспорт = "" Тогда
ВызватьИсключение "Сервер не вернул текстовый паспорт";
КонецЕсли;
Протокол85 = Паспорт;
КонецПроцедуры
&НаСервере
Функция ПроверитьПодготовкуНаСервере85()
Возврат УчебнаяДиагностикаПечати85.ПроверитьСтендПечати85();
КонецФункции
&НаСервере
Функция ПрочитатьНаСервере85(ФактическоеИмяПараметров)
Возврат УчебнаяДиагностикаПечати85.ПолучитьПаспортПечати85(ФактическоеИмяПараметров);
КонецФункцииСвоя общая команда открытия без автоматических операций
Общие → Общие команды → ОткрытьДиагностикуПечати85 → Модуль
Клиентский модуль собственной общей команды
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
#Если ТолстыйКлиентУправляемоеПриложение Тогда
ОткрытьФорму("ОбщаяФорма.ДиагностикаПечати85");
#Иначе
ВызватьИсключение "Этот учебный урок открывайте только в толстом управляемом клиенте";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Перед созданием таблицы проверить точную новую файловую лабораторию, её режимы, пустую бизнес-схему, свой серверный модуль, реального единственного пользователя и подключение. На клиент вернуть только его строковое имя. Это не разрешение исследовать рабочие настройки.
Создать свой standalone ТабличныйДокумент в памяти и задать текущий собственный GUID-ключ. Прочитать фактическое старое имя; проверить тип Строка и точное равенство своему GUID. Это проверка наблюдаемого будущего значения, а не предположение об алиасе. При несовпадении не показывать UI и не делать Load.
Заполнить конкретную накладную: текстовые ячейки сначала не содержат значений, числовые диапазоны явно получают СодержитЗначение = Истина. Суммы считаются из числовых ячеек; проверить реальный числовой итог 1300. Задать стартовый размер A4 и показать свою таблицу с пустым именем файла, без печати.
После самостоятельной ручной настройки страницы закрыть только окно своей таблицы. Отдельная команда чтения передаёт серверу лишь фактический строковый суффикс; сервер снова проверяет стенд и собственный GUID перед точным Load. Маркер формы не считается доказательством владения или полномочий.
Проверить настоящий тип профиля на сервере и вернуть одну непустую строку паспорта. Показать реального пользователя, фактический суффикс, точный системный ключ, реальный тип, назначение и ручной UI путь. Непрозрачный объект не передаётся клиенту и не сохраняется программно.
Как проверить результат
Будущий положительный результат требует обеих фаз: реальное старое имя совпало со своим GUID, показана своя таблица с итогом 1300, после ручного UI настоящий Load возвращает целевой тип. Первый guard либо исключение подготовки не считаются демонстрацией НастройкиПечатиТабличногоДокумента. Компиляция и запуск в 1С не проверены.
Несовпадение фактического имени останавливает пример до UI/Load. Неверный стенд, пользователь или подключение останавливает до источника. Отсутствующий или иной тип профиля означает незавершённую подготовку; старый успешный протокол очищается перед новым чтением.
Паспорт содержит только известные диагностические сведения. Размер страницы, поля, принтер и другие скрытые значения из непрозрачного профиля не прочитаны и не сравнены; пояснение назначения взято из native справки.
Статические проверки должны подтвердить реальные события и команды, current Key setter и только legacy Name read, порядок guards до UI/Load, числовые ячейки и итог, точный ключ/пользователя, server-only opaque type, отсутствие печати, файлового сохранения, Save/Delete, сериализации и передачи непрозрачного объекта.
Ожидаемый результат
Ожидается реальный профиль НастройкиПечатиТабличногоДокумента своей учебной таблицы и его непустой текстовый паспорт. До этого обязательны фактическое совпадение старого имени с собственным GUID и ручная настройка страницы. Скрытые значения не прочитаны, печать и запись кода в хранилище отсутствуют. Запуск не проверялся.
На что обратить внимание
Устаревшее ИмяПараметровПечати не рекомендуется с 8.2. В уроке оно читается исключительно как документированный источник имени для формулы системного ключа. Не задавайте его и не объявляйте равным КлючПараметровПечати на любой версии или любом объекте. Неудачная compatibility-проверка — остановка, а не повод убрать guard.
ТабличныйДокумент.Показать нельзя вызывать на реквизите управляемой формы: native API предупреждает об исключении. Здесь переменная ТабДок — новая самостоятельная таблица, а не реквизит и не полученный извне объект.
Значение ячейки доступно только при СодержитЗначение = Истина; Текст доступен для записи при Ложь. Числовой итог 1300 не подменяется строкой. Подготовка страницы и просмотр собственной таблицы не равны фактической печати.
НастройкиПечатиТабличногоДокумента доступны на сервере и не имеют открытых свойств, методов или конструктора. Нельзя Новый целевой тип, Настройки.РазмерСтраницы или выдуманное поле. A4 в собственной таблице — стартовое известное значение, не чтение A4 из сохранённого профиля.
ПроверенноеИмя85 — временный маркер формы, не безопасность и не устойчивое состояние после закрытия. Сервер не доверяет ему как разрешению и повторно проверяет реальный стенд/пользователя и точный собственный суффикс. Настройку и возврат значения после ошибочного RPC не обещаем.
Ручной UI может сохранять лишь настройки нового лабораторного пользователя. Код не использует системные Save/Delete, параметры по умолчанию, XML/XDTO/JSON, внутренние строки, перенос, очистку или восстановление. Нет печати, файлового сохранения, сети и изменений существующих пользовательских настроек.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.