В процессе разработки внешних обработок часто возникает задача автоматизации: система должна найти определенные данные (например, задолженности или графики платежей), создать на их основе документы и сразу же показать пользователю результат работы в виде списка ссылок. Рассмотрим подробно, как правильно реализовать этот механизм на платформе 1С:Предприятие 8.3 с использованием управляемых форм.
Проанализируем ситуацию, когда программист пытается получить ссылку на новый документ. Часто в коде встречается использование метода ПолучитьСсылку(УникальныйИдентификатор). Это методически неверно в контексте создания нового объекта. Метод ПолучитьСсылку обычно применяется для предварительной генерации ссылки (GUID) до записи объекта, либо для формирования ссылки на основе уже известного идентификатора.
Выясним причину ошибки: когда вы вызываете НовыйДокумент.Записать(), платформа сама создает ссылку в базе данных. После этого момента свойство НовыйДокумент.Ссылка становится доступным и содержит актуальное значение. Попытка использовать УникальныйИдентификатор формы или другие случайные GUID может привести к тому, что в таблицу запишется «битая» ссылка или возникнет ошибка несоответствия типов.
Прежде чем приступать к написанию кода, разберем настройку самой формы. Чтобы ссылка отобразилась в колонке, эта колонка должна существовать в структуре данных. Если ваша таблица на форме называется Договоры, выполним следующие действия:
Договоры).ДокументСсылка.ДокументСсылка укажем тип данных. Это должен быть конкретный тип создаваемого документа, например, ДокументСсылка.ЛТ_ЗакрытиеДоговоров.Рассмотрим правильный алгоритм работы в процедуре на сервере. Нам необходимо пройти циклом по строкам таблицы, создать документ, записать его и вернуть ссылку обратно в ту же строку, из которой были взяты данные. Посмотрим на пример кода:
&НаСервере
Процедура СоздатьНаСервере()
Для каждого Стр Из Договоры Цикл
// Создаем новый объект документа
НовыйДокумент = Документы.ЛТ_ЗакрытиеДоговоров.СоздатьДокумент();
// Заполняем реквизиты из текущей строки таблицы
НовыйДокумент.Дата = КонецМесяца(Объект.Дата);
НовыйДокумент.Основание = Стр.ДоговорЛизинга;
// Перед записью можно вызвать стандартную обработку заполнения
// НовыйДокумент.Заполнить(Стр.ДоговорЛизинга);
Попытка
// Записываем документ в базу данных
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
// Получаем ссылку и записываем её в реквизит строки таблицы на форме
// Важно: имя 'ДокументСсылка' должно совпадать с именем колонки в реквизитах формы
Стр.ДокументСсылка = НовыйДокумент.Ссылка;
Исключение
Сообщить("Не удалось создать документ для договора: " + Стр.ДоговорЛизинга + ". Ошибка: " + КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
Сообщить("Обработка завершена. Документы созданы.");
КонецПроцедуры
Проанализируем ситуацию, когда при выполнении кода Стр.Ссылка = НовыйДокумент.Ссылка возникает ошибка. Эта ошибка означает, что в объекте Стр (который является строкой таблицы на форме) нет колонки с именем Ссылка.
Многие начинающие разработчики путают имя колонки, отображаемой в интерфейсе, и имя реквизита в структуре данных. Если вы назвали колонку в реквизитах формы ДокументСсылка, то и в коде обращение должно быть строго по этому имени: Стр.ДокументСсылка. Также убедитесь, что вы работаете с коллекцией ДанныеФормыКоллекция (это происходит автоматически, если Договоры — реквизит формы), а не с временной таблицей значений, которая еще не выгружена на форму.
Рассмотрим подробнее несколько профессиональных советов, которые сделают работу вашей обработки более надежной:
1. Использование транзакций. Если ваша обработка создает десятки или сотни документов за раз, рекомендуется обернуть цикл в транзакцию. Это гарантирует, что если на середине процесса произойдет сбой, система не оставит «наполовину» созданные данные. Используем методы НачатьТранзакцию() и ЗафиксироватьТранзакцию().
2. Метод Заполнить(). Вместо того чтобы вручную присваивать каждое поле (Организация, Склад, Ответственный), лучше вызвать НовыйДокумент.Заполнить(Основание). Проанализируем преимущество: это инициирует выполнение кода в модуле документа ОбработкаЗаполнения, где обычно уже прописана логика по умолчанию для всех важных реквизитов.
3. Интерактивное открытие. Просто вывести ссылку в таблицу — это полдела. Чтобы пользователю было удобно, настроим событие Выбор у элемента формы "Таблица". Посмотрим на пример кода для клиента:
&НаКлиенте
Процедура ДоговорыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Получаем текущую строку
ТекущиеДанные = Элементы.Договоры.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.ДокументСсылка) Тогда
// Отменяем стандартное действие, чтобы открыть документ своим кодом
СтандартнаяОбработка = Ложь;
ПоказатьЗначение(, ТекущиеДанные.ДокументСсылка);
КонецЕсли;
КонецПроцедуры
Мы разобрали полный цикл решения задачи: от настройки структуры реквизитов формы до корректного присвоения ссылок в коде. Помните, что ключевым моментом является правильное использование свойства .Ссылка объекта после метода .Записать() и строгое соответствие имен колонок в метаданных формы и программном коде. Следуя этим шагам, вы создадите надежный и удобный инструмент для пользователей 1С.