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