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

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

Построить собственную таблицу с числовым итогом, проверить фактическое имя для документированного системного ключа и прочитать настоящий серверный профиль. Узкая compatibility-диагностика, без обещания алиаса старого и нового свойств.

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

Серверный неглобальный общий модуль своей новой файловой ИБ 8.5.1.1343; толстый управляемый клиент. Запуск и компиляция в 1С не проверены.

Подготовка

  1. Урок посвящён конкретному непрозрачному типу НастройкиПечатиТабличногоДокумента. Его создаёт и сохраняет сама платформа. Мы создаём только свою полезную таблицу с двумя товарами и числовым итогом 1300, вручную настраиваем её страницу без печати и читаем настоящий профиль в серверной части. Результат — паспорт с реальным типом, собственным ключом и назначением, а не доступ к скрытым полям.

  2. Создайте отдельную НОВУЮ VM, нового пользователя Windows и НОВУЮ пустую файловую ИБ C:\1c-labs\OwnSpreadsheetPrint85_41bdc2f8-57cb-4e5c-9f49-82fd7071b636\IB. Не переносите рабочие УТ, КА2, УНФ, БП, их копии и личные настройки. Новая лаборатория нужна потому, что ручной UI может автоматически сохранить собственный профиль. Здесь VM, база, пользователи, принтеры и 1С не создавались и не запускались.

  3. Платформа 8.5.1.1343, Windows, русский встроенный язык, толстый управляемый клиент. Имя конфигурации УчебнаяДиагностикаПечати85; Версия 41bdc2f8-57cb-4e5c-9f49-82fd7071b636; ОсновнойРежимЗапуска УправляемоеПриложение; РежимСовместимости НеИспользовать. Точная строка подключения File="этот полный путь";. Путь, имя и GUID — ограничители стенда, не универсальное доказательство владения.

  4. Создайте только свой общий модуль УчебнаяДиагностикаПечати85, управляемую общую форму ДиагностикаПечати85, общую команду ОткрытьДиагностикуПечати85, учебный раздел и роль Печать85УчебнаяРоль. Нет бизнес-объектов, всех видов регистров, внешних источников, расширений, общих реквизитов, подписок и заданий. Модуль приложения пуст. Один новый пользователь Печать85Ученик с этой ролью; права СохранениеДанныхПользователя нужны лишь для будущего ручного UI, Администрирование и АктивныеПользователи — для проверки своего пользователя и подключений. Перед кнопками закройте Конфигуратор и другие клиенты.

  5. Общие → Общие модули → УчебнаяДиагностикаПечати85 → Модуль: вставьте основной блок целиком. Сервер Да; Глобальный, ВызовСервера, оба клиентских флага, ВнешнееСоединение и Привилегированный Нет; ПовторноеИспользованиеВозвращаемыхЗначений НеИспользовать. Обе экспортные функции вызываются локально серверными функциями своей формы, а не непосредственно клиентом.

  6. В управляемой форме ДиагностикаПечати85 добавьте два реквизита: Протокол85 — неограниченная многострочная Строка для показа; ПроверенноеИмя85 — Строка только для внутреннего состояния формы, без редактируемого поля. Добавьте две команды и кнопки: ПодготовитьТаблицу85, Действие ПодготовитьТаблицу85(Команда); ПрочитатьПрофиль85, Действие ПрочитатьПрофиль85(Команда). Вставьте поддерживающий модуль формы целиком, подключите ПриСозданииНаСервере к реальному событию. Реквизит ТабличныйДокумент НЕ добавлять: таблица создаётся локально и самостоятельно, не является реквизитом формы.

  7. В свою общую команду ОткрытьДиагностикуПечати85 без параметра вставьте отдельный поддерживающий модуль команды; включите её в свой учебный раздел. Она только открывает свою форму в толстом управляемом клиенте, не создаёт таблицу автоматически и не читает хранилище. Вручную обновите лишь эту новую конфигурацию и скомпилируйте все три модуля.

  8. Нажмите ПодготовитьТаблицу85. Код задаёт только актуальное КлючПараметровПечати с собственным GUID, затем читает фактическое устаревшее ИмяПараметровПечати. Это чтение оправдано только узкой диагностикой: таблица SavingSettings описывает суффикс именно через имя. Связь со значением нового ключа не объявляется гарантией API. Если фактическое старое имя не равно собственному GUID, пример останавливается ДО Показать и Load. Никакого присваивания старому свойству нет. В обычном новом коде пользуйтесь КлючПараметровПечати.

  9. В открытой собственной таблице должно быть 4 × 250 = 1000, 2 × 150 = 300, итог 1300. Только в её окне откройте Файл → Параметры страницы, измените размер или поля, подтвердите ОК и закройте окно без печати и сохранения файла. При зависимости диалога от драйвера используйте только уже имеющийся виртуальный драйвер своей новой VM; не подключайте физический или сетевой принтер, не меняйте принтер рабочего Windows-профиля. Не нажимайте Печать или предварительный просмотр. Если собственной безопасной среды нет, остановитесь.

  10. Нажмите ПрочитатьПрофиль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");
    #Иначе
        ВызватьИсключение "Этот учебный урок открывайте только в толстом управляемом клиенте";
    #КонецЕсли
