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

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

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

Причина проблемы: почему данные записываются?

Когда вы добавляете таблицу в дерево конфигурации внутри объекта Документ, вы создаете жесткую структуру данных. Платформа 1С воспринимает её как неотъемлемую часть документа. Всё, что находится в этой таблице в момент нажатия кнопки «Записать» или «ОК», будет помещено в таблицу базы данных, соответствующую этому документу. Чтобы этого избежать, нам нужно вынести таблицу за пределы структуры самого объекта и оставить её только на уровне Формы.

Решение 1: Использование Таблицы Значений на форме

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

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

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

Теперь проанализируем код заполнения такой таблицы. Типичная ошибка начинающих разработчиков в обычных формах — попытка обратиться к методу Добавить() через элемент формы. Рассмотрим правильный вариант обращения:


// Правильное обращение к данным, а не к элементам оформления
НоваяСтрока = СправочнаяТаблица.Добавить();
НоваяСтрока.Номенклатура = Выборка.Товар;
НоваяСтрока.Остаток = Выборка.Количество;

Важный нюанс: Если вы напишете ЭлементыФормы.СправочнаяТаблица.Добавить(), система выдаст ошибку «Метод объекта не обнаружен», так как ЭлементыФормы возвращает объект визуального контроля, а не программный объект данных.

Решение 2: Использование Набора Записей регистра сведений

Если ваша задача — просто показать данные из конкретного регистра сведений, отфильтрованные по определенному критерию (например, по текущему контрагенту), можно использовать тип РегистрСведенийНаборЗаписей. Это решение еще элегантнее, так как оно требует меньше кода для заполнения.

Рассмотрим ситуацию, когда нужно вывести записи регистра прямо на форму:

  1. Добавьте реквизит формы с типом РегистрСведенийНаборЗаписей.[ИмяВашегоРегистра].
  2. Вынесите его на форму как табличное поле.
  3. В обработчике события ПриОткрытии пропишите установку отбора и чтение данных.

Процедура ПриОткрытии()
    // Устанавливаем отбор по нужному измерению
    НаборЗаписейРеквизит.Отбор.Объект.Установить(Ссылка);
    // Считываем данные из БД в память формы
    НаборЗаписейРеквизит.Прочитать();
КонецПроцедуры

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

Решение 3: Очистка табличной части «Перед Записью»

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

В модуле объекта документа необходимо прописать следующий код:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Очищаем временную таблицу, чтобы она не попала в базу
    ЭтотОбъект.МояВременнаяТаблица.Очистить();
КонецПроцедуры

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

Обработка действий пользователя: открытие документов

Вы упоминали, что пользователь должен иметь возможность кликнуть по строке и открыть связанный документ. В случае с ТаблицейЗначений на форме это реализуется через событие Выбор табличного поля. Выясним, как это запрограммировать:


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

Подведем итоги

Для реализации чистого и профессионального интерфейса в 1С всегда разделяйте данные объекта (то, что документ должен хранить в себе) и данные формы (то, что нужно только для отображения пользователю). Использование реквизитов формы с типом ТаблицаЗначений или использование ПостроителяЗапроса — это золотой стандарт разработки, позволяющий избежать дублирования информации и ошибок при проведении документов.

← На главную