Разработка интерфейсов в системе «1С:Предприятие 8.3» часто подбрасывает задачи, которые на первый взгляд кажутся тривиальными, но требуют понимания глубоких механизмов работы платформы. Одной из таких задач является добавление нового поля (колонки) в форму списка или форму подбора. Часто начинающие разработчики сталкиваются с ситуацией: реквизит в форме создан, но «перетащить» его в таблицу списка в конфигураторе не получается, или же он просто не отображается в режиме «Предприятие».
В этой статье мы подробно разберем, почему так происходит, и изучим все доступные способы вывода данных в списки для управляемых и обычных форм.
Для начала проанализируем ситуацию, описанную пользователем: попытка добавить обычный реквизит формы в таблицу, связанную с динамическим списком. Разберем основную причину неудачи: динамический список (объект типа ДинамическийСписок) является автономным источником данных. Его состав колонок жестко ограничен набором полей, которые возвращает его запрос.
Если вы создаете реквизит формы (например, переменную типа Строка), он существует в контексте формы, но не в контексте данных списка. Система не знает, как сопоставить одну переменную со множеством строк таблицы. Поэтому запомним правило: в таблицу динамического списка можно добавить только те поля, которые присутствуют в самом объекте «Динамический список».
Это самый распространенный и правильный метод, если вам нужно вывести данные из связанных таблиц. Рассмотрим по шагам, как это реализовать:
Список (тип ДинамическийСписок).ЛЕВОЕ СОЕДИНЕНИЕ (LEFT JOIN) с другой таблицей (например, регистром сведений или справочником).Проанализируем пример запроса, где мы хотим вывести артикул номенклатуры в списке документов, хотя в самом документе его нет:
ВЫБРАТЬ
ДокументПродажа.Ссылка КАК Ссылка,
ДокументПродажа.Дата КАК Дата,
ДокументПродажа.Номер КАК Номер,
СправочникНоменклатура.Артикул КАК АртикулНоменклатуры
ИЗ
Документ.Продажа КАК ДокументПродажа
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
ПО ДокументПродажа.Номенклатура = СправочникНоменклатура.Ссылка
После изменения запроса новое поле АртикулНоменклатуры появится в списке доступных полей динамического списка в правой части редактора формы. Теперь мы можем просто перетащить его мышкой в элементы формы (в таблицу списка).
Иногда нам нужно вывести не просто значение из базы, а результат какого-то условия. Рассмотрим, как это сделать через конструкцию ВЫБОР. Допустим, нам нужно вывести текстовый статус «Оплачено» или «Не оплачено» прямо в колонку списка на основе булева реквизита.
ВЫБРАТЬ
Документ.Ссылка,
ВЫБОР
КОГДА Документ.Оплачен ТОГДА "Полная оплата"
ИНАЧЕ "Ожидается"
КОНЕЦ КАК СтатусОплаты
ИЗ
Документ.ЗаказПокупателя КАК Документ
Такой подход позволяет не загромождать базу данных лишними реквизитами, формируя нужную информацию «на лету» при отрисовке формы пользователю.
В некоторых случаях (например, при разработке универсальных инструментов или при работе с расширениями) нам требуется добавить колонку программно в модуле формы. Проанализируем, как это сделать правильно в событии ПриСозданииНаСервере.
Важно помнить: сначала мы должны убедиться, что поле есть в запросе списка, а затем создать элемент формы типа ПолеФормы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// 1. Создаем элемент формы (колонку)
НовыйЭлемент = Элементы.Добавить("Артикул", Тип("ПолеФормы"), Элементы.Список);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
// 2. Связываем поле с данными списка
// Важно: имя поля "Артикул" должно совпадать с именем поля в запросе динамического списка
НовыйЭлемент.ПутьКДанным = "Список.Артикул";
НовыйЭлемент.Заголовок = "Артикул товара";
КонецПроцедуры
Хотя управляемые формы являются стандартом, в старых конфигурациях все еще встречаются обычные формы. Разберем, как добавить реквизит там. В обычных формах процесс проще: используется механизм Размещение данных.
Как упоминалось в обсуждении, форма подбора часто работает по тем же принципам динамического списка. Однако здесь есть важный нюанс: производительность. Если форма подбора используется в документах с тысячами строк, сложные соединения (JOIN) в запросе могут замедлить открытие формы.
Выясним причину возможных тормозов: если вы добавляете колонку, по которой пользователь захочет искать или фильтровать (например, «Остаток на складе»), убедитесь, что это поле индексировано в базе данных. Для динамических данных, таких как актуальные остатки, часто лучше использовать не прямой запрос к таблицам итогов, а предварительно подготовленные данные или механизм ПриПолученииДанныхНаСервере (для таблиц значений).
Рассмотрим важные ограничения, которые нельзя игнорировать:
ОбщегоНазначения.РассчитатьЦенуСоСкидкой(Товар)). Платформа 1С выполняет запросы на языке SQL, который «не знает» о функциях встроенного языка 1С.ТаблицуЗначений, но помните, что она не поддерживает автоматическую порционную подгрузку данных, что критично для больших списков.Таким образом, мы выяснили, что ключ к успешному добавлению колонки в форму списка лежит в правильной настройке источника данных — динамического списка. Выбирайте способ в зависимости от сложности задачи: от простого изменения запроса до программного создания элементов управления.