[Практика программирования] Управляемые формы 1С 8: как программно изменить запрос динамического списка и программно вывести колонку добавленного реквизита списка
Ранее уже описывалось в соответствующей статье то, как разместить программно в форме колонку реквизита объекта базы (например, документа или справочника). В этой статье будет рассмотрено как программно добавить колонку с флажком в список управляемой формы с динамическим списком, данные для которого выбираются произвольным запросом.
Для программного добавления элементов управляемой формы должно быть учтено условие о том, что добавление происходит на стороне сервера, а не на клиенте (не в процедуре "ПриОткрытии", как это было в обычном приложении). И так можно ошибочно подумать по старой привычке (если есть опыт программирования в обычном интерфейсе), учитывая архитектуру платформы 1С: Предприятие 8.2 и 8.3. Ведь процедура "ПриОткрытии" формы есть и в управляемом приложении, но через не создать программно и не разместить элементы для прикладной задачи. Поэтому "&НаСервере" и преимущественно в процедуре "ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)" формы документа или элемента справочника или формы списка теперь происходит программное добавление каких-либо элементов формы. В общем информация о том, как программно изменить текст запроса динамического списка, использующего произвольный запрос можно найти на странице сайта ИТС 1С, если у Вас есть доступ. Но если доступа нет, то можете сильно не расстраиваться - информация на странице как и во многих случаях методологической информации от 1С носит условно практический характер. А это означает, что мелочи и нюансы, о которых бы было неплохо упомянуть на указанной странице ИТС, не упомянуты никак. И их понимание будет происходить на практике. Вот часть такой практики изложена ниже на прикладной задаче. Нажатие на изображении увеличит его Прикладная задача заключалась в том, чтобы выводить программно в управляемую форму списка документов "Реализация товаров и услуг" колонку добавленного реквизита документа. Реквизит с именем "ДопМФ_Отгружено" тип "Булево", в данном примере добавлен в расширении, но может быть и добавлен в основной конфигурации, если она на частичной поддержке. Как вывести программно элемент формы, содержащей флажок, добавленного реквизита, повторимся, можно изучить в соответствующей статье, о которой уже упоминалось в начале страницы.
Прежде чем перейти непосредственно к программному добавлению колонки элемента таблицы формы нужно добавить его выбор в текст запроса динамического списка. Таким образом подготовительный рабочий исполняемый код получается примерно следующим:
Прокомментируем его основные моменты. В строке 1 происходит получение структуры через функцию "СтруктураСвойствДинамическогоСписка()" общего модуля "ОбщегоНазначения" для заполнения ее значений и передачи для заполнения свойств динамического списка. Для ключа "ОсновнаяТаблица" структуры в строке 2 указывается название основной таблицы, которая используюется для динамического списка, в примере это "Документ.РеализацияТоваровУслуг". Значение ключа структуры в строке 3 "ДинамическоеСчитываниеДанных" в значении "Истина". В строках 4 и 5 ведется произвольная модификация запроса. Нажатие на изображении увеличит его Можно просто подготовить новый или измененный исходный текст запроса для указания его в ключе "ТекстЗапроса" структуры. В данном же случае была использована хитрость, чтобы минимизировать зависимость от изменений разработчиков. Происходит модификация исходного текста запроса, который определили разработчики, за счет замены подстроки "ВЫБРАТЬ", которая есть в любом запросе, на подстроку так же содержащее это обязательное слово текста запроса и текст для выборки значения добавленного реквизита документа "ДопМФ_Отгружено". Таким образом, доработка в расширении может сломаться тогда, когда разработчики существенным образом изменять исходный текст запроса. И на примере строки 5 помещаем новый вариант текста запроса в структуру. В данном примере получилось, что запрос содержит одну дополнительную строчку, чтобы выбирать значения добавленного реквизита. Порядок следования полей выборки в запросе для динамического списка не имеет значения. Т.е. в практической задаче начало запроса программно изменялось:
Особенно обратим внимание на то, к каким объектам ведется обращение в строке 7, когда выполняется установка новой настройки для динамического списка с помощью процедуры "УстановитьСвойстваДинамическогоСписка" общего модуля "ОбщегоНазначения". В этом месте важно не перепутать, т.к. в типовой конфигурации названия элемента формы таблицы-списка и реквизита формы одинаковые. А важно, что первым параметром передается элемент управляемой формы - Таблица реквизита формы. Не перепутать его с названием реквизита формы, к которому ранее обращались для получения текста исходного запроса. Вторым параметром передается заполненная структура. Строка 7 в данном примере закомментирована, т.к. в данной прикладной задаче в тексте запроса не содержится параметров. Но, если параметр есть, то устанавливается через свойство "Параметры" и метод "УстановитьЗначениеПараметра" реквизита управляемой формы, а не элемента формы. Установка значения по имени параметра по коду как для классического запроса в 1С: первое значение - текстовое имя параметра, второе значение - собственно значение для параметра. Нажатие на изображении увеличит его После модификации текста произвольного динамического запроса реквизита управляемой формы 1С 8, становится возможным размещение колонки нового реквизита. И теперь рассмотрим код для программного вывода, размещения, добавления (как будет угодно) колонки в элемент-таблицу формы. Нажатие на изображении увеличит его По логике программного вывода в прикладной задачи новая колонка, напомним с флажком, должна выводиться сразу после колонки "Номер", содержащей данные номеров документов списка. Код на скриншоте содержит условие на то, что если колонка "Номер" по каким то причинам, например скрыта пользователем в управляемой форме, что вполне может быть (странно но может быть, ведь номер для документа является ключевым реквизитом для работы пользователей), то тогда новая колонка будет выведена самой первой в списке.
Есть небольшие отличия от случая, который уже упоминался выше, добавления колонки для элемента формы Таблица динамического списка, как было описано смежной статье. В смежном случае был пример для таблицы, данными (ПутьКДанным) которой выступал "динамический список", но у которого основанием выступала таблица, а не произвольный запрос. Если отличия не учесть, то будут просто возникать ошибки. В данном же примере Отличия заключаются в двух местах кода. Во-первых, это обращение к свойству "ШиринаЭлемента, а не просто "Ширина" как в случае, если колонка - это программно выводимая колонка динамического списка, но у которого указана "Основная таблица" и не используется произвольный запрос. Т.е. для программно добавляемой колонки динамического списка с произвольным запросом указывается свойство "ШиринаЭлемента". Во-вторых, очень важно правильно указать значение свойства "ПутьКДанным", иначе можно получить ошибку: Нажатие на изображении увеличит его {Документ.РеализацияТоваровУслуг.Форма.ФормаСписка.Форма(26)}: Ошибка при установке значения атрибута контекста (ПутьКДанным)
КолонкаОтгружено.ПутьКДанным = "Объект.СписокРеализацииТоваровУслуг.ДопМФ_Отгружено";
по причине:
Недопустимое значение
Недопустимое значение
Конечно, подобную ошибку можно "поймать" и при других условиях. Но когда она касается свойства "ПутьКДанным", то это явно говорит о том, что указанное строковое значение попросту не верное. Следует тщательно проанализировать корректность ее составления, т.к. в реквизитах управляемых форм можно запутаться. Нажатие на изображении увеличит его В текущей задаче реквизит формы (он не основной) носит имя "СписокРеализацийТоваровУслуг", а не так, как часто можно встретить в конфигурации, что основной реквизит формы носит имя "Объект". И значения для добавленной колонки берется из реквизита типа "ДинамическийСписок" и для элемента формы. Поэтому строка для "ПутьКДанным" - "СписокРеализацииТоваровУслуг.ДопМФ_Отгружено" с указанием через "." имени нового реквизита. Это все условия и нюансы, с которыми пришлось столкнуться на практике для программной модификации произвольного запроса динамического списка реквизита управляемой формы в 1С 8, чтобы потом программно вывести колонку нового реквизита объекта конфигурации базы в элемент "Таблица" формы . Оцените, оказалась ли эта публикация полезна для Вас?
© www.azhur-c.ru 2013-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу. 25-11-2021 Журавлев А.С. (Сайт azhur-c.ru) |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Copyright 2013-2020. Azhur-c.ru
ИП Журавлев Александр Сергеевич ИНН 667000271590 ОГРНИП 312667014300041 |