Как программно получить данные из управляемой формы для вывода на печать?

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

Часто в процессе разработки возникает задача вывода на печать данных, которые уже отображены на форме, но их расчет является сложным процессом, скрытым в недрах типовой конфигурации. Рассмотрим, как можно извлечь эти значения программным путем, даже если они не хранятся напрямую в реквизитах объекта.

Понимание архитектуры получения данных

В типовых конфигурациях, таких как 1С:Зарплата и Управление Персоналом, многие отображаемые данные являются результатом сложных вычислений. Попытка повторить эту логику через запросы к базе данных требует огромных затрат времени. Вместо этого мы можем использовать уже открытую или программно полученную форму как источник готовых значений.

Важно помнить, что управляемая форма — это объект клиентского слоя. Получить её можно на клиенте, но для формирования табличного документа нам потребуется сервер. Поэтому стратегия решения заключается в следующем: получаем форму на клиенте, извлекаем из неё нужные данные, упаковываем в Структуру и передаем на сервер для обработки макета.

Реализация сбора данных через перебор элементов формы

Если мы хотим избежать ручного описания каждого реквизита, мы можем воспользоваться универсальным подходом, основанным на переборе элементов формы. Рассмотрим, как это сделать по шагам.

Сначала мы получаем форму с помощью метода ПолучитьФорму. Затем, используя свойство Элементы, мы обходим все визуальные элементы и считываем их ПутьКДанным, чтобы получить соответствующие значения из контекста формы.


// Пример универсального сбора данных с формы
СтруктураДанных = Новый Структура;
ФормаОбъекта = ПолучитьФорму("Справочник.Сотрудники.Форма.ФормаЭлемента", ПараметрыОткрытия);

Для Каждого Элемент Из ФормаОбъекта.Элементы Цикл
    Если ЗначениеЗаполнено(Элемент.ПутьКДанным) Тогда
        ИмяРеквизита = СтрРазделить(Элемент.ПутьКДанным, ".")[1]; // Получаем имя реквизита
        Если Не СтруктураДанных.Свойство(ИмяРеквизита) Тогда
            СтруктураДанных.Вставить(ИмяРеквизита, ФормаОбъекта[ИмяРеквизита]);
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Передача данных на сервер

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


&НаСервере
Процедура СформироватьПечатнуюФорму(ТабДок, ДанныеДляПечати)
    // Получаем макет обработки
    Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
    Область = Макет.ПолучитьОбласть("Шапка");
    
    // Заполняем параметры макета данными из структуры
    Для Каждого КлючИЗначение Из ДанныеДляПечати Цикл
        Область.Параметры[КлючИЗначение.Ключ] = КлючИЗначение.Значение;
    КонецЦикла;
    
    ТабДок.Вывести(Область);
КонецПроцедуры

Важные рекомендации и предостережения

  1. Производительность: Метод ПолучитьФорму инициирует выполнение серверных процедур формы (например, ПриСозданииНаСервере). Использование этого метода в цикле для большого количества объектов может существенно замедлить работу системы. Рекомендуем использовать данный подход только для одиночных операций.
  2. Стабильность: Имена элементов формы могут меняться при обновлении конфигурации разработчиками 1С. Ваш код, завязанный на конкретные имена, может потребовать доработки при переходе на новые релизы.
  3. Надежность: Для массовой печати (например, по 50 сотрудникам) архитектурно правильнее будет использовать Запросы к регистрам сведений, даже если это потребует времени на изучение структуры метаданных.

Таким образом, мы разобрали способ, позволяющий эффективно вытащить данные из интерфейсной части 1С и передать их для формирования печатного документа. Этот метод является мощным инструментом для оперативного решения задач, однако всегда учитывайте нагрузку на сервер при его внедрении.

← На главную