Динамический список появился на платформе 8, как отдельный тип данных. Основан он на системе компановки данных и из коробки уже предлагает много «вкусностей» — полнотекстовый поиск, сортировку, отбор, поле поиска, условное оформление. В общем при правильном применении можно убить много зайцев, при помощи динамического списка. Чаще всего его применяют для отображения данных из БД.
В одном из своих проектов, я делал подбор товаров в РМК на основе динамического списка. Получилось надо скзать круто, пользователи были очень довольны скоростью работы и возможностями полнотекстового поиска. Я кажется уже писал об этом в одной из предыдущих записей блога.
Так вот понадобилось мне, программное изменение текста запроса. К счастью решение было найдено довольно быстро и реализация оказалась довольно простой. Код приложу ниже. В моем случае я при установке галки на форме, подменял текст запроса динамического списка. Важными замечанием является, что наименования колонок в обоих запросах должны быть полностью идентичными, чтоб сработал метод описанный мною. На форму я вывел реквизит ОстаткиСклада с типом Булево, и при установке этого значения менял запрос.
&НаСервере Процедура ОстаткиСкладаПриИзмененииНаСервере() Если ОстаткиСклада Тогда ТекстЗапроса = "ВЫБРАТЬ | ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, | ТоварыНаСкладахОстатки.Характеристика КАК Характеристика, | СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток |ПОМЕСТИТЬ ОстаткиСклада |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &СкладОптовый) КАК ТоварыНаСкладахОстатки | |СГРУППИРОВАТЬ ПО | ТоварыНаСкладахОстатки.Номенклатура, | ТоварыНаСкладахОстатки.Характеристика |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура, | ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика, | ЦеныНоменклатурыСрезПоследних.Цена КАК Цена |ПОМЕСТИТЬ Цены |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ЦенаОптовая) КАК ЦеныНоменклатурыСрезПоследних |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Номен.Ссылка КАК Номенклатура, | ОстаткиСклада.Характеристика КАК Характеристика, | Цены.Цена КАК Цена, | ОстаткиСклада.КоличествоОстаток КАК Остаток |ИЗ | Справочник.Номенклатура КАК Номен | ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиСклада КАК ОстаткиСклада | ЛЕВОЕ СОЕДИНЕНИЕ Цены КАК Цены | ПО (Цены.Характеристика = ОстаткиСклада.Характеристика) | ПО (ОстаткиСклада.Номенклатура = Номен.Ссылка)"; ОстаткиТоваров.ТекстЗапроса = ТекстЗапроса; ОстаткиТоваров.Параметры.УстановитьЗначениеПараметра("ЦенаОптовая", Справочники.ВидыЦен.НайтиПоНаименованию("Оптовая")); ОстаткиТоваров.Параметры.УстановитьЗначениеПараметра("СкладОптовый", Справочники.Склады.НайтиПоНаименованию("Оптовый")); Элементы.ОстаткиТоваров.Обновить(); Иначе ТекстЗапроса = "ВЫБРАТЬ | ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, | ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток, | ТоварыНаСкладахОстатки.Характеристика КАК Характеристика |ПОМЕСТИТЬ ОстатокРозницы |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &РозничныйСклад) КАК ТоварыНаСкладахОстатки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика, | ЦеныНоменклатурыСрезПоследних.Цена КАК Цена |ПОМЕСТИТЬ ЦеныРозницы |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &Розничная) КАК ЦеныНоменклатурыСрезПоследних |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Номен.Ссылка КАК Номенклатура, | ОстатокРозницы.Характеристика КАК Характеристика, | ЦеныРозницы.Цена КАК Цена, | ОстатокРозницы.КоличествоОстаток КАК Остаток |ИЗ | Справочник.Номенклатура КАК Номен | ЛЕВОЕ СОЕДИНЕНИЕ ОстатокРозницы КАК ОстатокРозницы | ЛЕВОЕ СОЕДИНЕНИЕ ЦеныРозницы КАК ЦеныРозницы | ПО ОстатокРозницы.Характеристика = ЦеныРозницы.Характеристика | ПО (ОстатокРозницы.Номенклатура = Номен.Ссылка)"; ОстаткиТоваров.ТекстЗапроса = ТекстЗапроса; ОстаткиТоваров.Параметры.УстановитьЗначениеПараметра("Розничная", Справочники.ВидыЦен.НайтиПоНаименованию("Розничная")); ОстаткиТоваров.Параметры.УстановитьЗначениеПараметра("РозничныйСклад", Справочники.Склады.НайтиПоНаименованию("Агасиева 17")); Элементы.ОстаткиТоваров.Обновить(); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОстаткиСкладаПриИзменении(Элемент) ОстаткиСкладаПриИзмененииНаСервере(); Элементы.ОстаткиТоваров.Обновить(); КонецПроцедуры
Приятным бонусом оказалось, что если в поле поиска уже введено значение, и далее нажать галку которая меняет текст запроса, то в динамический список будут выведены записи с учетом значения значения поиска. Надеюсь данная запись блога будет кому либо полезна.
[Практика программирования] Управляемые формы 1С 8: как программно изменить запрос динамического списка и программно вывести колонку добавленного реквизита списка
Ранее уже описывалось в соответствующей статье то, как разместить программно в форме колонку реквизита объекта базы (например, документа или справочника). В этой статье будет рассмотрено как программно добавить колонку с флажком в список управляемой формы с динамическим списком, данные для которого выбираются произвольным запросом.
Для программного добавления элементов управляемой формы должно быть учтено условие о том, что добавление происходит на стороне сервера, а не на клиенте (не в процедуре «ПриОткрытии», как это было в обычном приложении). И так можно ошибочно подумать по старой привычке (если есть опыт программирования в обычном интерфейсе), учитывая архитектуру платформы 1С: Предприятие 8.2 и 8.3. Ведь процедура «ПриОткрытии» формы есть и в управляемом приложении, но через не создать программно и не разместить элементы для прикладной задачи. Поэтому «&НаСервере» и преимущественно в процедуре «ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)» формы документа или элемента справочника или формы списка теперь происходит программное добавление каких-либо элементов формы.
В общем информация о том, как программно изменить текст запроса динамического списка, использующего произвольный запрос можно найти на странице сайта ИТС 1С, если у Вас есть доступ. Но если доступа нет, то можете сильно не расстраиваться — информация на странице как и во многих случаях методологической информации от 1С носит условно практический характер. А это означает, что мелочи и нюансы, о которых бы было неплохо упомянуть на указанной странице ИТС, не упомянуты никак. И их понимание будет происходить на практике. Вот часть такой практики изложена ниже на прикладной задаче.
Нажатие на изображении увеличит его
Рис. 1. Пример теоретического кода для программного изменения текста произвольного динамического списка для управляемой формы в 1С 8.
Прикладная задача заключалась в том, чтобы выводить программно в управляемую форму списка документов «Реализация товаров и услуг» колонку добавленного реквизита документа. Реквизит с именем «ДопМФ_Отгружено» тип «Булево», в данном примере добавлен в расширении, но может быть и добавлен в основной конфигурации, если она на частичной поддержке. Как вывести программно элемент формы, содержащей флажок, добавленного реквизита, повторимся, можно изучить в соответствующей статье, о которой уже упоминалось в начале страницы.
Рис. 2. Пример добавленного реквизита объекта конфигурации (документа) в 1С 8 для дальнейшего программного вывода колонки в управляемую форму списка объекта.
Прежде чем перейти непосредственно к программному добавлению колонки элемента таблицы формы нужно добавить его выбор в текст запроса динамического списка. Таким образом подготовительный рабочий исполняемый код получается примерно следующим:
1 | | | СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка(); |
2 | | | СвойстваСписка.ОсновнаяТаблица = «Документ.РеализацияТоваровУслуг»; |
3 | | | СвойстваСписка.ДинамическоеСчитываниеДанных = Истина; |
4 | | | ИсхТекстаЗапроса = СписокРеализацииТоваровУслуг.ТекстЗапроса; |
5 | | | |
СвойстваСписка.ТекстЗапроса = СтрЗаменить(ИсхТекстаЗапроса, «ВЫБРАТЬ», «ВЫБРАТЬ»+Символы.ПС+«РеализацияТоваровУслуг.ДопМФ_Отгружено КАК ДопМФ_Отгружено,»); |
6 | | | |
ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.СписокРеализацииТоваровУслуг, СвойстваСписка); |
7 | | | //СписокРеализацииТоваровУслуг.Параметры.УстановитьЗначениеПараметра(«Параметр1», 42); |
Прокомментируем его основные моменты. В строке 1 происходит получение структуры через функцию «СтруктураСвойствДинамическогоСписка()» общего модуля «ОбщегоНазначения» для заполнения ее значений и передачи для заполнения свойств динамического списка. Для ключа «ОсновнаяТаблица» структуры в строке 2 указывается название основной таблицы, которая используюется для динамического списка, в примере это «Документ.РеализацияТоваровУслуг». Значение ключа структуры в строке 3 «ДинамическоеСчитываниеДанных» в значении «Истина». В строках 4 и 5 ведется произвольная модификация запроса.
Нажатие на изображении увеличит его
Рис. 3. Пример исходного текста произвольного запроса динамического списка реквизита управляемой формы списка документов.
Можно просто подготовить новый или измененный исходный текст запроса для указания его в ключе «ТекстЗапроса» структуры. В данном же случае была использована хитрость, чтобы минимизировать зависимость от изменений разработчиков. Происходит модификация исходного текста запроса, который определили разработчики, за счет замены подстроки «ВЫБРАТЬ», которая есть в любом запросе, на подстроку так же содержащее это обязательное слово текста запроса и текст для выборки значения добавленного реквизита документа «ДопМФ_Отгружено». Таким образом, доработка в расширении может сломаться тогда, когда разработчики существенным образом изменять исходный текст запроса. И на примере строки 5 помещаем новый вариант текста запроса в структуру. В данном примере получилось, что запрос содержит одну дополнительную строчку, чтобы выбирать значения добавленного реквизита. Порядок следования полей выборки в запросе для динамического списка не имеет значения.
Т.е. в практической задаче начало запроса программно изменялось:
С: |
ВЫБРАТЬ РеализацияТоваровУслуг.Ссылка, |
На: |
ВЫБРАТЬ РеализацияТоваровУслуг.ДопМФ_Отгружено КАК ДопМФ_Отгружено, РеализацияТоваровУслуг.Ссылка, |
Особенно обратим внимание на то, к каким объектам ведется обращение в строке 7, когда выполняется установка новой настройки для динамического списка с помощью процедуры «УстановитьСвойстваДинамическогоСписка» общего модуля «ОбщегоНазначения». В этом месте важно не перепутать, т.к. в типовой конфигурации названия элемента формы таблицы-списка и реквизита формы одинаковые. А важно, что первым параметром передается элемент управляемой формы — Таблица реквизита формы. Не перепутать его с названием реквизита формы, к которому ранее обращались для получения текста исходного запроса. Вторым параметром передается заполненная структура. Строка 7 в данном примере закомментирована, т.к. в данной прикладной задаче в тексте запроса не содержится параметров. Но, если параметр есть, то устанавливается через свойство «Параметры» и метод «УстановитьЗначениеПараметра» реквизита управляемой формы, а не элемента формы. Установка значения по имени параметра по коду как для классического запроса в 1С: первое значение — текстовое имя параметра, второе значение — собственно значение для параметра.
Нажатие на изображении увеличит его
Рис. 4. Сравнение одноименных реквизита и элемента управляемой формы 1С 8 для программного изменения текста произвольного запроса динамического списка этого реквизита формы.
После модификации текста произвольного динамического запроса реквизита управляемой формы 1С 8, становится возможным размещение колонки нового реквизита. И теперь рассмотрим код для программного вывода, размещения, добавления (как будет угодно) колонки в элемент-таблицу формы.
Нажатие на изображении увеличит его
Рис. 5. Пример кода в 1С 8 для программного вывода колонки нового реквизита объекта конфигурации, в частности документа, в элемент «Таблица» управляемой формы
По логике программного вывода в прикладной задачи новая колонка, напомним с флажком, должна выводиться сразу после колонки «Номер», содержащей данные номеров документов списка. Код на скриншоте содержит условие на то, что если колонка «Номер» по каким то причинам, например скрыта пользователем в управляемой форме, что вполне может быть (странно но может быть, ведь номер для документа является ключевым реквизитом для работы пользователей), то тогда новая колонка будет выведена самой первой в списке.
1 | | | ТаблицаФормы = Элементы.СписокРеализацииТоваровУслуг; |
2 | | | КолонкаВставки = ТаблицаФормы.ПодчиненныеЭлементы.Найти(«Номер»); |
3 | | | |
4 | | | КолонкаОтгружено = Элементы.Вставить(«_Отгружено», Тип(«ПолеФормы»), ТаблицаФормы, КолонкаВставки); |
5 | | | КолонкаОтгружено.Вид = ВидПоляФормы.ПолеФлажка; |
6 | | | КолонкаОтгружено.Заголовок = «О.»; |
7 | | | КолонкаОтгружено.Подсказка = «Отгружено»; |
8 | | | КолонкаОтгружено.ТолькоПросмотр = Истина; |
9 | | | КолонкаОтгружено.ШиринаЭлемента = 5; |
10 | | | КолонкаОтгружено.ПутьКДанным = «СписокРеализацииТоваровУслуг.ДопМФ_Отгружено»; |
Есть небольшие отличия от случая, который уже упоминался выше, добавления колонки для элемента формы Таблица динамического списка, как было описано смежной статье. В смежном случае был пример для таблицы, данными (ПутьКДанным) которой выступал «динамический список», но у которого основанием выступала таблица, а не произвольный запрос. Если отличия не учесть, то будут просто возникать ошибки. В данном же примере
Отличия заключаются в двух местах кода. Во-первых, это обращение к свойству «ШиринаЭлемента, а не просто «Ширина» как в случае, если колонка — это программно выводимая колонка динамического списка, но у которого указана «Основная таблица» и не используется произвольный запрос. Т.е. для программно добавляемой колонки динамического списка с произвольным запросом указывается свойство «ШиринаЭлемента».
Во-вторых, очень важно правильно указать значение свойства «ПутьКДанным», иначе можно получить ошибку:
Нажатие на изображении увеличит его
Рис. 6. Пример ошибки «Недопустимое значение» при указании неверного значения для свойства «ПутьКДанным» элемента управляемой формы .
{Документ.РеализацияТоваровУслуг.Форма.ФормаСписка.Форма(26)}: Ошибка при установке значения атрибута контекста (ПутьКДанным)
КолонкаОтгружено.ПутьКДанным = «Объект.СписокРеализацииТоваровУслуг.ДопМФ_Отгружено»;
по причине:
Недопустимое значение
Недопустимое значение
Конечно, подобную ошибку можно «поймать» и при других условиях. Но когда она касается свойства «ПутьКДанным», то это явно говорит о том, что указанное строковое значение попросту не верное. Следует тщательно проанализировать корректность ее составления, т.к. в реквизитах управляемых форм можно запутаться.
Нажатие на изображении увеличит его
Рис. 7. Демонстрация того, что данные элемента формы Таблица — это динамический произвольный запрос.
В текущей задаче реквизит формы (он не основной) носит имя «СписокРеализацийТоваровУслуг», а не так, как часто можно встретить в конфигурации, что основной реквизит формы носит имя «Объект». И значения для добавленной колонки берется из реквизита типа «ДинамическийСписок» и для элемента формы. Поэтому строка для «ПутьКДанным» — «СписокРеализацииТоваровУслуг.ДопМФ_Отгружено» с указанием через «.» имени нового реквизита.
Это все условия и нюансы, с которыми пришлось столкнуться на практике для программной модификации произвольного запроса динамического списка реквизита управляемой формы в 1С 8, чтобы потом программно вывести колонку нового реквизита объекта конфигурации базы в элемент «Таблица» формы .
Оцените, оказалась ли эта публикация полезна для Вас?
© www.azhur-c.ru 2013-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.
25-11-2021
Журавлев А.С.
(Сайт azhur-c.ru)
Назад
Изменить текст запроса динамического списка |
Я |
22.03.17 — 14:09
1С:Предприятие 8.3 (8.3.9.1818)
Возникла следующая проблема:
В управляемой форме необходимо при определенных условиях изменить текст запроса динамического списка.
Я это сделал так:
&НаКлиенте
Процедура ОтборПоСтатусамПриИзменении(Элемент)
……………………………
…………………………….
СменитьЗапрос(Список, стрЗапроса);
ЭтаФорма.ОбновитьОтображениеДанных();
Элементы.Список.Обновить();
КонецПроцедуры
&НаСервере
Процедура СменитьЗапрос(ДС, СтрокаЗапроса)
ДС.ТекстЗапроса = СтрокаЗапроса;
Элементы.Список.Обновить();
КонецПроцедуры
В отладчике я вижу новый текст запроса.
А в форме ничего не меняется.
Метод Обновить() пробовал и только на сервере, и только на клиенте, и на сервере а затем на клиенте.
Что я делаю не так?
1 — 22.03.17 — 14:15
ДС.ПроизвольныйЗапрос — чему равно?
2 — 22.03.17 — 14:17
свойство ПроизвольныйЗапрос
3 — 22.03.17 — 14:18
ПроизвольныйЗапрос — ИСТИНА
4 — 22.03.17 — 14:20
структура полей одинакова?
5 — 22.03.17 — 14:21
структура полей одинаковая, она не меняется
6 — 22.03.17 — 14:25
Забыл сказать, что конфигурация самописная и стоит режим совместимости Версия 8.2.16
7 — 22.03.17 — 14:27
основная таблица?
8 — 22.03.17 — 14:28
динамическоеСчитываниеДанных?
9 — 22.03.17 — 14:37
«А в форме ничего не меняется.» — а может новый текст запроса возвращает тоже самое, что и старый?
10 — 22.03.17 — 14:38
в ерп половина списков так работает
11 — 22.03.17 — 14:38
сделай в запросе ГДЕ ЛОЖЬ
12 — 22.03.17 — 14:52
(11) +1
ДС должен стать пустым
13 — 22.03.17 — 14:55
ничего не меняется
14 — 22.03.17 — 14:56
кэш?
15 — 22.03.17 — 14:57
попробуй не передавать список на сервер. а на сервере отделльно брать
16 — 22.03.17 — 14:58
когда ты передаешь список на сервер, ты передаешь копию
17 — 22.03.17 — 14:58
(0)
Не нужно передавать список с клиента на сервер — при этом на сервер приезжает (не полная) копия списка, в него устанавливается текст запроса, этот огрызок отправляется на клиент (уже без текста запроса, конечно) и там устанавливается в реквизит.
Т.е. на выходе текст запроса у списка останется таким же как и был.
Нужно устанавливать текст запрос в список, полученный прямо из реквизита формы на сервере.
Грубо говоря:
ЭтаФорма.Список.ТекстЗапроса = ….
Если очень хочется разным спискам устанавливать — можно
ЭтаФорма[ИмяСписока].ТекстЗапроса = …
18 — 22.03.17 — 15:00
(0) Вообще, если это не что-то типа консоли запросов, конечно, для чего текст запроса с клиента передавать?
19 — 22.03.17 — 15:02
Кеш очистил. Результата нет
20 — 22.03.17 — 15:05
(19) в (17) правильный ответ — проверил по своим обработкам
gvm1969
21 — 22.03.17 — 15:21
Спасибо, все получилось.
Инструкция. Программная модификация управляемых форм
Одним из требований для прохождения аудита расширения в модели сервиса является программная модификация управляемых форм без заимствования самой формы в расширение.
Мы рассмотрим основные составляющие этой задачи: добавление реквизитов, добавление элементов формы и назначение обработчиков событий элементов формы.
Добавление реквизитов
Для добавления реквизитов используется метод объекта ФормаКлиентскогоПриложения
ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);
Реквизиты формы, добавленные через конфигуратор, удалить невозможно, поэтому второй аргумент процедуры можно не указывать.
Переменная ДобавляемыеРеквизиты является массивом объектов типа РеквизитФормы.
Например, если мы создаем таблицу значений из двух колонок, то программный код для их создания будет выглядеть следующим образом:
ДобавляемыеРеквизиты = Новый Массив; ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Демо_ТаблицаДанных", Новый ОписаниеТипов("ТаблицаЗначений"), , "Таблица значений", Ложь)); ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Поставщик", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"), "ТаблицаДанных", "Кто поставляет", Ложь)); ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"), "ТаблицаДанных", "Имя товара", Ложь)); ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ОписаниеОбъекта", ТипСтрока, "", "Описание объекта", Ложь)); ИзменитьРеквизиты(ДобавляемыеРеквизиты);
К добавленным реквизитам верхнего уровня из модуля можно обращаться только с помощью конструкции ЭтотОбъект. ˂Имя реквизита˃.
Процедуру ИзменитьРеквизиты логично вызывать из обработчика ПриСозданииНаСервере, но т.к. мы не заимствуем форму в расширение, то следует найти другую точку входа. Для конфигураций УТ 11, КА 2 и ERP 2 существует типовой механизм упрощенного изменения конфигураций. Нас интересует модуль МодификацияКонфигурацииПереопределяемый, в состав которого входит процедура
ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка)
Данную процедуру можно заимствовать в расширение, добавить проверку имени формы и вставить код изменения реквизитов:
Если Форма.ИмяФормы = "Справочник.Номенклатура.Форма.ФормаЭлемента" Тогда // код модификации реквизитов КонецЕсли;
Для остальных конфигураций придется переопределять другие процедуры. Например
ПодключаемыеКоманды.ПриСозданииНаСервере(Форма)
или
ВерсионированиеОбъектов.ПриСозданииНаСервере(Форма)
Использование той или иной процедуры следует проверить в модуле редактируемой формы.
Изменение элементов формы
Управление элементами формы производится через коллекцию Элементы объекта ФормаКлиентскогоПриложения, с помощью которой можно добавлять, удалять, изменять свойства элементов формы, а также перемещать элементы формы между родителями.
Для добавления нового элемента формы требуется передать в функцию Добавить данной коллекции имя элемента, его тип и родителя (при необходимости). Например:
Элемент = Элементы.Добавить("Демо_ОписаниеОбъекта", Тип("ПолеФормы")); Элемент.Вид = ВидПоляФормы.ПолеВвода; Элемент.ПутьКДанным = "ОписаниеОбъекта";
По аналогии с добавлением реквизитов, данный код можно выполнять в функциях МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере (УТ, КА, ERP), ПодключаемыеКоманды.ПриСозданииНаСервере или ВерсионированиеОбъектов.ПриСозданииНаСервере.
При создании новых элементов формы старайтесь добавлять к их именам префикс своего расширения, чтобы избежать конфликтов с элементами формы типовой конфигурации. Этот же совет следует применять к именованию реквизитов формы, процедур, функций и глобальным переменным.
Обработка событий формы
Выполнить код по событию элемента формы можно двумя способами:
- Создать команду, указать для этой команды имя обработчика события и назначить эту команду элементу формы
- Выполнить метод УстановитьДействие элемента формы, чтобы указать имя обработчика события в модуле формы
Оба метода предполагают наличие в модуле формы процедуры с сигнатурой, соответствующей обработчику события. Для первого способа в модуле формы должна быть клиентская процедура, принимающая единственный аргумент — Команда. Для второго — всё зависит от события, для которого выполняется обработчик. Так, например, для события ПриИзменении элемента формы с типом ПолеВвода будет требоваться процедура, принимающая единственный аргумент — ЭлементФормы. А для события ПередНачаломДобавления таблицы формы — целых 6 аргументов (ЭлементФормы, Отказ, Копирование, Родитель, ЭтоГруппа, Параметр). Поэтому для некоторых событий попросту невозможно подобрать соответствующие клиентские методы в модуле формы и заимствования формы в расширение не избежать.
Для самых простых случаев (команда или событие без параметров) можно использовать следующие комбинации обработчиков и переопределяемых процедур:
- обработчик Подключаемый_ВыполнитьПереопределяемуюКоманду с переопределением процедуры МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду для УТ, КА и ERP;
- обработчик Подключаемый_ВыполнитьКоманду с переопределением процедуры ПодключаемыеКомандыКлиент.ВыполнитьКоманду
При этом в предопределенной процедуре обязательно проверять имя команды (или имя элемента формы) и имя самой формы.
Например:
ЭлементУПД.УстановитьДействие("ПриИзменении", "Подключаемый_ВыполнитьКоманду"); &Вместо("ВыполнитьКоманду") Процедура Демо_ВыполнитьКоманду(Форма, Команда, Источник) Если ТипЗнч(Форма) = Тип("ФормаКлиентскогоПриложения") И Форма.ИмяФормы = "Справочник.Контрагенты.Форма.ФормаЭлемента" Тогда Если ТипЗнч(Команда) = Тип("ПолеФормы") Тогда Если Команда.Имя = "Демо_ВедущийМенеджер" Тогда // код обработки события Возврат; КонецЕсли; КонецЕсли; КонецЕсли; ПродолжитьВызов(Форма, Команда, Источник); КонецПроцедуры;
Либо вариант с использованием команд:
Команда = Команды.Добавить("Демо_КомандаИзменитьСтроку"); Команда.Действие = "Подключаемый_ВыполнитьПереопределяемуюКоманду "; Элемент = Элементы.Добавить("Демо_ИзменитьСтроку", Тип("КнопкаФормы")); Элемент.ИмяКоманды = "Демо_КомандаИзменитьСтроку"; &Вместо("ВыполнитьПереопределяемуюКоманду") Процедура Демо_ВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры) Экспорт Если ТипЗнч(Форма) = Тип("ФормаКлиентскогоПриложения") И Форма.ИмяФормы = "Справочник.Контрагенты.Форма.ФормаЭлемента" Тогда Если Команда.Имя = "Демо_КомандаИзменитьСтроку" Тогда // код обработчика события КонецЕсли; КонецПроцедуры
Обратите внимание, что при использовании процедур, не предназначенных для программной обработки команд, следует возвращать поток выполнения методом глобального контекста ПродолжитьВыполнение, чтобы не нарушить работу типовых механизмов.
Полезные советы
Работа с динамическими списками
Довольно частой задачей является модификация в расширении текста запроса динамического списка. Многие разработчики просто копируют текст запроса из конфигуратора, редактируют его и заменяют стандартный в свойстве ТекстЗапроса объекта Динамический список.
Для небольших изменений гораздо лучше воспользоваться объектом СхемаЗапроса, появившемся в версии платформы 8.3.5. Он позволит всегда иметь актуальный текст запроса, если он поменяется при обновлении конфигурации.
Например:
СхемаЗапроса = Новый СхемаЗапроса; СхемаЗапроса.УстановитьТекстЗапроса(Список.ТекстЗапроса); Пакет = СхемаЗапроса.ПакетЗапросов[0]; Оператор = Пакет.Операторы[0]; Оператор.ВыбираемыеПоля.Добавить("РеализацияТоваровУслуг.Ссылка"); Список.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
Переопределение открываемой формы
В некоторых случаях, когда требуется кардинальное изменение формы, следует не забывать о возможности переопределения открываемой формы в модуле менеджера объекта метаданных.
Для этого следует реализовать новую форму (не заимствовать её, а написать с нуля) и в модуле менеджера переопределить процедуру ОбработкаПолученияФормы.
Например:
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" И Параметры.Ключ.Вид = Перечисления.ВидыТоваров.Услуга Тогда ВыбраннаяФорма = Метаданные.Справочники.Товары.Формы.ФормаУслуги; СтандартнаяОбработка = Ложь; КонецЕсли; КонецПроцедуры
Данный метод следует использовать с осторожностью или ограничивать его использование ключами открытия формы, т.к. в этом случае мы делаем недоступной типовую форму.
Содержание:
1. Настройки списка в 1С
2. Программное изменение запроса 1С
3. Рекомендации к запросам в динамических списках
Динамический список в 1С – это интерфейсный объект встроенного языка, который используется для отображения различных списков объектов базы данных или необъектных данных. Кроме того, он предоставляет возможность задавать произвольный текст запроса, который будет использован для считывания данных.
1. Настройки списка в 1С
Чтобы в динамическом списке 1С начать работу с произвольным запросом, необходимо в свойствах его объекта установить флаг «Произвольный запрос 1С». Далее можно перейти к настройке через «Настройку списка 1С».
В открывшемся диалоге «Динамический список в 1С» необходимо произвести основные настройки. Вкладка «Настройки» предназначена для установки значений параметров отбора, сортировки, группировки, а также условного оформления результата запроса. Вкладка «Запрос» предназначена для описания запроса. Разберем подробнее основные свойства последней.
С помощью команды «Конструктор запроса 1С» можно получить доступ к редактору текста запроса.
Свойство «Основная таблица» устанавливает основную таблицу. Данное свойство указывает динамическому списку в 1С главные данные для выбора и отображения информации, а также для предоставления стандартных команд. В случае с произвольным запросом 1С ключевые поля возможно настроить и без указания основной таблицы. Делается это посредством свойств «Вид ключа» и «Поля ключа».
Свойство «Динамическое считывание данных» определяет необходимость считывать данные порциями приближенно равными количеству видимых строк в таблице. При отключении данного свойства будут считаны все данные. Также в официальной документации можно найти информацию об изменении поведения данного свойства при установке дополнительных настроек.
Свойство «Автозаполнение доступных полей» позволяет системе установить доступные поля для отбора, порядка, выбора, группировки.
2. Программное изменение запроса 1С
3. Рекомендации к запросам в динамических списках
Динамические списки 1С предназначены для непосредственного представления информации пользователю, поэтому главную роль играет скорость обновления и вывода данных. Выделим ряд основных рекомендаций, которые следует учесть при проектировании.
Во-первых, стоит проектировать простые запросы за счет оптимизации архитектуры конфигурации. Например, сложные вычисления проводить не в запросе, а при проведении документов, включая их регистры, которые затем и использовать в запросе.
Во-вторых, необходимо рассматривать возможности индексирования полей, данные которых ожидается использовать при настройке группировок, порядка, отбора, группировок. Следует учесть, что избыточность индексов приводит к неоправданной нагрузке.
В-третьих, следует ограничить количество соединений с реальными и виртуальными таблицами, а также вложенными запросами. Оптимальный случай – использовать только основную таблицу.
Вместе с тем для эффективного использования запросов стоит ознакомиться с требованиями по разработке оптимальных запросов.
Специалист компании ООО «Кодерлайн»
Коротеньких Руслан