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