Как сформировать XML-документ ЭДО в 1С:УТ 11.4 без криптозащиты и изменить его данные?

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

При работе с системой 1С:Управление торговлей 11.4 у многих пользователей и разработчиков возникает необходимость формирования электронных документов (ЭДО) в формате XML. Однако часто при попытке выполнения таких операций система запрашивает установку криптозащиты, которая не всегда нужна, особенно если цель — получить XML-файл для анализа, дальнейшей обработки или интеграции без юридически значимой подписи и отправки через оператора ЭДО. В данной статье мы подробно рассмотрим, как обойти необходимость установки криптозащиты для формирования XML-файлов, а также как модифицировать данные в этих файлах, например, изменить номер счета-фактуры.

Понимание процесса формирования ЭДО в 1С:УТ 11.4

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

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

Наша задача заключается в том, чтобы добраться до этапа 2 или 3, не задействуя этапы 4 и 5, и при этом иметь возможность модифицировать данные на этапе 2.

Как просмотреть и выгрузить документ ЭДО в файл без криптозащиты

Первая проблема, с которой сталкивается пользователь, — это требование установить криптозащиту. Это происходит, когда система пытается инициировать процесс, который потенциально может привести к подписанию или отправке документа. Однако для простой выгрузки XML-файла криптозащита не нужна. Система 1С предлагает встроенный функционал для этого.

Разберем по шагам, как выгрузить документ в файл:

  1. Откройте список документов "Реализации (акты, накладные)". Для этого перейдите в раздел "Продажи" и выберите соответствующий пункт меню.
  2. Найдите и выберите нужный документ. Это может быть счет-фактура, УПД или любой другой документ, для которого вы хотите получить XML-файл. Документ должен быть проведен.
  3. Воспользуйтесь опцией "Выгрузить документ в файл". Нажмите кнопку "Ещё" в командной панели формы списка или формы документа, затем выберите пункт "ЭДО" и далее "Выгрузить документ в файл".

После выполнения этих действий система предложит вам выбрать место для сохранения файла. Обычно результатом является ZIP-архив, внутри которого находится XML-файл документа (например, ON_NSCH_... .xml для счета-фактуры или ON_UPD_... .xml для УПД). Этот способ позволяет получить XML-файл без установки криптозащиты на вашем компьютере.

Почему возникает запрос криптозащиты при других действиях?

Если вы пытаетесь нажать "Просмотреть электронный документ" или настроить обмен ЭДО с контрагентом, система может запросить установку криптозащиты. Это происходит, потому что эти действия подразумевают готовность к полноценному юридически значимому обмену, который требует использования электронной подписи. Если у вас нет настроенных правил обмена с контрагентом или не отправлено/принято приглашение к обмену, система считает, что вы только начинаете процесс настройки ЭДО, для которого требуется криптозащита и учетные записи.

Чтобы избежать запроса криптозащиты при просмотре или настройке, вы должны быть уверены, что у вас:

  1. Уже есть настроенный обмен ЭДО с контрагентом. Это означает, что контрагент добавлен в настройки ЭДО, приглашение к обмену отправлено и принято, и соответствующая учетная запись ЭДО настроена.
  2. Вы работаете с документом для контрагента, у которого уже есть настроенный обмен. На копии базы, где нет связи с оператором ЭДО, такие настройки могут отсутствовать или быть некорректными, что и приводит к запросу криптозащиты.

В случае, если вам необходимо просто просмотреть сформированный документ без криптозащиты, но кнопка "Просмотреть электронный документ" вызывает окно установки, выгрузите документ в файл, как описано выше, и откройте XML-файл любым удобным просмотрщиком XML или текстовым редактором.

Изменение данных при формировании XML-файла (например, номера счета-фактуры)

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

Поиск нужной процедуры

Мы выяснили, что формирование документов ЭДО происходит в общих модулях, таких как ОбменСКонтрагентамиУТ. Этот модуль содержит множество функций, связанных с подготовкой данных для обмена. Ключевой процедурой для формирования данных Универсального Передаточного Документа (УПД) в актуальном формате является ЗаполнитьДанныеПервичногоДокументаУПД_2019.

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

Принцип модификации данных через дерево

Представьте, что XML-файл — это конечный продукт, а дерево данных — это его чертеж. Если вы хотите изменить что-то в конечном продукте, вам нужно изменить его чертеж. Таким образом, чтобы подменить номер счета-фактуры (или любое другое поле), мы должны найти соответствующее поле в дереве данных, которое формируется процедурой ЗаполнитьДанныеПервичногоДокументаУПД_2019, и изменить его значение.

