Как отправлять внешние печатные формы (ВПФ) для отобранных документов через Диадок и корректно изменять данные в подключаемом модуле?

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

Приветствуем вас, коллеги-разработчики 1С! Сегодня мы с вами разберем одну из распространенных задач при работе с модулем Диадок: как отправлять внешние печатные формы (ВПФ) только для выбранных документов, а также как решать неочевидные проблемы с изменением данных в подключаемых модулях. Мы проанализируем опыт коллег с форума и дополним его полезной информацией, чтобы вы могли уверенно справляться с подобными вызовами.

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

1. Общий подход к отправке ВПФ через Диадок

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

Мы рассмотрим, как подключить ВПФ:

  1. Как правило, подключение внешних печатных форм в модуле Диадок осуществляется через специальные настройки. Например, для добавления ВПФ для акта, это можно сделать во вкладке «Настройка» в соответствующем поле или разделе.
  2. Также существуют так называемые «настраиваемые печатные формы» (КПФ), которые позволяют более гибко управлять внешним видом документа, добавлять логотипы, дополнительные поля и т.д.

Важным моментом является то, что Диадок обычно формирует пакет документов для отправки на основе некоторого отбора. Наша задача — вмешаться в этот процесс и откорректировать состав пакета.

2. Использование подключаемого модуля и события "ПослеПодготовкиПакета" для отбора документов

Основной механизм для управления составом пакета документов перед отправкой — это использование подключаемого модуля Диадока, а именно, обработка события ПослеПодготовкиПакета. Давайте разберем, как это работает:

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

Как использовать это событие для отбора документов:

Идея заключается в следующем: мы позволяем Диадоку сформировать пакет со всеми потенциально возможными документами, а затем в событии ПослеПодготовкиПакета мы удаляем из пакета те документы, которые не соответствуют нашим критериям отбора. Это позволяет нам не модифицировать логику формирования пакета в ядре Диадока, а лишь корректировать его состав на финальном этапе.

Входные параметры события включают структуру Параметры, которая содержит элемент Пакет — структуру с основными сведениями о пакете документов. Именно с этим объектом Пакет мы и будем работать.

Мы можем рассмотреть примерный алгоритм действий:

  1. Диадок формирует пакет документов, возможно, включающий все ВПФ, которые могут быть отправлены.
  2. Наше событие ПослеПодготовкиПакета вызывается.
  3. Внутри этого события мы получаем доступ к объекту Пакет.
  4. Мы проходим по списку документов в Пакет, проверяем каждый документ на соответствие нашим критериям отбора (например, по метаданным документа-основания, по каким-либо полям ВПФ и т.д.).
  5. Если документ не соответствует нашим критериям, мы удаляем его из пакета.

Таким образом, к моменту отправки на сервер Диадока, в пакете останутся только те ВПФ, которые мы отобрали.

3. Решение проблемы с некорректным изменением данных в подключаемом модуле

Одна из частых проблем, с которой сталкиваются разработчики при работе с подключаемыми модулями, особенно если они пытаются модифицировать возвращаемые данные, — это ситуация, когда изменения, внесенные в модуль, не "видны" в вызывающем коде. Именно такая ситуация описана в сообщении 10.

Мы проанализируем причину:

Во встроенном языке 1С:Предприятия 8 параметры по умолчанию передаются по ссылке. Это означает, что если мы изменяем свойства объекта, переданного в процедуру или функцию (например, изменяем значения полей структуры), то эти изменения будут видны и в вызывающем коде. Однако, если внутри процедуры или функции происходит полное переприсвоение переменной (например, МояСтруктура = Новый Структура()), то фактически создается новый объект, и исходный объект, переданный по ссылке, не будет изменен. В этом случае, вызывающий код продолжит работать с исходным объектом, не зная о созданном новом.

В нашем случае, в ядре Диадока используется вызов:


ПодключаемыйМодуль_ОбработатьСобытие("ПослеПодготовкиПакета", Новый Структура("Пакет", Результат));

Здесь создается новая структура, в которую помещается наш объект Результат. Если внутри подключаемого модуля мы будем менять именно свойства структуры Пакет (например, добавлять/удалять документы из коллекции внутри Пакет), то это будет работать. Но если мы попробуем полностью переприсвоить Пакет новой структурой или другим объектом, то ссылка на этот новый объект не вернется в ядро.

