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

Программист 1С v8.3 (Обычные формы)
← На главную

В практике разработчика 1С на обычных формах часто возникает загадочная ситуация: программный код, отвечающий за заполнение таблицы, полностью закомментирован или удален, но при открытии формы в таблице все равно красуется одна или несколько строк. Кажется, что платформа живет своей жизнью или данные «прилетают» из кэша. На самом деле, мы имеем дело с базовым механизмом платформы 1С — автоматической синхронизацией данных.

В этой статье мы подробно разберем, почему так происходит, выясним разницу между табличной частью объекта и таблицей значений на форме, а также научимся полностью контролировать вывод данных, чтобы исключить их «магическое» появление.

Разбираем причину: Механизм Data Binding (Привязка данных)

Давайте проанализируем, как работает обычная форма. У каждого элемента управления на форме, будь то поле ввода или табличное поле, есть свойство Данные. Если в этом свойстве указан путь к табличной части документа (например, ДокументОбъект.Товары или ДокументОбъект.ПриёмНаСкладе), платформа включает механизм двусторонней связи.

Рассмотрим, что это означает на практике:

  1. Автоматическое чтение: Как только форма инициализирует объект документа, она обращается к его табличным частям. Все данные, которые физически записаны в базе данных для этого документа, мгновенно считываются и отображаются в табличном поле. Никаких запросов SELECT в модуле формы для этого писать не нужно — платформа делает это за нас «под капотом».
  2. Отсутствие реакции на комментарии: Поскольку данные тянутся напрямую из объекта через свойство элемента формы, ваш закомментированный код в процедуре ПриОткрытии никак не влияет на этот процесс. Вы просто закомментировали «ручное» заполнение, но не разорвали «автоматическую» связь.
  3. Визуальное сходство: Начинающие разработчики часто путают Таблицу значений (произвольный набор данных в памяти) и Табличную часть (структурированные данные объекта БД). На форме они выглядят идентично, но их поведение в контексте привязки данных кардинально различается.

Почему отображается только одна строка, если их больше?

Выясним ситуацию, когда в базе данных записей по документу много, а на форме мы видим только одну. Если мы исключили программные фильтры, стоит обратить внимание на следующие настройки табличного поля:

Во-первых, проверьте свойство Отбор. В обычных формах у табличного поля есть встроенные возможности фильтрации. Если где-то в коде (возможно, в общем модуле или подписке) устанавливается отбор по конкретному условию, лишние строки просто скрываются от глаз пользователя, хотя физически они присутствуют в табличной части.

Во-вторых, проанализируем использование Связи по типу или Связи параметров выбора. Если ваша таблица функционально связана с другим реквизитом (например, складом или контрагентом), платформа может автоматически фильтровать строки, соответствующие текущему значению этого реквизита.

Как разорвать автоматическую связь и управлять данными вручную

Если ваша задача — выводить в таблицу данные исключительно из Регистра Сведений (РС) или по результатам сложного запроса, и вы не хотите, чтобы туда «просачивались» данные из самого документа, нам нужно изменить архитектуру формы.

Разберем по шагам, как это сделать:

  1. Откройте конструктор формы и выберите ваше Табличное поле.
  2. Перейдите в палитру свойств и найдите поле Данные. Удалите оттуда путь, ведущий к табличной части документа (например, сотрите Товары).
  3. Теперь создайте новый Реквизит формы. Назовите его, например, тзДанныеДляВывода и установите ему тип ТаблицаЗначений.
  4. Добавьте в эту таблицу значений колонки, идентичные тем, что вы хотите отображать.
  5. Вернитесь к свойствам табличного поля на форме и в поле Данные укажите только что созданную таблицу значений тзДанныеДляВывода.

Теперь таблица на форме стала «чистой». Она не знает о существовании табличной части документа и будет пустой до тех пор, пока вы не напишете код для ее заполнения.

Пример кода для ручного заполнения таблицы из регистра

Рассмотрим пример, как теперь правильно заполнять нашу таблицу, например, при открытии формы или по нажатию кнопки. Предположим, нам нужно вытащить остатки или какие-то специфические данные из регистра сведений:


Процедура ЗаполнитьТаблицуИзРегистра()
    
    // Очищаем нашу таблицу на форме, чтобы данные не дублировались
    тзДанныеДляВывода.Очистить();
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Номенклатура,
        |   Количество,
        |   Цена
        |ИЗ
        |   РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, )";
    
    Запрос.УстановитьПараметр("Период", ТекущаяДата());
    
    РезультатЗапроса = Запрос.Выполнить();
    
    // Загружаем результат напрямую в таблицу значений на форме
    Выгрузка = РезультатЗапроса.Выгрузить();
    Для Каждого СтрокаИзЗапроса Из Выгрузка Цикл
        НоваяСтрока = тзДанныеДляВывода.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИзЗапроса);
    КонецЦикла;

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

Важный момент: Используя такой подход, помните, что изменения в этой таблице не будут автоматически сохраняться в документ при нажатии кнопки «ОК». Вам придется вручную прописать логику переноса данных из вашей ТаблицыЗначений в ТабличнуюЧасть документа перед записью, если это необходимо.

Проверяем скрытые механизмы: ПриВыводеСтроки и ПриПолученииДанных

Если вы разорвали связь с данными, а в таблице все равно что-то появляется, проанализируем события самого табличного поля. В обычных формах есть два «коварных» обработчика: ПриВыводеСтроки и ПриПолученииДанных.

Событие ПриВыводеСтроки срабатывает каждый раз, когда платформа отрисовывает строку на экране. Рассмотрим типичную ошибку: разработчик может прописать в этом событии установку текста ячейки:


Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // Даже если данных нет, этот код может принудительно вывести текст в колонку
    ОформлениеСтроки.Ячейки.Наименование.УстановитьТекст("Тестовая запись");
КонецПроцедуры

Такой код создаст иллюзию наличия данных, даже если сама таблица пуста. Проверьте наличие этих обработчиков в модуле формы. Если они есть — закомментируйте их для теста.

Влияние модуля объекта и подписок на события

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

Резюме

Если данные в таблице на форме появляются «сами собой» при закомментированном коде, это не ошибка платформы, а работа встроенного механизма Data Binding. Для решения проблемы необходимо:

  1. Убедиться, что в свойстве Данные табличного поля не указана табличная часть документа.
  2. Использовать промежуточную Таблицу значений в реквизитах формы для ручного управления выводом.
  3. Проверить обработчики событий отрисовки строк (ПриВыводеСтроки), которые могут визуально подменять данные.

Таким образом, мы добиваемся полного контроля над интерфейсом и исключаем непредсказуемое поведение формы.

← На главную