Рассмотрим общий подход к модификации:

  1. Определите, какой документ формируется. Это может быть счет-фактура, УПД и т.д.
  2. Найдите соответствующую процедуру формирования данных. Для УПД это ЗаполнитьДанныеПервичногоДокументаУПД_2019. Для других документов могут быть аналогичные процедуры (например, ЗаполнитьДанныеПервичногоДокументаСФ_2019 для счета-фактуры).
  3. Изучите структуру формируемого дерева данных. Процедура обычно заполняет какой-либо параметр типа "Структура" или "Соответствие", в котором содержатся все будущие поля XML. Вам нужно найти путь к интересующему вас полю (например, номер счета-фактуры) внутри этой структуры. Это можно сделать путем отладки или анализа кода процедуры.
  4. Внесите изменения в это поле. Как только вы найдете нужное поле, вы можете изменить его значение.

Пример концептуального изменения через расширение

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

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

Шаг 1: Создайте расширение конфигурации.

Откройте конфигуратор, перейдите в меню "Конфигурация" -> "Расширения конфигурации" -> "Добавить". Дайте расширению понятное имя.

Шаг 2: Добавьте модуль ОбменСКонтрагентамиУТ в расширение с типом "Изменение и контроль".

В дереве расширения найдите "Общие модули", добавьте туда модуль ОбменСКонтрагентамиУТ. Затем в свойствах добавленного модуля установите "Тип расширения" в "Изменение и контроль". Это позволит нам вызвать оригинальную процедуру модуля и затем модифицировать ее результат.

Шаг 3: Переопределите процедуру ЗаполнитьДанныеПервичногоДокументаУПД_2019 (или аналогичную) в расширении.

В модуле расширения, переопределяющем ОбменСКонтрагентамиУТ, вы можете создать процедуру с тем же именем. Однако, поскольку мы хотим внести изменения после того, как типовая процедура уже отработала, мы будем использовать директивы препроцессора.

Пример кода, иллюстрирующий концепцию:


// В расширении, в модуле ОбменСКонтрагентамиУТ, который добавлен с типом "Изменение и контроль"

#ВМЕСТО ЗаполнитьДанныеПервичногоДокументаУПД_2019(ПараметрыЗаполнения, СтруктураДанныхДокумента, ДанныеДокумента, СообщениеОбОшибке)

    // Вызываем оригинальную процедуру, чтобы она заполнила СтруктураДанныхДокумента
    ПродолжитьВызов(ПараметрыЗаполнения, СтруктураДанныхДокумента, ДанныеДокумента, СообщениеОбОшибке);

    // ********************************************************************************
    // Здесь начинается наша логика для модификации данных
    // ********************************************************************************

    // Пример: Ищем поле с номером счета-фактуры в структуре данных
    // Точный путь к полю зависит от формата документа и версии конфигурации.
    // Часто это что-то вроде СтруктураДанныхДокумента.Документ.СвСчФакт.НомерСчФ
    // Или более сложная иерархия. Нужно отлаживаться, чтобы найти точный путь.

    Если СтруктураДанныхДокумента.Свойство("Документ") Тогда
        Если СтруктураДанныхДокумента.Документ.Свойство("СвСчФакт") Тогда
            // Допустим, мы хотим добавить префикс к номеру счета-фактуры
            // Или полностью его заменить
            ТекущийНомерСчетаФактуры = СтруктураДанныхДокумента.Документ.СвСчФакт.НомерСчФ;
            НовыйНомерСчетаФактуры = "ПРФ_" + ТекущийНомерСчетаФактуры; // Пример модификации
            СтруктураДанныхДокумента.Документ.СвСчФакт.НомерСчФ = НовыйНомерСчетаФактуры;

            // Или, если это УПД и номер находится в другом месте
            // Например, для функции ДОП
            Если СтруктураДанныхДокумента.Документ.Свойство("Функция") И СтруктураДанныхДокумента.Документ.Функция = "ДОП" Тогда
                Если СтруктураДанныхДокумента.Документ.Свойство("СвПрПереД") Тогда
                    Если СтруктураДанныхДокумента.Документ.СвПрПереД.Свойство("СвСчФакт") Тогда
                        // Если в УПД номер СФ находится здесь
                        ТекущийНомерСФ_УПД = СтруктураДанныхДокумента.Документ.СвПрПереД.СвСчФакт.НомерСчФ;
                        НовыйНомерСФ_УПД = "УПД-" + ТекущийНомерСФ_УПД;
                        СтруктураДанныхДокумента.Документ.СвПрПереД.СвСчФакт.НомерСчФ = НовыйНомерСФ_УПД;
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;

            // Допустим, также требуется изменить дату счета-фактуры
            // СтруктураДанныхДокумента.Документ.СвСчФакт.ДатаСчФ = Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd");

            // ИЛИ, если нам нужно получить номер из другого источника,
            // например, из справочника настроек или функции:
            // СтруктураДанныхДокумента.Документ.СвСчФакт.НомерСчФ = ПолучитьМойОсобыйНомерСчетаФактуры();

        КонецЕсли;
    КонецЕсли;

    // Также можно модифицировать другие поля, если необходимо
    // Например, добавить дополнительную информацию
    // СтруктураДанныхДокумента.ДополнительныеДанные.НовоеПоле = "МоеЗначение";

