Как достучаться до данных, которые пользователь выбрал на форме, из общего модуля обработки нажатия кнопки?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке расширений для типовых конфигураций 1С (особенно на базе БСП) программисты часто сталкиваются с ситуацией, когда стандартную форму нельзя «захватывать», а логику нужно внедрить через программное добавление кнопок. Основная сложность здесь заключается в получении доступа к тем данным, которые пользователь уже изменил на экране, но еще не нажал кнопку Записать. В этой статье мы подробно разберем, как «вытащить» актуальные настройки из формы справочника Рассылки отчетов и подобных сложных объектов.

Анализ проблемы: почему стандартные методы не видят изменения?

Рассмотрим ситуацию: мы добавили кнопку в расширении и перехватили процедуру ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект). В качестве параметров нам приходят контекст формы (ЭтотОбъект) и сам объект данных (Объект). Если мы обратимся к Объект.Наименование, мы увидим изменения. Однако, если речь идет о табличной части Отчеты и реквизите Настройки (тип ХранилищеЗначений), данные там окажутся старыми.

Это происходит потому, что в управляемых формах 1С сложные данные (такие как настройки компоновки) не редактируются напрямую в объекте. Они выгружаются в Компоновщик настроек или специальные реквизиты формы, а в таблицу записываются только в момент смены строки или записи всего объекта. Разберем по шагам, как добраться до этих «скрытых» данных.

Шаг 1: Определение текущей активной строки

Прежде чем искать данные, нам нужно понять, с какой строкой таблицы Отчеты сейчас работает пользователь. Даже если в списке всего один отчет, форма может хранить его состояние отдельно от данных объекта. Проанализируем способ получения текущей строки:


// В обработчике команды Источник — это наша форма
Попытка
    ТекущиеДанные = Источник.Элементы.Отчеты.ТекущиеДанные;
Исключение
    ТекущиеДанные = Неопределено;
КонецПопытки;

Если ТекущиеДанные <> Неопределено Тогда
    // Мы нашли строку, к которой привязаны настройки
КонецЕсли;

Именно через ТекущиеДанные мы можем получить идентификатор строки и адрес настроек во временном хранилище.

Шаг 2: Получение данных компоновщика настроек

Выясним причину, по которой АдресНастроек в табличной части может содержать неактуальные данные. В механизме «Рассылки отчетов» актуальные правки, которые пользователь видит «перед глазами», живут в реквизите формы, связанном с компоновщиком. Рассмотрим, как программно обратиться к этим данным через ЭтотОбъект (или Источник):


// Настройки текущего (активного в данный момент) отчета
АктуальныеНастройки = Источник.КомпоновщикДанныхКД.ПользовательскиеНастройки.Элементы;

Для Каждого ЭлементНастройки Из АктуальныеНастройки Цикл
    // Здесь перебираем параметры и отборы, которые ввел пользователь
    Сообщить(ЭлементНастройки.Представление + ": " + ЭлементНастройки.Значение);
КонецЦикла;

Важный нюанс: реквизит может называться по-разному в зависимости от версии БСП. Проверьте в отладчике такие имена, как КомпоновщикНастроек, НастройкиТекущегоОтчета или КомпоновщикДанныхКД.

Шаг 3: Работа с временным хранилищем для неактивных строк

Если в рассылке несколько отчетов, то настройки для тех строк, которые сейчас не выбраны, уже помещены во временное хранилище. Рассмотрим механизм доступа к ним. Каждая строка таблицы Отчеты имеет реквизит АдресНастроек. Это строковая ссылка вида e1cib/tempstorage/....

Чтобы прочитать эти данные, нам потребуется серверный контекст. Посмотрим на пример кода, который можно выполнить на сервере:


&НаСервере
Процедура ПрочитатьНастройкиИзХранилища(АдресНастроек)
    // Получаем объект из хранилища (обычно это ПользовательскиеНастройкиКомпоновкиДанных)
    Настройки = ПолучитьИзВременногоХранилища(АдресНастроек);
    
    Если ТипЗнч(Настройки) = Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
        // Обрабатываем настройки
    КонецЕсли;
КонецПроцедуры

Шаг 4: Почему ДанныеФормыВЗначение не всегда помогает?

Часто предлагают использовать метод ДанныеФормыВЗначение. Разберем ситуацию: этот метод действительно превращает данные формы в объект справочника, но он не перекладывает данные из элементов управления (компоновщика на форме) в ХранилищеЗначений внутри объекта автоматически.

В случае с рассылкой отчетов, пока не отработал штатный механизм формы по «сбросу» настроек в хранилище, метод ДанныеФормыВЗначение вернет вам объект с пустыми или старыми настройками в табличной части. Поэтому наш путь — прямое обращение к Источник.КомпоновщикДанныхКД.

Итоговый алгоритм решения

Для того чтобы гарантированно получить данные, которые видит пользователь, рекомендуем придерживаться следующего алгоритма:

  1. Проверить текущую строку: Через Источник.Элементы.Отчеты.ТекущиеДанные получаем доступ к активному отчету.
  2. Извлечь экранные правки: Обращаемся к свойствам компоновщика на форме (Источник.КомпоновщикДанныхКД.ПользовательскиеНастройки).
  3. Собрать данные остальных строк: Циклом пройтись по Источник.Объект.Отчеты и для каждой строки, которая не является текущей, прочитать данные по АдресНастроек через ПолучитьИзВременногоХранилища.
  4. Передать структуру на сервер: Поскольку саму форму (Источник) нельзя передать на сервер как параметр, соберите все нужные значения в Структуру или ТаблицуЗначений на клиенте и передайте ее в серверную процедуру для дальнейшей обработки.

Важный момент для расширений: Если вы используете перехват НачатьВыполнениеКоманды, помните, что вы находитесь в контексте общего модуля. Используйте Источник как ссылку на форму, чтобы иметь возможность прочитать любой её реквизит, даже если он не входит в состав основного Объекта справочника.

Таким образом, даже в самых сложных формах БСП можно достучаться до любых данных, понимая, как платформа 1С распределяет информацию между объектом, временным хранилищем и элементами управления формы.

← На главную