В практике разработчика 1С на обычных формах часто возникает загадочная ситуация: программный код, отвечающий за заполнение таблицы, полностью закомментирован или удален, но при открытии формы в таблице все равно красуется одна или несколько строк. Кажется, что платформа живет своей жизнью или данные «прилетают» из кэша. На самом деле, мы имеем дело с базовым механизмом платформы 1С — автоматической синхронизацией данных.
В этой статье мы подробно разберем, почему так происходит, выясним разницу между табличной частью объекта и таблицей значений на форме, а также научимся полностью контролировать вывод данных, чтобы исключить их «магическое» появление.
Давайте проанализируем, как работает обычная форма. У каждого элемента управления на форме, будь то поле ввода или табличное поле, есть свойство Данные. Если в этом свойстве указан путь к табличной части документа (например, ДокументОбъект.Товары или ДокументОбъект.ПриёмНаСкладе), платформа включает механизм двусторонней связи.
Рассмотрим, что это означает на практике:
SELECT в модуле формы для этого писать не нужно — платформа делает это за нас «под капотом».ПриОткрытии никак не влияет на этот процесс. Вы просто закомментировали «ручное» заполнение, но не разорвали «автоматическую» связь.Выясним ситуацию, когда в базе данных записей по документу много, а на форме мы видим только одну. Если мы исключили программные фильтры, стоит обратить внимание на следующие настройки табличного поля:
Во-первых, проверьте свойство Отбор. В обычных формах у табличного поля есть встроенные возможности фильтрации. Если где-то в коде (возможно, в общем модуле или подписке) устанавливается отбор по конкретному условию, лишние строки просто скрываются от глаз пользователя, хотя физически они присутствуют в табличной части.
Во-вторых, проанализируем использование Связи по типу или Связи параметров выбора. Если ваша таблица функционально связана с другим реквизитом (например, складом или контрагентом), платформа может автоматически фильтровать строки, соответствующие текущему значению этого реквизита.
Если ваша задача — выводить в таблицу данные исключительно из Регистра Сведений (РС) или по результатам сложного запроса, и вы не хотите, чтобы туда «просачивались» данные из самого документа, нам нужно изменить архитектуру формы.
Разберем по шагам, как это сделать:
Товары).тзДанныеДляВывода и установите ему тип ТаблицаЗначений.тзДанныеДляВывода.Теперь таблица на форме стала «чистой». Она не знает о существовании табличной части документа и будет пустой до тех пор, пока вы не напишете код для ее заполнения.
Рассмотрим пример, как теперь правильно заполнять нашу таблицу, например, при открытии формы или по нажатию кнопки. Предположим, нам нужно вытащить остатки или какие-то специфические данные из регистра сведений:
Процедура ЗаполнитьТаблицуИзРегистра()
// Очищаем нашу таблицу на форме, чтобы данные не дублировались
тзДанныеДляВывода.Очистить();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура,
| Количество,
| Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, )";
Запрос.УстановитьПараметр("Период", ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();
// Загружаем результат напрямую в таблицу значений на форме
Выгрузка = РезультатЗапроса.Выгрузить();
Для Каждого СтрокаИзЗапроса Из Выгрузка Цикл
НоваяСтрока = тзДанныеДляВывода.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИзЗапроса);
КонецЦикла;
КонецПроцедуры
Важный момент: Используя такой подход, помните, что изменения в этой таблице не будут автоматически сохраняться в документ при нажатии кнопки «ОК». Вам придется вручную прописать логику переноса данных из вашей ТаблицыЗначений в ТабличнуюЧасть документа перед записью, если это необходимо.
Если вы разорвали связь с данными, а в таблице все равно что-то появляется, проанализируем события самого табличного поля. В обычных формах есть два «коварных» обработчика: ПриВыводеСтроки и ПриПолученииДанных.
Событие ПриВыводеСтроки срабатывает каждый раз, когда платформа отрисовывает строку на экране. Рассмотрим типичную ошибку: разработчик может прописать в этом событии установку текста ячейки:
Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Даже если данных нет, этот код может принудительно вывести текст в колонку
ОформлениеСтроки.Ячейки.Наименование.УстановитьТекст("Тестовая запись");
КонецПроцедуры
Такой код создаст иллюзию наличия данных, даже если сама таблица пуста. Проверьте наличие этих обработчиков в модуле формы. Если они есть — закомментируйте их для теста.
Выясним еще одну причину: данные могут попадать в табличную часть еще до того, как откроется форма. Это происходит в Модуле объекта документа. Проанализируйте следующие процедуры:
ОбработкаЗаполнения: выполняется при создании нового документа на основании чего-либо.ПриКопировании: если документ создается копированием, данные уже будут в ТЧ.ПриЧтенииНаСервере. Некоторые конфигурации (особенно сильно кастомизированные) используют этот механизм для «подтягивания» оперативных данных в документ в момент его открытия.Если данные в таблице на форме появляются «сами собой» при закомментированном коде, это не ошибка платформы, а работа встроенного механизма Data Binding. Для решения проблемы необходимо:
ПриВыводеСтроки), которые могут визуально подменять данные.Таким образом, мы добиваемся полного контроля над интерфейсом и исключаем непредсказуемое поведение формы.