#КонецВместо

Важные моменты при использовании #ВМЕСТО и ПродолжитьВызов():

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

Именно таким способом автор темы смог решить свою задачу, внеся изменения в ЗаполнитьДанныеПервичногоДокументаУПД_2019 через расширение в режиме "Изменение и контроль".

Устранение проблем, связанных с патчами

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

Автор темы столкнулся с ситуацией, когда наличие патча EF_00_00421529 мешало работе его расширения или вносило нежелательные изменения в процесс формирования документа. После удаления этого патча функциональность заработала так, как ожидалось.

Как патчи могут влиять на ваши доработки:

  1. Изменение базового кода: Патч может изменить ту же процедуру или функцию, которую вы пытаетесь модифицировать своим расширением. Это может привести к конфликтам или к тому, что ваше изменение будет работать некорректно, если патч имеет более высокий приоритет или его изменения перекрывают ваши.
  2. Изменение структуры данных: Патч может изменить структуру данных, формируемую в процедурах, что сделает ваш код, ориентированный на старую структуру, неработоспособным.
  3. Приоритет расширений: В 1С есть механизм приоритета расширений. Если патч имеет более высокий приоритет, чем ваше расширение, его изменения будут применены последними, потенциально отменяя ваши доработки.

Решение проблемы с патчами:

  1. Идентификация конфликтующего патча: Если после внедрения вашего расширения что-то перестало работать или работает не так, как ожидалось, первым делом проверьте список установленных патчей. Если недавно был установлен новый патч, попробуйте временно его отключить или удалить (если это возможно и безопасно для работы), чтобы проверить, не является ли он причиной проблемы.
  2. Анализ изменений патча: В идеале, если вы имеете доступ к содержимому патча (обычно они приходят в виде файлов расширений с соответствующими именами), вы можете проанализировать, какие именно изменения он вносит и как они могут влиять на ваш код.
  3. Обновление расширения: Если патч вносит критические изменения в типовую конфигурацию, вам, скорее всего, потребуется обновить ваше расширение, чтобы оно учитывало новые изменения. Это может включать корректировку путей к данным, изменение логики и т.д.
  4. Использование расширений с перехватом: Метод с #ВМЕСТО и ПродолжитьВызов() часто является лучшим способом справиться с изменениями в типовом коде, поскольку он позволяет вызвать типовую логику и затем применить свои изменения, что делает его более устойчивым к мелким изменениям в базовой конфигурации.

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

Общие рекомендации и лучшие практики

  1. Используйте расширения: Всегда стремитесь к использованию расширений для модификации типового функционала. Это позволяет сохранить конфигурацию на поддержке, упрощает процесс обновлений и минимизирует риски конфликтов.
  2. Осторожность с изменениями форматов ЭДО: Форматы XML для электронных документов (например, счета-фактуры, УПД) строго регламентируются ФНС России. Самостоятельное изменение структуры XML формализованных документов, предназначенных для юридически значимого обмена, может привести к тому, что документ будет отклонен оператором ЭДО или контролирующими органами. Модификации, подобные изменению номера, должны быть строго обоснованы и согласованы с требованиями бизнеса и законодательства.
  3. Отладка — ваш лучший друг: При работе с такими сложными механизмами, как формирование ЭДО, отладка является незаменимым инструментом. Используйте точки останова для пошагового выполнения кода и анализа содержимого переменных.
  4. Документация и сообщество: Всегда обращайтесь к официальной документации 1С и ресурсам сообщества. Часто там можно найти информацию о структуре внутренних объектов и методах работы с ними.
  5. Тестирование: Любые изменения в функционале формирования документов должны быть тщательно протестированы на тестовых данных, прежде чем будут перенесены в рабочую базу.

Следуя этим рекомендациям, вы сможете эффективно работать с механизмом ЭДО в 1С:УТ 11.4, адаптируя его под свои нужды, сохраняя при этом стабильность и поддерживаемость системы.

← На главную