При работе с модулем электронного документооборота Диадок в 1С часто возникает задача по кастомизации выгружаемых данных. Одна из таких задач — исключить характеристики номенклатуры из состава электронного документа (например, УПД) при отправке контрагенту. Сложность заключается не только в поиске нужного фрагмента кода, но и в его отладке, поскольку основная логика модуля Диадок скрыта в макетах, что делает стандартные средства отладки 1С неэффективными. При необходимости гибко настраивать значения реквизитов документа под требования контрагентов можно использовать расширение для заполнения полей УПД в ЭДО нужными значениями.
В этой статье мы подробно разберем, как найти и изменить код, отвечающий за формирование табличной части документа, и какие методы использовать для отладки, когда точки останова не работают.
Прежде чем приступать к изменениям, важно понять, почему возникают трудности. Модуль интеграции Диадок построен таким образом, что значительная часть его исполняемого кода хранится не в основной конфигурации, а во вложенных макетах внутри основной обработки. Когда вы запускаете обработку, она динамически извлекает этот код из макетов и выполняет его.
Для отладчика 1С этот код является «чужим» и временно созданным. Как справедливо заметили на форуме, Диадок как бы "заново" создает модули при каждом открытии. Из-за этого точки останова, которые вы могли бы попытаться установить в коде, выгруженном из макета, просто не срабатывают. Система не связывает открытый вами для редактирования файл с тем кодом, который исполняется в памяти в данный момент. Это ключевая причина, по которой приходится искать обходные пути для отладки.
Этот метод является самым быстрым способом решить поставленную задачу, хотя и требует ручного вмешательства при каждом обновлении модуля Диадок. Суть заключается в том, чтобы найти и изменить SQL-запрос, который собирает данные для табличной части документа.
Рассмотрим пошаговый процесс:
ТиповойМодульДиадокУФ. Сохраните этот макет на диск через контекстное меню ("Сохранить как...").Модуль_ИнтеграцияУТ11. Выгрузите уже этот вложенный макет в отдельный файл (например, Модуль_ИнтеграцияУТ11.txt или сохранить как внешнюю обработку).СформироватьЗапрос_ДанныеТЧ_ПоРеализацияТоваровУслуг.Внутри этой процедуры находится текст запроса. Ваша задача — найти строку, где выбирается поле Характеристика, и заменить ее на выбор пустой строки.
Посмотрим на пример кода. Вот как выглядел исходный запрос:
Процедура СформироватьЗапрос_ДанныеТЧ_ПоРеализацияТоваровУслуг(Запрос, КолонкаКодаТовара, СсылкаНаДокумент)
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Подзапрос.НомерСтроки КАК НомерСтроки,
| Подзапрос.Номенклатура КАК Номенклатура,
| Подзапрос.НоменклатураПредставление КАК НоменклатураПредставление,
| Подзапрос.Характеристика КАК Характеристика,
| Подзапрос.Серия КАК Серия,
| Подзапрос.КодНоменклатуры КАК КодНоменклатуры,
| Подзапрос.Количество КАК Количество,
| Подзапрос.КоличествоПоРНПТ КАК КоличествоПоРНПТ,
| Подзапрос.Цена КАК Цена,
| ...";
КонецПроцедуры
А вот как он выглядит после модификации. Мы комментируем строку с характеристикой и добавляем новую, которая всегда возвращает пустую строку под тем же псевдонимом:
Процедура СформироватьЗапрос_ДанныеТЧ_ПоРеализацияТоваровУслуг(Запрос, КолонкаКодаТовара, СсылкаНаДокумент)
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Подзапрос.НомерСтроки КАК НомерСтроки,
| Подзапрос.Номенклатура КАК Номенклатура,
| Подзапрос.НоменклатураПредставление КАК НоменклатураПредставление,
// | Подзапрос.Характеристика КАК Характеристика, // Старую строку комментируем
| """" КАК Характеристика, // Добавляем новую, возвращающую пустую строку
| Подзапрос.Серия КАК Серия,
| Подзапрос.КодНоменклатуры КАК КодНоменклатуры,
| Подзапрос.Количество КАК Количество,
| Подзапрос.КоличествоПоРНПТ КАК КоличествоПоРНПТ,
| Подзапрос.Цена КАК Цена,
| ...";
КонецПроцедуры
Модуль_ИнтеграцияУТ11 обратно во вложенный макет, а затем сохраните и загрузите основной макет ТиповойМодульДиадокУФ обратно в обработку в конфигурации.Важный момент: Иногда изменения не применяются сразу из-за кэширования. Может потребоваться перезапуск 1С или очистка кэша. В некоторых случаях, как было отмечено на форуме, изменения подхватываются после нажатия кнопки "Выгрузить обработки" на основной форме Диадока.
Разработчики Диадока предусмотрели штатный механизм кастомизации — «Подключаемый модуль». Он позволяет переопределять стандартные функции, не изменяя исходный код обработки. Это более правильный и устойчивый к обновлениям подход.
Рассмотрим шаги для его настройки:
Модуль_ИнтеграцияУТ11) из макетов. Сохраните его на диск как внешнюю обработку с расширением .epf. Например, ПодключаемыйМодульДиадок_Кастомный.epf..epf. После указания пути обычно есть кнопка для проверки, которая сообщит об успешной инициализации модуля..epf в конфигураторе. В этом файле вы можете создать свои собственные реализации функций, которые будут вызываться вместо стандартных. В нашем случае нужно будет переопределить логику формирования табличной части. Найдите в исходном модуле функцию, отвечающую за это (например, ДанныеТабличныхЧастей(Шапка) или СформироватьЗапрос_ДанныеТЧ_ПоРеализацияТоваровУслуг), скопируйте ее в свой .epf-файл и внесите необходимые изменения, как в первом способе.Этот способ сложнее в первоначальной настройке, но все ваши доработки будут находиться в отдельном файле, и при обновлении модуля Диадок вам не придется заново вносить все правки.
Мы выяснили, что стандартная отладка не работает. Как же тогда проверять код и значения переменных? Основной метод, подтвержденный опытом многих разработчиков, — это логирование с помощью диагностических сообщений.
Метод Сообщить():
Самый простой способ — вставлять в ключевые точки кода оператор Сообщить(). Это позволит вам видеть, выполняется ли определенный участок кода, и какие значения принимают переменные в этот момент.
Например, чтобы проверить, какая номенклатура обрабатывается в цикле, можно написать так:
Для Каждого СтрокаТЧ из ТабличнаяЧасть Цикл
Сообщить("Обрабатывается номенклатура: " + СтрокаТЧ.Номенклатура + ", Характеристика: " + СтрокаТЧ.Характеристика);
// ... остальной код ...
КонецЦикла
Этот метод очень эффективен для пошагового анализа логики, хоть и требует постоянного изменения кода и перезапуска операций.
Включение режима отладки Диадок:
В общих настройках модуля Диадок есть опция "Режим отладки". Ее включение активирует расширенное логирование со стороны самого модуля. Это не позволит ставить точки останова, но может дать много полезной информации в служебных сообщениях или лог-файлах, что поможет локализовать проблему.
В заключение, задача по изменению логики модуля Диадок вполне решаема. Главное — понимать особенности его архитектуры и использовать подходящие инструменты. Для быстрых правок подойдет прямое редактирование макета, а для долгосрочных доработок лучше освоить механизм «Подключаемого модуля». А для отладки вашим лучшим другом станет старый добрый оператор Сообщить().