Мы рассмотрим решение, предложенное в сообщении 11:

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


// Оригинальный код в ядре:
// ПодключаемыйМодуль_ОбработатьСобытие("ПослеПодготовкиПакета", Новый Структура("Пакет", Результат));

// Правильный способ передачи и получения результата:
ПередаваемыйРезультат = Новый Структура("Пакет", Результат);
ПодключаемыйМодуль_ОбработатьСобытие("ПослеПодготовкиПакета", ПередаваемыйРезультат);
Результат = ПередаваемыйРезультат.Пакет; // Явно присваиваем измененный пакет обратно

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

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

4. Отладка внешних обработок и подключаемых модулей Диадока

Чтобы эффективно решать подобные проблемы, нам необходимо уметь отлаживать код в подключаемых модулях Диадока. Модуль Диадок для 1С представляет собой набор внешних обработок, где корневая обработка (например, Diadoc.epf) часто содержит вспомогательные обработки в виде макетов. Отладка таких вложенных обработок имеет свои особенности.

Давайте разберем процесс отладки по шагам:

  1. Сохранение модуля на диск: Для начала, если модуль Диадока встроен в конфигурацию как дополнительная обработка, мы рекомендуем сохранить его на диск. Это позволит нам работать с файлом напрямую.
  2. Включение режима отладки: Откройте модуль Диадока в режиме «1С:Предприятие» (как внешнюю обработку). Перейдите в его «Настройки» (обычно это кнопка с шестеренкой или пункт меню) → «Расширенные настройки» → «Системные». Там мы должны установить флаг «Режим отладки» и подтвердить выгрузку вложенных обработок. После перезапуска модуля в его заголовке должно отображаться «Режим отладки». Это действие приведет к тому, что все вложенные обработки (макеты) будут сохранены в отдельные файлы на диск, обычно в подпапку рядом с основным файлом.
  3. Открытие для отладки: После выгрузки макетов, вы сможете открыть нужный вам подключаемый модуль (например, КонтурДиадокЯдро.epf или КонтурДиадокПодключаемыйМодуль.epf) как отдельную внешнюю обработку в конфигураторе. Установите точки останова в нужных местах.
  4. Запуск отладки: Для отладки внешних отчетов и обработок крайне важно, чтобы внешняя обработка была открыта в клиентском приложении из конкретного места файловой системы, и Конфигуратор имел доступ именно к этому файлу. Отладка внешних обработок, хранящихся непосредственно в информационной базе, не поддерживается напрямую. Рекомендуется извлекать их на время отладки.
  5. Использование специального инструмента: Как упомянуто в сообщении 10, для отладки внешних печатных форм и обработок часто используется специальный инструмент отладки. Мы должны убедиться, что Конфигуратор подключен к тому же сеансу 1С:Предприятия, в котором запускается Диадок.

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

5. Параметр LockMode

В процессе работы с пакетами документов мы можем столкнуться с параметром LockMode. Давайте разберем его назначение:

Параметр LockMode определяет режим блокировки пакета документов. Он может принимать следующие значения:

  1. None (1): Пакет можно редактировать. Это стандартный режим, когда мы можем добавлять или удалять документы из пакета.
  2. Send (2): Пакет нередактируем до момента отправки. После успешной отправки все ограничения на обработку отдельных документов снимаются. Этот режим может быть полезен для обеспечения целостности пакета в процессе подготовки к отправке.
  3. Full (3): Пакет нередактируем, и любая операция применяется ко всем документам пакета одновременно. Это самый строгий режим, который гарантирует, что пакет будет обработан как единое целое.

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


Если ЗначениеЗаполнено(Результат.ПараметрыШаблона.LockMode)
И НРег(Результат.ПараметрыШаблона.LockMode) <> НРег("None") Тогда
    Результат.Заблокирован = Истина;
КонецЕсли;

Этот фрагмент кода из ядра показывает, как проверяется и устанавливается флаг Заблокирован на основе значения LockMode. Мы должны учитывать этот параметр при работе с пакетом, особенно если хотим модифицировать его состав.

Надеемся, что этот подробный разбор поможет вам успешно настроить отправку ВПФ для отобранных документов через Диадок и эффективно отлаживать ваши подключаемые модули. Успехов в разработке!

← К списку