Как изменить расположение кнопки внешней обработки заполнения и отменить принудительную запись документа

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке внешних обработок заполнения табличных частей для конфигураций на базе Библиотеки стандартных подсистем (БСП) программисты часто сталкиваются с двумя ограничениями. Во-первых, по умолчанию кнопка команды появляется в общем меню «Заполнить» в шапке формы, а не над конкретной таблицей. Во-вторых, система принудительно предлагает записать документ перед выполнением обработки. Рассмотрим, как решить обе эти задачи, используя стандартные механизмы 1С.

Перенос кнопки в командную панель табличной части

Рассмотрим ситуацию, когда стандартное размещение кнопки неудобно для пользователя. Мы хотим, чтобы кнопка «Заполнить ОС» находилась непосредственно в командной панели табличной части документа. Существует три основных способа добиться этого. Разберем их по порядку.

Способ 1: Использование модификатора при регистрации

В функции СведенияОВнешнейОбработке при формировании таблицы команд можно указать, к какому элементу формы должна «привязаться» команда. Для этого используется колонка Модификатор. Проанализируем, как дополнить ваш код:


Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    
    // Для размещения в командной панели ТЧ указываем имя элемента формы
    // Формат: "Элементы.ИмяВашейТабличнойЧасти"
    НоваяКоманда.Модификатор = Модификатор; 
КонецПроцедуры

При вызове этой процедуры для регистрации команды в СведенияОВнешнейОбработке, в качестве последнего параметра передайте строку вида "Элементы.ОС" (где ОС — это имя таблицы на форме документа). Это даст системе подсказку, куда именно следует поместить кнопку при автоматическом построении меню.

Способ 2: Пользовательская настройка формы

Выясним, как это сделать без внесения изменений в код. Платформа 1С позволяет пользователю самостоятельно управлять интерфейсом. Для этого нужно выполнить следующие шаги:

  1. Открыть форму документа в пользовательском режиме.
  2. Нажать «Ещё» — «Изменить форму».
  3. В дереве элементов найти группу командной панели вашей табличной части.
  4. Найти команду обработки (обычно она находится в группе «Кнопки командной панели» -> «Заполнить») и просто перетащить её мышкой в нужную подгруппу.

Этот способ хорош тем, что не требует перерегистрации обработки, однако настройку придется повторить для других пользователей (или скопировать её административно).

Как избежать записи документа перед выполнением обработки

Многие разработчики задаются вопросом: почему 1С требует записать документ перед заполнением? Это поведение заложено в БСП для вида ЗаполнениеОбъекта. Система считывает данные с сервера, и ей необходимо, чтобы объект в базе данных соответствовал тому, что пользователь видит на экране.

Чтобы обойти это ограничение и позволить пользователю заполнять ТЧ в еще не записанном документе, проанализируем следующие варианты решения.

Использование метода «ОткрытиеФормы»

Это самый надежный способ. Если вместо ВызовКлиентскогоМетода использовать ОткрытиеФормы, управление передается в форму внешней обработки. В этом случае БСП не инициирует автоматическую запись.

Рассмотрим алгоритм реализации:

  1. В функции СведенияОВнешнейОбработке для команды установите Использование = "ОткрытиеФормы".
  2. В самой обработке создайте основную форму.
  3. В модуле формы обработки, например, в процедуре ПриОткрытии, обратитесь к владельцу формы.

Посмотрим на пример кода в форме обработки:


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

Используя свойство ВладелецФормы.Объект, вы получаете доступ ко всем данным, которые пользователь уже ввел в документ, даже если он еще ни разу не нажимал кнопку «Записать». Это позволяет реализовать гибкое заполнение без лишних диалоговых окон.

Использование параметра «РежимЗаписи»

В некоторых версиях БСП предусмотрена возможность управления записью через дополнительные параметры команды. Попробуем добавить в таблицу команд колонку РежимЗаписи. Разберем, как изменить функцию формирования таблицы:


Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    // Добавляем колонку управления записью
    Команды.Колонки.Добавить("РежимЗаписи", Новый ОписаниеТипов("Строка")); 
    Возврат Команды;
КонецФункции

// При добавлении команды указываем:
НоваяКоманда.РежимЗаписи = "НеЗаписывать";

Важный нюанс: значение "НеЗаписывать" будет корректно обработано только в том случае, если в коде самой конфигурации (в модуле управления дополнительными отчетами и обработками) предусмотрена поддержка этого параметра. В последних версиях БСП этот механизм работает стабильно.

Подведем итоги

Мы проанализировали ситуацию и выяснили, что для решения задачи «красивого» размещения команды и работы без записи, лучше всего комбинировать программные методы БСП. Резюмируем наши действия:

  1. Используйте колонку Модификатор для автоматического размещения кнопки в нужной табличной части.
  2. Для работы с данными «на лету» без записи документа используйте режим ОткрытиеФормы и манипулируйте данными через ВладелецФормы.Объект.
  3. Если конфигурация позволяет, применяйте параметр РежимЗаписи = "НеЗаписывать" в описании команды.

Эти подходы сделают вашу внешнюю обработку профессиональной, удобной для пользователя и лишенной навязчивых предложений системы о сохранении данных.

← На главную