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