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