КонецПроцедуры

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

  1. Перед созданием таблицы проверить точную новую файловую лабораторию, её режимы, пустую бизнес-схему, свой серверный модуль, реального единственного пользователя и подключение. На клиент вернуть только его строковое имя. Это не разрешение исследовать рабочие настройки.

  2. Создать свой standalone ТабличныйДокумент в памяти и задать текущий собственный GUID-ключ. Прочитать фактическое старое имя; проверить тип Строка и точное равенство своему GUID. Это проверка наблюдаемого будущего значения, а не предположение об алиасе. При несовпадении не показывать UI и не делать Load.

  3. Заполнить конкретную накладную: текстовые ячейки сначала не содержат значений, числовые диапазоны явно получают СодержитЗначение = Истина. Суммы считаются из числовых ячеек; проверить реальный числовой итог 1300. Задать стартовый размер A4 и показать свою таблицу с пустым именем файла, без печати.

  4. После самостоятельной ручной настройки страницы закрыть только окно своей таблицы. Отдельная команда чтения передаёт серверу лишь фактический строковый суффикс; сервер снова проверяет стенд и собственный GUID перед точным Load. Маркер формы не считается доказательством владения или полномочий.

  5. Проверить настоящий тип профиля на сервере и вернуть одну непустую строку паспорта. Показать реального пользователя, фактический суффикс, точный системный ключ, реальный тип, назначение и ручной UI путь. Непрозрачный объект не передаётся клиенту и не сохраняется программно.

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

  1. Будущий положительный результат требует обеих фаз: реальное старое имя совпало со своим GUID, показана своя таблица с итогом 1300, после ручного UI настоящий Load возвращает целевой тип. Первый guard либо исключение подготовки не считаются демонстрацией НастройкиПечатиТабличногоДокумента. Компиляция и запуск в 1С не проверены.

  2. Несовпадение фактического имени останавливает пример до UI/Load. Неверный стенд, пользователь или подключение останавливает до источника. Отсутствующий или иной тип профиля означает незавершённую подготовку; старый успешный протокол очищается перед новым чтением.

  3. Паспорт содержит только известные диагностические сведения. Размер страницы, поля, принтер и другие скрытые значения из непрозрачного профиля не прочитаны и не сравнены; пояснение назначения взято из native справки.

  4. Статические проверки должны подтвердить реальные события и команды, current Key setter и только legacy Name read, порядок guards до UI/Load, числовые ячейки и итог, точный ключ/пользователя, server-only opaque type, отсутствие печати, файлового сохранения, Save/Delete, сериализации и передачи непрозрачного объекта.

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

Ожидается реальный профиль НастройкиПечатиТабличногоДокумента своей учебной таблицы и его непустой текстовый паспорт. До этого обязательны фактическое совпадение старого имени с собственным GUID и ручная настройка страницы. Скрытые значения не прочитаны, печать и запись кода в хранилище отсутствуют. Запуск не проверялся.

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

  1. Устаревшее ИмяПараметровПечати не рекомендуется с 8.2. В уроке оно читается исключительно как документированный источник имени для формулы системного ключа. Не задавайте его и не объявляйте равным КлючПараметровПечати на любой версии или любом объекте. Неудачная compatibility-проверка — остановка, а не повод убрать guard.

  2. ТабличныйДокумент.Показать нельзя вызывать на реквизите управляемой формы: native API предупреждает об исключении. Здесь переменная ТабДок — новая самостоятельная таблица, а не реквизит и не полученный извне объект.

  3. Значение ячейки доступно только при СодержитЗначение = Истина; Текст доступен для записи при Ложь. Числовой итог 1300 не подменяется строкой. Подготовка страницы и просмотр собственной таблицы не равны фактической печати.

  4. НастройкиПечатиТабличногоДокумента доступны на сервере и не имеют открытых свойств, методов или конструктора. Нельзя Новый целевой тип, Настройки.РазмерСтраницы или выдуманное поле. A4 в собственной таблице — стартовое известное значение, не чтение A4 из сохранённого профиля.

  5. ПроверенноеИмя85 — временный маркер формы, не безопасность и не устойчивое состояние после закрытия. Сервер не доверяет ему как разрешению и повторно проверяет реальный стенд/пользователя и точный собственный суффикс. Настройку и возврат значения после ошибочного RPC не обещаем.

  6. Ручной UI может сохранять лишь настройки нового лабораторного пользователя. Код не использует системные Save/Delete, параметры по умолчанию, XML/XDTO/JSON, внутренние строки, перенос, очистку или восстановление. Нет печати, файлового сохранения, сети и изменений существующих пользовательских настроек.

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

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

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

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

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