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