Как программно получить данные из документа «Заказ клиента» во внешнюю обработку?

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

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

Способ 1. Получение данных через владельца формы (Клиент-серверный подход)

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

В модуле формы документа Заказ клиента для открытия обработки мы используем метод ОткрытьФорму. Ключевым моментом здесь является передача третьего параметра — владельца.


// В форме документа Заказ клиента
&НаКлиенте
Процедура КомандаОткрытьОбработку(Команда)
    // Укажите путь к форме внешней обработки
    // Если обработка подключена через справочник "Дополнительные отчеты и обработки", 
    // путь может отличаться, ниже приведен пример для программного открытия
    ПараметрыФормы = Новый Структура;
    ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма.Форма", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры

Теперь в форме самой обработки мы можем обратиться к данным документа через свойство Владелец. Проанализируем код, который позволит нам прочитать табличную часть Товары:


&НаКлиенте
Процедура ПолучитьДанныеДокумента()
    // Проверяем наличие владельца
    Если Владелец <> Неопределено Тогда
        // Обращаемся к объекту документа через владельца
        // Важно: Владелец.Объект доступен в управляемых формах
        ТЧ_Товары = Владелец.Объект.Товары;
        
        Для Каждого СтрокаТЧ Из ТЧ_Товары Цикл
            Сообщить("Товар: " + СтрокаТЧ.Номенклатура + " Количество: " + СтрокаТЧ.Количество);
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

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

Способ 2. Использование запроса к базе данных (Серверный подход)

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

Рассмотрим пример функции, которая выбирает данные табличной части:


&НаСервере
Функция ПолучитьТаблицуТоваров(СсылкаНаДокумент)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ЗаказКлиентаТовары.Номенклатура.Наименование КАК ТоварНаименование,
        |   ЗаказКлиентаТовары.Количество КАК Количество,
        |   ЗаказКлиентаТовары.Цена КАК Цена,
        |   ЗаказКлиентаТовары.Сумма КАК Сумма
        |ИЗ
        |   Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
        |ГДЕ
        |   ЗаказКлиентаТовары.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
    
    Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

Этот метод предпочтительнее, так как мы выбираем только те колонки, которые нам действительно нужны (например, только наименование и сумму для письма), не нагружая память лишними реквизитами объекта.

Способ 3. Интеграция через Библиотеку стандартных подсистем (БСП)

В современных конфигурациях (таких как УТ 11, ERP 2.5, КА 2) внешние обработки принято подключать через механизм Дополнительные отчеты и обработки. Это позволяет пользователю запускать обработку кнопкой из меню «Отчеты» или «Заполнение». При таком подходе система сама передает ссылки на выбранные документы.

Выясним, как получить данные в этом случае. В модуле объекта внешней обработки должна присутствовать экспортная процедура ВыполнитьКоманду. Система передает в нее массив ссылок в параметре ОбъектыНазначения.


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

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

Способ 4. Получение данных из динамического списка

Иногда пользователю требуется отправить на почту не один документ, а именно ту выборку, которую он видит в форме списка (с учетом всех установленных фильтров и поисковых строк). Хотя напрямую «прочитать» ДинамическийСписок как таблицу нельзя, мы можем использовать метод ПостроитьЗапрос().

Рассмотрим алгоритм действий:

  1. Получаем схему компоновки данных из динамического списка.
  2. Применяем к ней текущие настройки (отборы), установленные пользователем.
  3. Выполняем запрос и получаем результат в виде таблицы значений.

Это позволяет внешней обработке работать в точном соответствии с тем, что пользователь настроил на экране в данный момент.

Практические рекомендации по отправке данных на почту

После того как мы успешно получили данные из табличной части Заказа клиента, их необходимо подготовить для отправки. Вместо того чтобы формировать текст письма вручную, мы рекомендуем использовать Табличный документ.

Разберем последовательность действий:

  1. Создайте в макете обработки область для заголовка таблицы и строк.
  2. Заполните макет данными из полученной таблицы значений.
  3. Используйте метод Записать(), чтобы сохранить результат во временный файл (например, в формате ТипФайлаТабличногоДокумента.XLSX или PDF).
  4. Используйте встроенные средства работы с почтой (объект ИнтернетПочтовоеСообщение) для прикрепления этого файла.

Помните о безопасности: Внешние обработки часто запускаются в безопасном режиме. Если ваша обработка должна отправлять почту, убедитесь, что при ее регистрации в справочнике «Дополнительные отчеты и обработки» указан режим работы с разрешениями на использование сетевых ресурсов или внешних компонент.

Таким образом, мы рассмотрели различные варианты взаимодействия. Для простых задач и быстрой разработки подойдет использование Владелец.Объект, а для производительных и универсальных решений — использование запросов и механизмов БСП.

← На главную