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