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