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