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

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

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

Рассмотрим подробно причины такого поведения механизмов БСП и проанализируем доступные способы решения этой проблемы.

Причины автоматической записи документа перед вызовом обработки

Выясним, почему БСП требует сохранить документ до запуска клиентского кода обработки:

  1. Для типов команд ВызовКлиентскогоМетода и ОткрытиеФормы подсистема БСП по умолчанию предполагает, что обработка будет работать с записанной ссылкой в базе данных. Вследствие этого выставляется режим записи объекта перед вызовом команды.
  2. Если документ имеет статус проведенного, а пользователь на форме удалил строки из обязательной табличной части, вызванный перед командой метод Форма.Записать() приводит к запуску процедур ПередЗаписью и ОбработкаПроверкиЗаполнения.
  3. Поскольку табличная часть на форме пуста, проверка обязательности заполнения не проходит, документ не записывается, а клиентская команда внешней обработки не вызывается.
  4. Тип команды ЗаполнениеФормы не требует предварительной записи документа, однако он исполняется строго на сервере и не позволяет интерактивно открывать формы подбора на клиенте.

Способ 1. Доработка проверки БСП через расширение конфигурации (использование модификатора)

Наиболее универсальным техническим решением является переопределение логики проверки записи БСП в расширении конфигурации. Это позволит указывать специальный модификатор для команд, не требующих сохранения формы.

Разберем реализацию этого способа по шагам:

  1. Создадим или откроем минимальное расширение конфигурации.
  2. Перехватим метод общего модуля БСП ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьНазначаемуюКомандуНаКлиенте с помощью аннотации &Вместо.
  3. Заменим стандартное условие проверки необходимости записи формы. Вместо стандартной проверки Если Объект.Ссылка.Пустая() Или Форма.Модифицированность Тогда укажем проверку на наличие нашего модификатора:

&Вместо("ВыполнитьНазначаемуюКомандуНаКлиенте")
Процедура Расш1_ВыполнитьНазначаемуюКомандуНаКлиенте(Форма, ВыполняемаяКоманда)
	
	// Если команда содержит модификатор "БЕЗЗАПИСИФОРМЫ", пропускаем запись формы
	Если ВРег(ВыполняемаяКоманда.Модификатор) <> "БЕЗЗАПИСИФОРМЫ" 
		И (Форма.Объект.Ссылка.Пустая() Или Форма.Модифицированность) Тогда
		
		// Стандартный вызов записи
		// ...
	КонецЕсли;
	
	// Продолжение работы команды
КонецПроцедуры
  1. В исследовании и регистрации внешней обработки заполнения объекта в функции СведенияОВнешнейОбработке() установим для команды модификатор "БезЗаписиФормы".
  2. В основной форме внешней обработки создадим клиентскую процедуру-обработчик с экспортной сигнатурой:

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
	
	// Получение контекста вызывающей формы и ее объекта
	ФормаВладелец = ЭтаФорма.ВладелецФормы;
	ОбъектФормы = ФормаВладелец.Объект;
	
	// Интерактивная работа с табличной частью документа напрямую на форме
	
КонецПроцедуры

Способ 2. Изменение режима записи команды через событие подсистемы команд

Проанализируем второй вариант решения задачи с использованием встроенного механизма подключаемых команд. В расширении конфигурации можно перехватить назначение параметров команды перед ее выполнением.

Для этого в общем модуле ПодключаемыеКомандыПереопределяемый (или модуле интеграции с БСП) найдем процедуру заполнения свойств команд и принудительно укажем параметр Команда.РежимЗаписи = "НеЗаписывать" для конкретной внешней обработки.


&НаСервере
Процедура Расш1_ПриОпределенииКомандПодключенныхКОбъекту(Настройки) Экспорт

	Для Каждого Команда Из Настройки.Команды Цикл
		Если Команда.Имя = "МояВнешняяОбработкаЗаполнения" Тогда
			Команда.РежимЗаписи = "НеЗаписывать";
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

При режиме "НеЗаписывать" БСП не отслеживает флаг модифицированности формы и не производит запись документа перед запуском клиентского алгоритма.

Особенности работы с несохраненными данными формы

При реализации заполнения без записи документа необходимо учитывать специфику работы платформы 1С:

  1. Работа с объектом формы: Все изменения табличной части должны вноситься непосредственно в данные формы вызывающего документа (Форма.Объект.ТабличнаяЧасть), так как изменения еще не отражены в базе данных.
  2. Запросы на сервере: Если из формы подбора внешней обработки вызывать серверные процедуры, делающие запрос к базе данных по ссылке текущего документа (Документы.Ссылка), запрос вернет старые данные из базы. Для передачи текущего состояния табличной части на сервер следует использовать считывание данных формы или передачу массивов структур с клиенту на сервер.
  3. Распроведение документа: Если бизнес-процесс позволяет, оперативным пользовательским решением без доработки кода является предварительное распроведение документа перед очисткой табличной части и запуском обработки. Для нерасведенных или новых документов платформа не производит строгую проверку заполненности ТЧ при записи.
← На главную