В БСП типовых конфигураций есть функционал по внедрению внешних отчетов и обработок в конфигурацию. Но отладка, например, обработок по заполнению табличных частей объектов конфигураций, находящихся под "замком", вызывает затруднения.
Здесь предлагается вариант небольшой доработки отлаживаемой обработки без необходимости снимать конфигурацию с замка. Это позволяет отлаживать обработку на рабочей базе, а не на копии, где данные могут быть неактуальны.
Для доработки надо:
- Добавить 2 реквизита формы: ВидОбработки (тип строка) и Назначение (тип Список значений с типом Строка)
- Добавить следующий код в процедуры модуля формы обработки:
- Процедура ПриСозданииНаСервере
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) // прочитаем сведения о внешней обработке Об = РеквизитФормыВЗначение("Объект"); Попытка // заполняются реквизиты для поиска открытого окна объекта, для которого предназначена обработка СведОбр = Об.СведенияОВнешнейОбработке(); ВидОбработки = СведОбр.Вид; Для каждого ОбНаз из СведОбр.Назначение Цикл мд = Метаданные.НайтиПоПолномуИмени(ОбНаз); Назначение.Добавить(ОбНаз, ?(ЗначениеЗаполнено(мд.ПредставлениеОбъекта), мд.ПредставлениеОбъекта, мд.Синоним)); КонецЦикла; Исключение КонецПопытки; КонецПроцедуры
- Процедура ПриОткрытии
&НаКлиенте Процедура ПриОткрытии(Отказ) Если ВладелецФормы = Неопределено Тогда // этот код выполняется, когда форма открыта не из документа (используется для отладки кода обработки через Файл - Открыть) Окна = ПолучитьОкна(); Для каждого тОкно из Окна Цикл //Окно изменяемого документа будет точно не основным, а вспомогательным, поэтому //сразу пропускаем основное окно, а далее идем на не очень хороший способ поиска открытого окна //изменяемого документа. Мы просто переберем все окна, а в заголовке какого встретится //Наименование нужного документа - будем его изменять Если НЕ тОкно.Основное Тогда Нашли = Ложь; Для каждого ОбНаз из Назначение Цикл Если Найти(тОкно.Заголовок, ОбНаз.Представление) Тогда ОбНаз.Пометка = Истина; Нашли = Истина; Прервать; КонецЕсли; КонецЦикла; Если Нашли Тогда //Код находится в цикле на тот случай, если открытых окон изменяемого документа больше одного //Далее мы получаем объект найденной открытой формы и помещаем её в переменную //В объекте содержатся все реквизиты (элементы) формы Объект.Ссылка = тОкно.Содержимое[0].Объект.Ссылка; Прервать; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры
- Процедура ВыполнитьЗаполнение (вызывается по кнопке формы)
&НаКлиенте Процедура ВыполнитьЗаполнение(Команда) Если Не ВладелецФормы = Неопределено Тогда НовыйОбъект = ВладелецФормы.Объект; ИначеЕсли НЕ Объект.Ссылка.Пустая() Тогда Для каждого ОбНаз из Назначение Цикл Если ОбНаз.Пометка Тогда ИмяОб = ОбНаз.Значение; Прервать; КонецЕсли; КонецЦикла; ВладелецФормы = ОткрытьФорму(ИмяОб+".Форма.ФормаДокумента", Новый Структура("Ключ", Объект.Ссылка)); НовыйОбъект = ВладелецФормы.Объект; Иначе Сообщить("Не выбран документ!"); Возврат; КонецЕсли; ДопПарам = Новый Структура("НовыйОбъект", НовыйОбъект); ОповещСогласияЗаполнить = Новый ОписаниеОповещения("ОбработкаСогласияЗаполнить", ЭтотОбъект, ДопПарам); ПоказатьВопрос(ОповещСогласияЗаполнить, "Табличная часть документа будет очищена. Продолжить", РежимДиалогаВопрос.ДаНет); КонецПроцедуры
При создании на сервере формы обработки заполняются добавленные реквизиты формы видом обработки и списком документов, для которых предназначена обработка.
В процедуре ПриОткрытии проверяется заполненность параметра ВладелецФормы, который всегда заполнен для подключенной в конфигурацию обработки, поэтому добавленный код будет выполняться только когда обработка открывается интерактивно через меню Файл - Открыть. Если обработка открыта интерактивно, то выполняется поиск открытого окна заполняемого документа и при совпадении начала заголовка окна документа с представлением документа, сохраненного в списке Назначение, Ссылка на документ из найденного окна сохраняется в основном реквизите формы обработки Объект.Ссылка, а для позиции списка устанавливается пометка.
Для отладки обработки надо в режиме предприятия открыть окно формы документа, для которого предназначена отлаживаемая обработка, и затем открыть саму обработку. Ссылка открытого документа будет перехвачена в отлаживаемую обработку заполнения.
В процедуре ВыполнитьЗаполнение для отлаживаемой обработки осуществляется поиск имени объекта в списке реквизита Назначение, для которого была установлена пометка в процедуре ПриОткрытии, и открывается форма этого документа.
После заполнения документа выполняется функция
КопироватьДанныеФормы(НовыйОбъект, ВладелецФормы.Объект)
копирующая данные формы в данные формы открытого документа, и форма обработки заполнения закрывается.
Если надо заполнять не только ТЧ документов, но и других объектов, то несложно допилить код обработки самостоятельно.