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