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