Как программно добавить дополнительные реквизиты счета-фактуры при выгрузке в Диадок из 1С

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

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

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

Зачем нужен подключаемый модуль?

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


Шаг 1. Как получить шаблон подключаемого модуля

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

  1. Через интерфейс обработки Диадок:

    Откроем обработку Диадока в режиме «1С:Предприятие». Перейдем в «Настройки» — «Расширенные настройки» — вкладка «Подключаемый модуль». Нажмем кнопку «Сохранить шаблон подключаемого модуля на диск» и выберем каталог для сохранения файла .epf.

  2. Извлечением из макета (для старых версий):

    Если кнопка сохранения недоступна, откроем основную обработку Диадока в Конфигураторе 1С. Перейдем в раздел макетов, найдем макет конфигурации соответствующего модуля интеграции и сохраним его на жесткий диск как внешнюю обработку.

  3. С помощью встроенных плагинов:

    В современных версиях обработки Диадок во вкладке «Плагины» доступен инструмент «Генератор подключаемого модуля». Он позволяет интерактивно сгенерировать ПМ под конкретные задачи автоматизации.


Шаг 2. Написание кода для выгрузки дополнительных реквизитов

Откроем сохраненный шаблон внешней обработки в Конфигураторе 1С. В зависимости от версии Диадока и используемых форматов документов (например, УПД по приказу ФНС № 820 или № 970), заполнение данных происходит в разных событиях.

Разберем классический пример заполнения события ОбработатьСобытиеПослеЗаполненияКонтента для формата УПД (XmlUTD). Наша задача — получить значение дополнительного реквизита «Номер заказа» и добавить его в коллекцию иных сведений документа AdditionalInfoId.StructedAdditionalInfos. Для быстрого поиска готовых программных конструкций пригодится справочник по методам БСП с примерами кода.

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


Функция ОбработатьСобытиеПослеЗаполненияКонтента(Параметры) Экспорт
    
    // Получаем тип документа и его текущую структуру данных
    DocumentType = Параметры.ТипДокумента;
    Content = Параметры.Контент;
    ДокументСсылка = Параметры.ДокументСсылка;
    
    // Обрабатываем формат УПД (XmlUTD) или обычный Счет-фактуру (Invoice)
    Если DocumentType = "XmlUTD" Или DocumentType = "Invoice" Тогда
        
        // Поиск свойства по наименованию в конфигурации 1С
        СвойствоНомерЗаказа = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Номер заказа");
        
        Если ЗначениеЗаполнено(СвойствоНомерЗаказа) Тогда
            // Извлекаем значение доп. реквизита с помощью БСП
            ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(ДокументСсылка, СвойствоНомерЗаказа);
            
            Если ЗначениеЗаполнено(ЗначениеСвойства) Тогда
                СтрокаНомераЗаказа = СокрЛП(Строка(ЗначениеСвойства));
                
                // Проверим инициализацию структур в XML-контенте Диадока
                Если Content.AdditionalInfoId = Неопределено Тогда
                    Content.Вставить("AdditionalInfoId", Новый Структура("StructedAdditionalInfos", Новый Массив));
                ИначеЕсли Content.AdditionalInfoId.StructedAdditionalInfos = Неопределено Тогда
                    Content.AdditionalInfoId.Вставить("StructedAdditionalInfos", Новый Массив);
                КонецЕсли;
                
                // Добавим наше значение в коллекцию дополнительных полей
                НовоеДопСведение = Новый Структура("Key, Value", "Номер заказа", СтрокаНомераЗаказа);
                Content.AdditionalInfoId.StructedAdditionalInfos.Добавить(НовоеДопСведение);
            КонецЕсли;
        КонецЕсли;
        
        Возврат Content;
        
    КонецЕсли;    
    
КонецФункции

В более новых версиях универсального модуля Диадока рекомендуется использовать экспортную процедуру ПодготовитьЭлектронныйДокумент. Разберем реализацию для этого события:


Процедура ПодготовитьЭлектронныйДокумент(Параметры) Экспорт
    
    // Проверим наличие необходимых ключей в структуре параметров
    Если Не Параметры.Свойство("Контент") Или Не Параметры.Свойство("ДокументСсылка") Тогда
        Возврат;
    КонецЕсли;
    
    Контент = Параметры.Контент;
    ДокументСсылка = Параметры.ДокументСсылка;
    
    // Получаем ссылку на доп. свойство
    СвойствоНомерЗаказа = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Номер заказа");
    
    Если ЗначениеЗаполнено(СвойствоНомерЗаказа) Тогда
        ЗначениеРеквизита = УправлениеСвойствами.ЗначениеСвойства(ДокументСсылка, СвойствоНомерЗаказа);
        
        Если ЗначениеЗаполнено(ЗначениеРеквизита) Тогда
            // Убедимся, что структуры для дополнительных сведений подготовлены
            Если Не Контент.Свойство("AdditionalInfoId") Или Контент.AdditionalInfoId = Неопределено Тогда
                Контент.Вставить("AdditionalInfoId", Новый Структура("StructedAdditionalInfos", Новый Массив));
            КонецЕсли;
            
            // Формируем структуру и добавляем ее в коллекцию Диадока
            НоваяИнфоСтрока = Новый Структура("Key, Value", "Номер заказа", Строка(ЗначениеРеквизита));
            Контент.AdditionalInfoId.StructedAdditionalInfos.Добавить(НоваяИнфоСтрока);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

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


Шаг 3. Подключение и регистрация модуля в системе 1С

После написания кода сохраним изменения во внешней обработке в Конфигураторе.

  1. Откроем 1С в режиме «1С:Предприятие» под пользователем с правами администратора.
  2. Перейдем в меню Администрирование — Печатные формы, отчеты и обработки — Дополнительные отчеты и обработки.
  3. Нажмем кнопку «Добавить из файла» и загрузим наш сохраненный файл ПМ (обработку .epf). Зададим наименование и сохраним изменения.
  4. Откроем обработку Диадока, перейдем в Настройки — Расширенные настройки — Подключаемый модуль.
  5. Укажем способ подключения: «стандартный справочник Дополнительные отчеты и обработки» и выберем созданную ранее запись.

Шаг 4. Настройка отладки подключаемого модуля

Часто в процессе разработки возникает необходимость отладить код ПМ «на лету» в реальной сессии отправки документов. Поскольку обработка вызывается Диадоком динамически, обычные точки останова в Конфигураторе могут не срабатывать. Выясним, как настроить отладку правильно:

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

Важно: По окончании отладочных работ обязательно снимите флаг «Режим отладки» в Диадоке и обновите бинарный файл обработки в справочнике «Дополнительные отчеты и обработки», чтобы изменения вступили в силу для всех пользователей информационной базы.

← На главную