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