Как получить ссылку на документ Электронная Транспортная Накладная из вспомогательных форм титулов

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

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

Анализ архитектуры форм ЭТН

Первым делом проанализируем ситуацию. В обычных документах 1С основная форма редактирования всегда содержит реквизит Объект с типом ДокументОбъект. Однако в случае с Электронными Транспортными Накладными (ЭТН) структура гораздо сложнее. Форма ТитулГрузоотправителяГрузы не является формой самого документа. Она предназначена для редактирования конкретного раздела XML-файла (титула), который будет отправлен через оператора ЭДО.

Выясним причину ошибки «Поле объекта не обнаружено (Ссылка)». Когда мы пишем ЭтотОбъект.Ссылка или пытаемся найти ссылку в табличной части, система выдает ошибку, так как в данной форме нет программной связи с физической записью в базе данных через стандартный механизм ДокументОбъект. Данные в этих формах часто являются временными структурами, которые сериализуются в XML «на лету».

Способ 1: Получение ссылки через владельца формы

Если вспомогательная форма открыта из основной формы документа ЭлектроннаяТранспортнаяНакладная, мы можем попытаться обратиться к её владельцу. В управляемом приложении свойство ВладелецФормы (или просто Владелец в контексте формы) позволяет достучаться до контекста вызывающей формы.

Рассмотрим пример кода, который можно разместить в процедуре ПриСозданииНаСервере или в обработчике заполнения данных:


// Проверим, является ли владелец формой и есть ли у него нужный реквизит
Если ТипЗнч(ЭтаФорма.Владелец) = Тип("АвтотестированиеУправляемаяФорма") Тогда
    // В режиме отладки или автотестов контекст может отличаться
ИначеЕсли ЭтаФорма.Владелец <> Неопределено Тогда
    Попытка
        СсылкаНаДокумент = ЭтаФорма.Владелец.Объект.Ссылка;
        Сообщить("Ссылка на ЭТН получена через владельца: " + СсылкаНаДокумент);
    Исключение
        // Если у владельца нет реквизита Объект, обрабатываем ошибку
        СсылкаНаДокумент = Неопределено;
    КонецПопытки;
КонецЕсли;

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

Способ 2: Использование параметров открытия формы

В современных конфигурациях 1С данные между формами передаются через структуру Параметры. Посмотрим на пример, как можно извлечь ссылку на документ-основание или саму ЭТН, если она была передана при открытии.

Проанализируем состав параметров в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Попробуем найти ссылку в стандартных ключах БЭДО
    Если Параметры.Свойство("ДокументОснование") Тогда
        МСсылка = Параметры.ДокументОснование;
    ИначеЕсли Параметры.Свойство("ИсточникДанных") Тогда
        МСсылка = Параметры.ИсточникДанных;
    ИначеЕсли Параметры.Свойство("КонтекстЭДО") И ТипЗнч(Параметры.КонтекстЭДО) = Тип("Структура") Тогда
        // В ключе КонтекстЭДО часто хранится вся информация о текущей сессии
        Параметры.КонтекстЭДО.Свойство("Документ", МСсылка);
    КонецЕсли;

    Если ЗначениеЗаполнено(МСсылка) Тогда
        // Теперь мы можем использовать МСсылка для построения запроса
        ЗаполнитьВесовыеХарактеристики(МСсылка);
    КонецЕсли;
    
КонецПроцедуры

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

Способ 3: Работа с регистрами сведений ЭДО

Рассмотрим ситуацию, когда форма ТитулГрузоотправителяГрузы работает в режиме «отвязанном» от конкретного объекта документа. Как было отмечено в обсуждении, данные ЭТН часто не хранятся в реквизитах самого документа, а распределены по специальным регистрам.

Если нам нужно получить вес (Нетто, Брутто) или количество мест из документа-основания (например, РеализацияТоваровУслуг), нам необходимо сначала найти этот документ. Выполним запрос к регистру сведений, который связывает электронные документы с объектами учета:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   СостоянияПоОбъектамУчетаЭДО.ОбъектУчета КАК ДокументОснование
    |ИЗ
    |   РегистрСведений.СостоянияПоОбъектамУчетаЭДО КАК СостоянияПоОбъектамУчетаЭДО
    |ГДЕ
    |   СостоянияПоОбъектамУчетаЭДО.ЭлектронныйДокумент = &ЭлектронныйДокумент";

Запрос.УстановитьПараметр("ЭлектронныйДокумент", ТекущийЭлектронныйДокумент);
Результат = Запрос.Выполнить();

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

Диагностика без отладчика

Разберем ситуацию, когда отладчик недоступен (например, на закрытом тестовом сервере). В этом случае мы рекомендуем использовать метод записи в Журнал Регистрации для «простукивания» доступных реквизитов. Это позволит увидеть, какие данные реально приходят в форму.

Пример кода для диагностики:


Для Каждого КлючИЗначение Из Параметры Цикл
    ЗаписьЖурналаРегистрации("Диагностика_ЭТН", УровеньЖурналаРегистрации.Информация, , , 
        "Ключ: " + КлючИЗначение.Ключ + "; Значение: " + КлючИЗначение.Значение);
КонецЦикла;

После запуска формы откройте Журнал Регистрации в режиме Предприятия и проанализируйте записи. Вы увидите все доступные ключи в структуре Параметры.

Подведение итогов

Подводя итог, можно выделить следующие правила работы с формами титулов ЭТН:

  1. Не ищите реквизит Объект: В вспомогательных формах титулов его чаще всего нет.
  2. Используйте параметры: Ищите ссылку на документ в Параметры.ИсточникДанных или Параметры.ДокументОснование.
  3. Обращайтесь к владельцу: Используйте ЭтаФорма.Владелец, если форма открыта из основного интерфейса ЭТН.
  4. Используйте API БЭДО: Многие данные (вес, объем) проще получить через вызов функций общих модулей типа ЭлектронныйДокументооборотЭТН, передав им контекст формы.

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

← На главную