Приветствуем вас, коллеги-разработчики 1С! Сегодня мы с вами разберем одну из распространенных задач при работе с модулем Диадок: как отправлять внешние печатные формы (ВПФ) только для выбранных документов, а также как решать неочевидные проблемы с изменением данных в подключаемых модулях. Мы проанализируем опыт коллег с форума и дополним его полезной информацией, чтобы вы могли уверенно справляться с подобными вызовами.
Задача отправки ВПФ для отобранных документов через Диадок требует понимания архитектуры модуля и механизмов работы с подключаемыми модулями. Давайте рассмотрим эту проблему по шагам и найдем эффективные решения.
Прежде всего, давайте выясним, как модуль Диадок в принципе работает с внешними печатными формами. Модуль Диадок для 1С предоставляет широкие возможности для обмена электронными документами, включая неформализованные документы произвольного формата, к которым и относятся ВПФ.
Мы рассмотрим, как подключить ВПФ:
Важным моментом является то, что Диадок обычно формирует пакет документов для отправки на основе некоторого отбора. Наша задача — вмешаться в этот процесс и откорректировать состав пакета.
Основной механизм для управления составом пакета документов перед отправкой — это использование подключаемого модуля Диадока, а именно, обработка события ПослеПодготовкиПакета. Давайте разберем, как это работает:
Событие ПослеПодготовкиПакета специально предназначено для изменения любых свойств уже подготовленного пакета документов до момента его фактической отправки на сервер Диадока. В рамках этой функции мы можем переопределить множество параметров пакета, таких как отправитель, получатель, подразделение, статус блокировки (Заблокирован) и другие.
Как использовать это событие для отбора документов:
Идея заключается в следующем: мы позволяем Диадоку сформировать пакет со всеми потенциально возможными документами, а затем в событии ПослеПодготовкиПакета мы удаляем из пакета те документы, которые не соответствуют нашим критериям отбора. Это позволяет нам не модифицировать логику формирования пакета в ядре Диадока, а лишь корректировать его состав на финальном этапе.
Входные параметры события включают структуру Параметры, которая содержит элемент Пакет — структуру с основными сведениями о пакете документов. Именно с этим объектом Пакет мы и будем работать.
Мы можем рассмотреть примерный алгоритм действий:
ПослеПодготовкиПакета вызывается.Пакет.Пакет, проверяем каждый документ на соответствие нашим критериям отбора (например, по метаданным документа-основания, по каким-либо полям ВПФ и т.д.).Таким образом, к моменту отправки на сервер Диадока, в пакете останутся только те ВПФ, которые мы отобрали.
Одна из частых проблем, с которой сталкиваются разработчики при работе с подключаемыми модулями, особенно если они пытаются модифицировать возвращаемые данные, — это ситуация, когда изменения, внесенные в модуль, не "видны" в вызывающем коде. Именно такая ситуация описана в сообщении 10.
Мы проанализируем причину:
Во встроенном языке 1С:Предприятия 8 параметры по умолчанию передаются по ссылке. Это означает, что если мы изменяем свойства объекта, переданного в процедуру или функцию (например, изменяем значения полей структуры), то эти изменения будут видны и в вызывающем коде. Однако, если внутри процедуры или функции происходит полное переприсвоение переменной (например, МояСтруктура = Новый Структура()), то фактически создается новый объект, и исходный объект, переданный по ссылке, не будет изменен. В этом случае, вызывающий код продолжит работать с исходным объектом, не зная о созданном новом.
В нашем случае, в ядре Диадока используется вызов:
ПодключаемыйМодуль_ОбработатьСобытие("ПослеПодготовкиПакета", Новый Структура("Пакет", Результат));
Здесь создается новая структура, в которую помещается наш объект Результат. Если внутри подключаемого модуля мы будем менять именно свойства структуры Пакет (например, добавлять/удалять документы из коллекции внутри Пакет), то это будет работать. Но если мы попробуем полностью переприсвоить Пакет новой структурой или другим объектом, то ссылка на этот новый объект не вернется в ядро.
Мы рассмотрим решение, предложенное в сообщении 11:
Чтобы изменения, внесенные в структуру внутри подключаемого модуля, были видны в вызывающем ядре, необходимо явно присвоить измененный или новый объект обратно переменной, которая была передана в процедуру. Это достигается следующим образом:
// Оригинальный код в ядре:
// ПодключаемыйМодуль_ОбработатьСобытие("ПослеПодготовкиПакета", Новый Структура("Пакет", Результат));
// Правильный способ передачи и получения результата:
ПередаваемыйРезультат = Новый Структура("Пакет", Результат);
ПодключаемыйМодуль_ОбработатьСобытие("ПослеПодготовкиПакета", ПередаваемыйРезультат);
Результат = ПередаваемыйРезультат.Пакет; // Явно присваиваем измененный пакет обратно
Здесь мы видим, что создается промежуточная структура ПередаваемыйРезультат. В подключаемый модуль передается ссылка на эту структуру. Внутри подключаемого модуля мы можем изменять ПередаваемыйРезультат.Пакет или даже полностью переприсвоить ПередаваемыйРезультат.Пакет = НовыйПакет. После выхода из подключаемого модуля, мы явно забираем измененное значение из ПередаваемыйРезультат.Пакет и присваиваем его обратно в нашу переменную Результат. Таким образом, ядро получит актуальный состав пакета.
Важно помнить: модифицируйте свойства объекта, переданного по ссылке, или явно возвращайте измененный объект, как показано выше.
Чтобы эффективно решать подобные проблемы, нам необходимо уметь отлаживать код в подключаемых модулях Диадока. Модуль Диадок для 1С представляет собой набор внешних обработок, где корневая обработка (например, Diadoc.epf) часто содержит вспомогательные обработки в виде макетов. Отладка таких вложенных обработок имеет свои особенности.
Давайте разберем процесс отладки по шагам:
КонтурДиадокЯдро.epf или КонтурДиадокПодключаемыйМодуль.epf) как отдельную внешнюю обработку в конфигураторе. Установите точки останова в нужных местах.Следуя этим шагам, мы сможем эффективно отслеживать выполнение кода в подключаемых модулях Диадока, выявлять ошибки и убеждаться в корректности внесенных изменений.
В процессе работы с пакетами документов мы можем столкнуться с параметром LockMode. Давайте разберем его назначение:
Параметр LockMode определяет режим блокировки пакета документов. Он может принимать следующие значения:
None (1): Пакет можно редактировать. Это стандартный режим, когда мы можем добавлять или удалять документы из пакета.Send (2): Пакет нередактируем до момента отправки. После успешной отправки все ограничения на обработку отдельных документов снимаются. Этот режим может быть полезен для обеспечения целостности пакета в процессе подготовки к отправке.Full (3): Пакет нередактируем, и любая операция применяется ко всем документам пакета одновременно. Это самый строгий режим, который гарантирует, что пакет будет обработан как единое целое.В структуре Пакет, которую мы получаем в событии ПослеПодготовкиПакета, есть элемент ПараметрыШаблона, который может содержать LockMode. Мы можем проверять и, при необходимости, изменять это значение, чтобы управлять поведением пакета.
Если ЗначениеЗаполнено(Результат.ПараметрыШаблона.LockMode)
И НРег(Результат.ПараметрыШаблона.LockMode) <> НРег("None") Тогда
Результат.Заблокирован = Истина;
КонецЕсли;
Этот фрагмент кода из ядра показывает, как проверяется и устанавливается флаг Заблокирован на основе значения LockMode. Мы должны учитывать этот параметр при работе с пакетом, особенно если хотим модифицировать его состав.
Надеемся, что этот подробный разбор поможет вам успешно настроить отправку ВПФ для отобранных документов через Диадок и эффективно отлаживать ваши подключаемые модули. Успехов в разработке!
← К списку