В процессе работы с внешними печатными формами часто возникает задача вывода данных, которые не хранятся в текущей базе. Например, это могут быть номер и дата документа из другой информационной системы, которые являются общими для всех печатных форм определенного вида. Эти данные редко, но меняются, и важно предоставить пользователю возможность редактировать их самостоятельно, без привлечения разработчика. Рассмотрим, какие стандартные механизмы Библиотеки стандартных подсистем (БСП) можно использовать для решения этой задачи.
Проанализируем ситуацию: нам нужно хранить два значения — дату и номер. Эти значения должны быть глобальными, то есть едиными для всех документов, из которых вызывается печатная форма. При изменении этих значений они должны автоматически подставляться во все новые печатные формы. Разберем несколько надежных способов реализации такого функционала.
Это один из самых подходящих и "правильных" способов с точки зрения архитектуры БСП. Хранилище общих настроек предназначено для хранения информации, которая является общей для всех пользователей и не привязана к конкретным объектам конфигурации. В отличие от изменения конфигурации (например, добавления констант), этот метод не требует снятия базы с поддержки.
Разберем по шагам, как это реализовать:
Создание формы настроек. Необходимо создать небольшую обработку или общую форму, которая будет служить пользовательским интерфейсом для редактирования наших параметров. На форме размещаем два поля: для ввода даты и номера документа.
Чтение и запись настроек. При открытии формы нужно считывать ранее сохраненные значения, а при записи — сохранять новые. Для этого используются методы менеджера ОбщиеНастройки.
В коде формы настроек это будет выглядеть примерно так:
// При создании на сервере - читаем сохраненные настройки
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КлючНастроек = "ПараметрыПечатиВнешнегоДокумента";
// Пытаемся загрузить настройки
Настройки = ОбщиеНастройки.Загрузить(КлючНастроек);
Если Настройки <> Неопределено Тогда
// Если настройки найдены, заполняем реквизиты формы
ДатаВнешнегоДокумента = Настройки.ДатаДокумента;
НомерВнешнегоДокумента = Настройки.НомерДокумента;
КонецЕсли;
КонецПроцедуры
// При нажатии кнопки "Сохранить" - записываем новые значения
&НаСервере
Процедура СохранитьНастройки()
КлючНастроек = "ПараметрыПечатиВнешнегоДокумента";
// Создаем структуру для хранения
НастройкиДляСохранения = Новый Структура;
НастройкиДляСохранения.Вставить("ДатаДокумента", ДатаВнешнегоДокумента);
НастройкиДляСохранения.Вставить("НомерДокумента", НомерВнешнегоДокумента);
// Сохраняем настройки
ОбщиеНастройки.Сохранить(КлючНастроек, НастройкиДляСохранения);
КонецПроцедуры
Получение настроек в модуле печатной формы. В коде внешней печатной формы перед формированием табличного документа нужно получить эти значения.
// В модуле внешней печатной формы
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
// ... код подготовки данных ...
КлючНастроек = "ПараметрыПечатиВнешнегоДокумента";
Настройки = ОбщиеНастройки.Загрузить(КлючНастроек);
ДатаДляПечати = Неопределено;
НомерДляПечати = "";
Если Настройки <> Неопределено Тогда
ДатаДляПечати = Настройки.ДатаДокумента;
НомерДляПечати = Настройки.НомерДокумента;
КонецЕсли;
// ... дальнейший код ...
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
ОбластьМакета.Параметры.ДатаВнешнегоДокумента = Формат(ДатаДляПечати, "ДЛФ=Д");
ОбластьМакета.Параметры.НомерВнешнегоДокумента = НомерДляПечати;
ТабличныйДокумент.Вывести(ОбластьМакета);
// ...
КонецПроцедуры
Преимущества: это штатный механизм БСП, он не требует изменения структуры конфигурации и обеспечивает надежное хранение глобальных данных.
Если конфигурация не находится на поддержке или ее изменение допустимо, создание простого регистра сведений является архитектурно верным и очень наглядным решением.
Порядок действий:
В конфигураторе создаем новый непериодический, независимый регистр сведений. Назовем его, например, ПараметрыВнешнегоДокументаДляПечати.
В регистре не будет измерений (или будет одно для общей идентификации, если нужно хранить несколько наборов). Создаем два ресурса:
ДатаДокумента (тип Дата)НомерДокумента (тип Строка)Платформа автоматически сгенерирует форму записи и форму списка для этого регистра. Пользователю достаточно будет открыть этот регистр (например, через "Все функции") и отредактировать единственную запись в нем.
В коде печатной формы для получения данных используется простой запрос или метод РегистрыСведений.<ИмяРегистра>.ПолучитьПоследнее(), если бы регистр был периодическим. Для непериодического регистра с одной записью можно получить срез первых.
// В модуле внешней печатной формы
Функция ПолучитьПараметрыВнешнегоДокумента()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПараметрыВнешнегоДокументаДляПечати.ДатаДокумента,
| ПараметрыВнешнегоДокументаДляПечати.НомерДокумента
|ИЗ
| РегистрСведений.ПараметрыВнешнегоДокументаДляПечати КАК ПараметрыВнешнегоДокументаДляПечати";
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Неопределено;
Иначе
Возврат Результат.Выгрузить()[0];
КонецЕсли;
КонецФункции
// В процедуре Печать()
ПараметрыДокумента = ПолучитьПараметрыВнешнегоДокумента();
Если ПараметрыДокумента <> Неопределено Тогда
ОбластьМакета.Параметры.ДатаВнешнегоДокумента = ПараметрыДокумента.ДатаДокумента;
ОбластьМакета.Параметры.НомерВнешнегоДокумента = ПараметрыДокумента.НомерДокумента;
КонецЕсли;
Преимущества: строгая типизация данных, прозрачность хранения (объект виден в дереве метаданных), наличие стандартного интерфейса для редактирования.
Существуют и другие подходы, которые могут быть применены в зависимости от ситуации.
Константы. Самый простой способ, если конфигурация не на поддержке. Достаточно добавить две константы и выдать пользователю права на их редактирование. Минус — необходимость изменять конфигурацию.
Форма настроек перед печатью. Этот вариант был отвергнут в исходном обсуждении, но его можно улучшить. Форма может не просто запрашивать ввод данных "с нуля", а загружать последние сохраненные значения (из регистра сведений или общих настроек) и позволять пользователю их изменить непосредственно перед печатью. Это дает гибкость: можно использовать стандартные значения или быстро указать другие для конкретного случая.
Таким образом, для хранения глобальных, редактируемых пользователем параметров для внешних печатных форм в конфигурациях на БСП наиболее предпочтительными являются хранилище общих настроек (если не хочется менять конфигурацию) или отдельный регистр сведений (если изменение конфигурации допустимо).