Как вывести ссылку на созданный документ в таблицу внешней обработки

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

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

Разбор типичной ошибки при получении ссылки

Проанализируем ситуацию, когда программист пытается получить ссылку на новый документ. Часто в коде встречается использование метода ПолучитьСсылку(УникальныйИдентификатор). Это методически неверно в контексте создания нового объекта. Метод ПолучитьСсылку обычно применяется для предварительной генерации ссылки (GUID) до записи объекта, либо для формирования ссылки на основе уже известного идентификатора.

Выясним причину ошибки: когда вы вызываете НовыйДокумент.Записать(), платформа сама создает ссылку в базе данных. После этого момента свойство НовыйДокумент.Ссылка становится доступным и содержит актуальное значение. Попытка использовать УникальныйИдентификатор формы или другие случайные GUID может привести к тому, что в таблицу запишется «битая» ссылка или возникнет ошибка несоответствия типов.

Шаг 1: Подготовка реквизитов управляемой формы

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

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

Шаг 2: Программное создание документа и обновление строки

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


&НаСервере
Процедура СоздатьНаСервере()
    
    Для каждого Стр Из Договоры Цикл
        
        // Создаем новый объект документа
        НовыйДокумент = Документы.ЛТ_ЗакрытиеДоговоров.СоздатьДокумент();
        
        // Заполняем реквизиты из текущей строки таблицы
        НовыйДокумент.Дата = КонецМесяца(Объект.Дата);
        НовыйДокумент.Основание = Стр.ДоговорЛизинга;
        
        // Перед записью можно вызвать стандартную обработку заполнения
        // НовыйДокумент.Заполнить(Стр.ДоговорЛизинга);
        
        Попытка
            // Записываем документ в базу данных
            НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
            
            // Получаем ссылку и записываем её в реквизит строки таблицы на форме
            // Важно: имя 'ДокументСсылка' должно совпадать с именем колонки в реквизитах формы
            Стр.ДокументСсылка = НовыйДокумент.Ссылка;
            
        Исключение
            Сообщить("Не удалось создать документ для договора: " + Стр.ДоговорЛизинга + ". Ошибка: " + КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
        КонецПопытки;
        
    КонецЦикла;
    
    Сообщить("Обработка завершена. Документы созданы.");
    
КонецПроцедуры

Шаг 3: Анализ ошибки "Поле объекта не обнаружено"

Проанализируем ситуацию, когда при выполнении кода Стр.Ссылка = НовыйДокумент.Ссылка возникает ошибка. Эта ошибка означает, что в объекте Стр (который является строкой таблицы на форме) нет колонки с именем Ссылка.

Многие начинающие разработчики путают имя колонки, отображаемой в интерфейсе, и имя реквизита в структуре данных. Если вы назвали колонку в реквизитах формы ДокументСсылка, то и в коде обращение должно быть строго по этому имени: Стр.ДокументСсылка. Также убедитесь, что вы работаете с коллекцией ДанныеФормыКоллекция (это происходит автоматически, если Договоры — реквизит формы), а не с временной таблицей значений, которая еще не выгружена на форму.

Оптимизация: Использование транзакций и заполнения

Рассмотрим подробнее несколько профессиональных советов, которые сделают работу вашей обработки более надежной:

1. Использование транзакций. Если ваша обработка создает десятки или сотни документов за раз, рекомендуется обернуть цикл в транзакцию. Это гарантирует, что если на середине процесса произойдет сбой, система не оставит «наполовину» созданные данные. Используем методы НачатьТранзакцию() и ЗафиксироватьТранзакцию().

2. Метод Заполнить(). Вместо того чтобы вручную присваивать каждое поле (Организация, Склад, Ответственный), лучше вызвать НовыйДокумент.Заполнить(Основание). Проанализируем преимущество: это инициирует выполнение кода в модуле документа ОбработкаЗаполнения, где обычно уже прописана логика по умолчанию для всех важных реквизитов.

3. Интерактивное открытие. Просто вывести ссылку в таблицу — это полдела. Чтобы пользователю было удобно, настроим событие Выбор у элемента формы "Таблица". Посмотрим на пример кода для клиента:


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

Заключение

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

← На главную