В практике разработчика 1С часто возникают ситуации, когда отчет строится на основе сложных алгоритмов, внешних источников данных через COM-соединение или специфических выборок, которые трудно или невозможно описать в рамках стандартного запроса Системы компоновки данных (СКД). В таких случаях отчет создается «вручную», а данные выводятся в табличный документ программно. Однако встает вопрос: как предоставить пользователю привычный функционал сохранения вариантов отчета, если стандартная кнопка «Сохранить вариант» жестко привязана к СКД? Рассмотрим подробнее несколько способов решения этой задачи для Управляемых форм.
Платформа 1С предоставляет встроенный механизм, который позволяет сохранять состояние реквизитов формы без написания сложного программного кода. Это самый простой способ имитировать «варианты отчета» для пользователя. Разберем этот процесс по шагам.
Во-первых, откроем управляемую форму нашего отчета и перейдем в её свойства. Нас интересует раздел Настройки. Установим свойство СохранениеДанныхВНастройках в значение Использовать список. После этого в системном меню формы (кнопка «Еще») автоматически появятся команды «Сохранить параметры...» и «Выбрать параметры...».
Во-вторых, нам необходимо указать платформе, какие именно данные формы должны сохраняться. В окне «Сохраняемые данные» (которое открывается по гиперссылке в свойствах формы) выберем галочками нужные реквизиты: списки счетов, контрагентов, пути к базам данных и другие фильтры. Теперь, когда пользователь нажмет «Сохранить настройки», платформа запомнит текущие значения этих реквизитов под заданным именем. Проанализируем преимущества этого подхода: он не требует использования СКД и работает «из коробки», обеспечивая пользователю возможность иметь несколько именованных наборов настроек.
Если нам все же нужен полноценный интерфейс вариантов отчета (с выбором в панели отчетов), наиболее элегантным решением будет использование СКД в качестве «обертки». Даже если данные получаются через COM-соединение из другой базы, мы можем использовать схему компоновки для управления настройками.
Рассмотрим алгоритм реализации этого метода:
СписокСчетов, ДатаНачала, ПутьКБазе).ПриКомпоновкеРезультата.Проанализируем пример кода, который позволяет перехватить процесс формирования и подставить свои данные, полученные из внешней базы:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартный механизм СКД
// Получаем настройки, выбранные пользователем (вариант отчета)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Извлекаем параметры из настроек варианта
ВыбранныйПуть = Настройки.ПараметрыДанных.Элементы.Найти("ПутьКБазе").Значение;
ВыбранныеСчета = Настройки.ПараметрыДанных.Элементы.Найти("СписокСчетов").Значение;
// Выполняем подключение к внешней базе и получение данных
// Например, через Connection = Новый COMОбъект("V83.COMConnector");
ТаблицаРезультат = ПолучитьДанныеИзВнешнейБазы(ВыбранныйПуть, ВыбранныеСчета);
// Выводим данные в ДокументРезультат программно или через
// процессор вывода, используя ТаблицуЗначений как внешний набор данных
ВывестиРезультатВТабличныйДокумент(ДокументРезультат, ТаблицаРезультат);
КонецПроцедуры
В этом случае 1С будет считать, что отчет работает на СКД, и предоставит весь стандартный интерфейс для работы с вариантами. Пользователь сможет настраивать отборы и параметры, а мы будем использовать их значения в своем коде для запроса к внешней базе.
Если требуется полный контроль над процессом (например, если нужно сохранять настройки, которые нельзя напрямую привязать к реквизитам формы), можно использовать механизм ХранилищеОбщихНастроек. Рассмотрим, как программно реализовать сохранение и загрузку вариантов.
Для сохранения настроек мы можем создать структуру, поместить в неё все необходимые значения и записать её в хранилище под определенным ключом. Выясним, как это выглядит в коде:
// Процедура сохранения варианта
НастройкиДляСохранения = Новый Структура;
НастройкиДляСохранения.Вставить("СписокСчетов", Объект.СписокСчетов.ВыгрузитьЗначения());
НастройкиДляСохранения.Вставить("Контрагент", Объект.Контрагент);
НастройкиДляСохранения.Вставить("ПутьКБазе", Объект.ПутьКБазе);
ХранилищеОбщихНастроек.Сохранить("МойСложныйОтчет", "ИмяВариантаПользователя", НастройкиДляСохранения);
Для загрузки настроек используется метод Загрузить. Важно помнить, что COM-объекты (например, установленное соединение) сохранять в хранилище нельзя — они не поддерживают сериализацию. Сохраняйте только строки подключения, логины или идентификаторы объектов.
Для задач, где требуется обмен настройками между пользователями или сохранение истории изменений, часто применяют подход с использованием служебного Регистра сведений. Это позволяет избежать ограничений системных хранилищ и дает возможность управлять настройками как обычными данными базы.
Посмотрим на пример структуры такого регистра:
При таком подходе мы упаковываем структуру настроек в ХранилищеЗначений и записываем в регистр. Это решение надежно, так как данные настроек попадут в резервную копию базы данных и не будут потеряны при очистке кэша пользователя или переустановке платформы.
При реализации сохранения вариантов для отчетов, работающих через COMОбъект, проанализируем ситуацию с безопасностью. Крайне не рекомендуется сохранять пароли от внешних баз в открытом виде внутри настроек варианта. Рассмотрим более правильный подход: в варианте отчета сохраняйте только «Имя подключения» или «Идентификатор базы», а сами параметры авторизации (логин/пароль) храните в защищенном регистре сведений или используйте механизмы аутентификации операционной системы.
Также стоит учитывать, что при поиске объектов во внешней базе (например, счетов или контрагентов), лучше использовать поиск по ИНН или Коду, а не по внутреннему UUID (ссылке), так как в разных базах ссылки на одни и те же элементы справочников будут различаться.
Таким образом, даже без использования классической СКД, разработчик имеет широкий арсенал средств для обеспечения комфортной работы пользователя с вариантами отчетов, от простых свойств формы до создания гибких систем хранения настроек на базе регистров.