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