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