При работе с системой 1С:Управление торговлей 11.4 у многих пользователей и разработчиков возникает необходимость формирования электронных документов (ЭДО) в формате XML. Однако часто при попытке выполнения таких операций система запрашивает установку криптозащиты, которая не всегда нужна, особенно если цель — получить XML-файл для анализа, дальнейшей обработки или интеграции без юридически значимой подписи и отправки через оператора ЭДО. В данной статье мы подробно рассмотрим, как обойти необходимость установки криптозащиты для формирования XML-файлов, а также как модифицировать данные в этих файлах, например, изменить номер счета-фактуры.
Прежде чем погрузиться в детали, давайте разберем, как вообще работает механизм формирования электронных документов в 1С. В основе лежит Библиотека стандартных подсистем (БСП), которая предоставляет универсальные функции для работы с ЭДО. Процесс можно условно разделить на несколько этапов:
Наша задача заключается в том, чтобы добраться до этапа 2 или 3, не задействуя этапы 4 и 5, и при этом иметь возможность модифицировать данные на этапе 2.
Первая проблема, с которой сталкивается пользователь, — это требование установить криптозащиту. Это происходит, когда система пытается инициировать процесс, который потенциально может привести к подписанию или отправке документа. Однако для простой выгрузки XML-файла криптозащита не нужна. Система 1С предлагает встроенный функционал для этого.
Разберем по шагам, как выгрузить документ в файл:
После выполнения этих действий система предложит вам выбрать место для сохранения файла. Обычно результатом является ZIP-архив, внутри которого находится XML-файл документа (например, ON_NSCH_... .xml для счета-фактуры или ON_UPD_... .xml для УПД). Этот способ позволяет получить XML-файл без установки криптозащиты на вашем компьютере.
Почему возникает запрос криптозащиты при других действиях?
Если вы пытаетесь нажать "Просмотреть электронный документ" или настроить обмен ЭДО с контрагентом, система может запросить установку криптозащиты. Это происходит, потому что эти действия подразумевают готовность к полноценному юридически значимому обмену, который требует использования электронной подписи. Если у вас нет настроенных правил обмена с контрагентом или не отправлено/принято приглашение к обмену, система считает, что вы только начинаете процесс настройки ЭДО, для которого требуется криптозащита и учетные записи.
Чтобы избежать запроса криптозащиты при просмотре или настройке, вы должны быть уверены, что у вас:
В случае, если вам необходимо просто просмотреть сформированный документ без криптозащиты, но кнопка "Просмотреть электронный документ" вызывает окно установки, выгрузите документ в файл, как описано выше, и откройте XML-файл любым удобным просмотрщиком XML или текстовым редактором.
Основная задача автора темы заключалась в подмене номера счета-фактуры в формируемом XML-файле. Для этого нам необходимо вмешаться в процесс формирования дерева данных, которое затем преобразуется в XML.
Мы выяснили, что формирование документов ЭДО происходит в общих модулях, таких как ОбменСКонтрагентамиУТ. Этот модуль содержит множество функций, связанных с подготовкой данных для обмена. Ключевой процедурой для формирования данных Универсального Передаточного Документа (УПД) в актуальном формате является ЗаполнитьДанныеПервичногоДокументаУПД_2019.
Эта процедура отвечает за сбор всех необходимых данных и их упаковку в структурированное представление (дерево), которое затем будет использоваться для генерации XML. Важно понимать: сама процедура ЗаполнитьДанныеПервичногоДокументаУПД_2019 не генерирует XML-файл напрямую, а только подготавливает данные для его генерации. Именно в этом дереве данных нам и нужно внести изменения.
Представьте, что XML-файл — это конечный продукт, а дерево данных — это его чертеж. Если вы хотите изменить что-то в конечном продукте, вам нужно изменить его чертеж. Таким образом, чтобы подменить номер счета-фактуры (или любое другое поле), мы должны найти соответствующее поле в дереве данных, которое формируется процедурой ЗаполнитьДанныеПервичногоДокументаУПД_2019, и изменить его значение.
Рассмотрим общий подход к модификации:
ЗаполнитьДанныеПервичногоДокументаУПД_2019. Для других документов могут быть аналогичные процедуры (например, ЗаполнитьДанныеПервичногоДокументаСФ_2019 для счета-фактуры).Для внесения изменений в типовой код без снятия конфигурации с поддержки, мы будем использовать расширения конфигурации. Это наиболее предпочтительный и безопасный способ модификации.
Предположим, что процедура ЗаполнитьДанныеПервичногоДокументаУПД_2019 (или аналогичная) принимает параметр, который является структурой для формирования данных, например, СтруктураДанныхДокумента.
Шаг 1: Создайте расширение конфигурации.
Откройте конфигуратор, перейдите в меню "Конфигурация" -> "Расширения конфигурации" -> "Добавить". Дайте расширению понятное имя.
Шаг 2: Добавьте модуль ОбменСКонтрагентамиУТ в расширение с типом "Изменение и контроль".
В дереве расширения найдите "Общие модули", добавьте туда модуль ОбменСКонтрагентамиУТ. Затем в свойствах добавленного модуля установите "Тип расширения" в "Изменение и контроль". Это позволит нам вызвать оригинальную процедуру модуля и затем модифицировать ее результат.
Шаг 3: Переопределите процедуру ЗаполнитьДанныеПервичногоДокументаУПД_2019 (или аналогичную) в расширении.
В модуле расширения, переопределяющем ОбменСКонтрагентамиУТ, вы можете создать процедуру с тем же именем. Однако, поскольку мы хотим внести изменения после того, как типовая процедура уже отработала, мы будем использовать директивы препроцессора.
Пример кода, иллюстрирующий концепцию:
// В расширении, в модуле ОбменСКонтрагентамиУТ, который добавлен с типом "Изменение и контроль"
#ВМЕСТО ЗаполнитьДанныеПервичногоДокументаУПД_2019(ПараметрыЗаполнения, СтруктураДанныхДокумента, ДанныеДокумента, СообщениеОбОшибке)
// Вызываем оригинальную процедуру, чтобы она заполнила СтруктураДанныхДокумента
ПродолжитьВызов(ПараметрыЗаполнения, СтруктураДанныхДокумента, ДанныеДокумента, СообщениеОбОшибке);
// ********************************************************************************
// Здесь начинается наша логика для модификации данных
// ********************************************************************************
// Пример: Ищем поле с номером счета-фактуры в структуре данных
// Точный путь к полю зависит от формата документа и версии конфигурации.
// Часто это что-то вроде СтруктураДанныхДокумента.Документ.СвСчФакт.НомерСчФ
// Или более сложная иерархия. Нужно отлаживаться, чтобы найти точный путь.
Если СтруктураДанныхДокумента.Свойство("Документ") Тогда
Если СтруктураДанныхДокумента.Документ.Свойство("СвСчФакт") Тогда
// Допустим, мы хотим добавить префикс к номеру счета-фактуры
// Или полностью его заменить
ТекущийНомерСчетаФактуры = СтруктураДанныхДокумента.Документ.СвСчФакт.НомерСчФ;
НовыйНомерСчетаФактуры = "ПРФ_" + ТекущийНомерСчетаФактуры; // Пример модификации
СтруктураДанныхДокумента.Документ.СвСчФакт.НомерСчФ = НовыйНомерСчетаФактуры;
// Или, если это УПД и номер находится в другом месте
// Например, для функции ДОП
Если СтруктураДанныхДокумента.Документ.Свойство("Функция") И СтруктураДанныхДокумента.Документ.Функция = "ДОП" Тогда
Если СтруктураДанныхДокумента.Документ.Свойство("СвПрПереД") Тогда
Если СтруктураДанныхДокумента.Документ.СвПрПереД.Свойство("СвСчФакт") Тогда
// Если в УПД номер СФ находится здесь
ТекущийНомерСФ_УПД = СтруктураДанныхДокумента.Документ.СвПрПереД.СвСчФакт.НомерСчФ;
НовыйНомерСФ_УПД = "УПД-" + ТекущийНомерСФ_УПД;
СтруктураДанныхДокумента.Документ.СвПрПереД.СвСчФакт.НомерСчФ = НовыйНомерСФ_УПД;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Допустим, также требуется изменить дату счета-фактуры
// СтруктураДанныхДокумента.Документ.СвСчФакт.ДатаСчФ = Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd");
// ИЛИ, если нам нужно получить номер из другого источника,
// например, из справочника настроек или функции:
// СтруктураДанныхДокумента.Документ.СвСчФакт.НомерСчФ = ПолучитьМойОсобыйНомерСчетаФактуры();
КонецЕсли;
КонецЕсли;
// Также можно модифицировать другие поля, если необходимо
// Например, добавить дополнительную информацию
// СтруктураДанныхДокумента.ДополнительныеДанные.НовоеПоле = "МоеЗначение";
#КонецВместо
Важные моменты при использовании #ВМЕСТО и ПродолжитьВызов():
#ВМЕСТО полностью заменяет типовой код процедуры на ваш код в расширении.ПродолжитьВызов() внутри #ВМЕСТО позволяет вызвать оригинальную типовую процедуру. Это крайне важно, чтобы типовая логика формирования данных все равно отработала, и вы могли уже над готовыми данными произвести свои изменения.СтруктураДанныхДокумента, поставьте точку останова после вызова ПродолжитьВызов() и проанализируйте содержимое переменной СтруктураДанныхДокумента в отладчике.Именно таким способом автор темы смог решить свою задачу, внеся изменения в ЗаполнитьДанныеПервичногоДокументаУПД_2019 через расширение в режиме "Изменение и контроль".
В процессе работы с 1С мы часто сталкиваемся с установкой патчей (исправлений), которые выпускает фирма "1С" для устранения ошибок или добавления функциональности. Патчи, по сути, являются специальными расширениями конфигурации, которые вносятся автоматически и могут изменять поведение типового кода.
Автор темы столкнулся с ситуацией, когда наличие патча EF_00_00421529 мешало работе его расширения или вносило нежелательные изменения в процесс формирования документа. После удаления этого патча функциональность заработала так, как ожидалось.
Как патчи могут влиять на ваши доработки:
Решение проблемы с патчами:
#ВМЕСТО и ПродолжитьВызов() часто является лучшим способом справиться с изменениями в типовом коде, поскольку он позволяет вызвать типовую логику и затем применить свои изменения, что делает его более устойчивым к мелким изменениям в базовой конфигурации.В данном случае, удаление патча EF_00_00421529 оказалось эффективным решением. Однако помните, что удаление патчей может быть рискованным, так как они могли устранять важные ошибки. Всегда проводите такие операции на тестовых копиях баз и с полным пониманием возможных последствий.
Следуя этим рекомендациям, вы сможете эффективно работать с механизмом ЭДО в 1С:УТ 11.4, адаптируя его под свои нужды, сохраняя при этом стабильность и поддерживаемость системы.