gifts2017

Использование методов глобального контекста в системе компоновки данных или недокументированные возможности СКД

Опубликовал Валерий К (klinval) в раздел Программирование - Практика программирования

Прочитал на форуме, что СтрРазделить() и ТекущаяДата() работают в языке выражений системы компоновки данных. Почитал справку, там ничего не нашёл, поэтому не поверил. Посмотрел на практике – и правда работает… В данной статье попытался привести весь перечень методов, работающих в СКД, но не описанных в документации.

На ИТС нашёл упоминание, что ТекущаяДата() работает в СКД (в справке про это ни слова),  про другие методы описанные в статье ничего не нашёл.

Как собиралась информация: открыл в СП раздел «Глобальный контекст» и все методы проверял в СКД. Функции, которые помнил, что есть в СКД пропускал как заведомо рабочие. Также пропускал методы заведомо не рабочие, например ПоказатьВопрос. Прошёлся методом перебора по порядку по разделам «Функции работы со значениями типа Строка», «Функции работы со значениями типа Число», «Функции работы со значениями типа Дата» и т.д. до «Процедуры и функции сохранения значений».

Следующие за ним разделы решил не проверять, т.к. они явно не для работы из чистого СКД (например «Процедуры и функции работы с операционной системой», «Процедуры и функции работы с внешними компонентами» и т.д.).


Проверял в СКД на данных полученные запросом:

ВЫБРАТЬ
	"111,ааа" КАК Строка,
	ДАТАВРЕМЯ(2016, 1, 20, 12, 24, 59) КАК Дата,
	1.5 КАК Число

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"ааа2фыава,пролджэ",
	ДАТАВРЕМЯ(2012, 2, 22, 2, 22, 52),
	2.49


Перечень методов глобального контекста работающих в СКД на платформе «8.3.8.1652» «8.3.7.1845», «8.3.6.2390» и «8.2.19.130» в управляемом приложении клиенте:

  1. СтрНайти (не работает на 8.3.7.1845, 8.3.6.2390 и 8.2.19.130). Найти на 8.2.19.130 тоже не работает.
  2. СтрСравнить (не работает на 8.3.7.1845, 8.3.6.2390 и 8.2.19.130)
  3. СтрНачинаетсяС (не работает на 8.3.7.1845, 8.3.6.2390 и 8.2.19.130)
  4. СтрЗаканчиваетсяНа (не работает на 8.3.7.1845, 8.3.6.2390 и 8.2.19.130)
  5. СтрРазделить (не работает на 8.3.7.1845, 8.3.6.2390 и 8.2.19.130)
  6. СтрСоединить (не работает на 8.3.7.1845, 8.3.6.2390 и 8.2.19.130)
  7. ТекущаяДата()
  8. СтрШаблон (не работает на 8.3.7.1845, 8.3.6.2390 и 8.2.19.130)
  9. ЧислоПрописью
  10. НСтр
  11. ПредставлениеПериода
  12. ПолучитьОбщийМакет
  13. ПредопределенноеЗначение
  14. ПолучитьПолноеИмяПредопределенногоЗначения
  15. ПолучитьСкоростьКлиентскогоСоединения()
  16. ИмяКомпьютера()
  17. ИмяПользователя()
  18. ПолноеИмяПользователя()
  19. КаталогПрограммы()
  20. КаталогВременныхФайлов()
  21. ПравоДоступа – тут надо разбираться как передать ОбъектМетаданных в параметр
  22. РольДоступна
  23. ТекущийЯзык()
  24. ТекущийКодЛокализации()
  25. СтрокаСоединенияИнформационнойБазы()
  26. ПараметрыДоступа – тут надо разбираться как передать ОбъектМетаданных в параметр
  27. ПредставлениеПриложения
  28. ТекущийЯзыкСистемы()
  29. ТекущийРежимЗапуска()
  30. ЧасовойПоясСеанса()
  31. ТекущаяДатаСеанса()
  32. ПредставлениеПрава
  33. ПолучитьИнформациюЭкрановКлиента() (не работает на 8.2.19.130)
  34. ТекущийВариантОсновногоШрифтаКлиентскогоПриложения() (не работает на 8.2.19.130)
  35. ТекущийВариантИнтерфейсаКлиентскогоПриложения() (не работает на 8.2.19.130)
  36. ЗначениеВСтрокуВнутр
  37. ЗначениеИзСтрокиВнутр
  38. ПолучитьИмяВременногоФайла()
  39. ЗначениеЗаполнено (зачеркнул, т.к. есть в справке)
  40. ТекущаяУниверсальнаяДатаВМиллисекундах()


Среди этих методов есть абсолютно бесполезные, например «ПолучитьИнформациюЭкрановКлиента()» (даже представить не могу где это можно применить в чистом СКД), но есть и очень даже полезные, например «ЧислоПрописью». К сожалению, СокрЛП до сих пор не работает…

Получается использовать данные выражения можно только на свой страх и риск, т.к. в справке о них ни слова, значит работоспособность не гарантируется.

Ответ от разработчиков: 
В выражениях компоновки данных можно использовать функции общих модулей и функции глобального контекста.

В отчете нет ничего нового относительно данной статьи, но к сожалению, написать бесплатную статью с файлом нельзя по правилам Инфостарта. В отчете все 40 методов тестируются на «чистом» СКД через вычисляемые поля. Результат работы отчета приведен в скриншоте к статье. Если проверять на базе где нет «Перечисление.ВидыИмущества.ОсобенностиОтсутствуют» то методы ПредопределенноеЗначение и ПолучитьПолноеИмяПредопределенногоЗначения работать не будут, поэтому требуется ручная замена на что-нибудь подходящее.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Проверка недокументированных возможностей в СКД
.erf 9,93Kb
04.08.16
15
.erf 9,93Kb 15 Скачать

См. также

Вознаграждение за ответ
Сумма: 1 $m
Добавили:
С К (kraynev-navi) (1.00 $m)
Подписаться Добавить вознаграждение

Лучшие комментарии

28. Алексей Апанасович (Aphanas) 02.09.16 23:16
Также работает метод глобального контекста "XMLСтрока". С помощью него можно быстро получить представление уникального идентификатора любой ссылки: XMLСтрока(Ссылка). Возвращает что-то типа "6a09f20a-8de6-11e1-b3e1-001617ec3f2a". Многие ищут и не находят как получить уникальный идентификатор в запросе. Это способ получения уникального идентификатора в СКД.
echo77; klinval; zarucheisky; olbu; Synoecium; +5 Ответить

Остальные комментарии

1. Анатолий (aka Любитель XML) 05.08.16 11:53
Спасибо, хорошая статья
2. Tindir Mindir (tindir) 05.08.16 17:56
ага. опять какой-то разраб написать написал, а документацию не догнали. кстати, как там в спавке по поводу ВычислитьВыражение(Выражение, Группировка, ТипРасчета, Начало, Конец, Сортировка, ИерархическаяСортировка, ОбработкаОдинаковыхЗначенийПорядка)? в последнем релизе нет. Мне 1с по качеству и обьемному наполнению справки все чаще начинает напоминать оупень-сорсь, но платный. и если у тебя в node нет мануала к модулю, то всегда можно почитать исходник, а как быть с http в 1с, если тебе нужно что-то сложнее халовордия....
3. Яков Коган (Yashazz) 07.08.16 12:59
Автор, на каком релизе проверял? Сдаётся мне, это фича из новых, или нестабильно работающих, как всё недокументированное.
4. Валерий К (klinval) 07.08.16 18:24
(3) Yashazz,
Автор, на каком релизе проверял? Сдаётся мне, это фича из новых, или нестабильно работающих, как всё недокументированное.

В статье специально написал:
на платформе «8.3.8.1652» в тонком клиенте

На форуме люди писали, что на 8.3.8.1784 работает. Будет 1С-ка под рукой - опробую ещё на каком-нибудь релизе, статью дополню по результатам. Если уже кто-то уже опробовал: просьба отписываться в комментах!

Ещё отправил в ТП письмо, они уже переслали разработчикам. Пока ответа нет... Будет ответ - дополню статью, чтобы понимать что это: недоработка документации или функции работающие в тестовом режиме.
5. Андрей Карпов (karpik666) 07.08.16 19:14
хм, может конечно я что-то путаю, но данный функционал был доступен всегда, еще по бесплатным курсам Гилева говорилось, что в скд в параметр или вычисляемых полях можно использовать функции 1с, а также функции общих модулей, исполняемых на сервере, однако делать это не рекомендуется так как по сути выполняется код в цикле, и если это будет обращение к базе данных, то это сильно замедляет работу.
Сурикат; +1 Ответить 1
6. Валерий К (klinval) 08.08.16 09:48
(5) karpik666,
еще по бесплатным курсам Гилева говорилось, что в скд в параметр или вычисляемых полях можно использовать функции 1с

Какие именно функции? Какого раздела справки? Я проверял только методы глобального контекста и они работают далеко не все.

Если эти методы уже давно работали то тогда есть ряд вопросов:
1. Какого года курсы Гилева, и какая тогда платформа была? Если тогда ещё всё работало, то почему сейчас не работает "СокрЛП"?
2. Если ещё тогда всё работало, почему в справке ни слова за эти годы не появилось?
3. Опять таки почему такие ненужные в СКД вещи как ПолучитьИнформациюЭкрановКлиента() работают, а нужные, типа СокрЛП не работают?

Как по мне больше вероятности что функции заработали в СКД случайно: может некоторые методы "причесали" под какой-нибудь общий формат, благодаря чему они стали доступны сразу в 2 местах: из кода и из СКД. А иначе как объяснить то, что действительно нужные методы не работают, а ненужные работают? Если бы это была системная работа, то логичней сначала заставить работать СокрЛП в СКД.

Чтобы не гадать подождём что разработчики скажут...
7. Валерий К (klinval) 08.08.16 10:03
Проверил на «8.3.7.1845» и «8.3.6.2390» в файловом режиме. Статью обновил.
8. Андрей Карпов (karpik666) 08.08.16 13:03
(6) klinval, вот про эти курсы говорил http://www.spec8.ru/kurs-po-skd-besplatno
там в 21 кажется уроке описывает про "выражение представления" поля и описывается, что в них можно использовать данный функционал. Курс уже очень старый.
А вот, что нашел про использование функций "ТекущаяДата()" и "значениеЗаполнено()", они вообще доступны с релиза 8.2.14 http://1cskd.ru/2011/07/novye-funkcii-skd-8-2-14/
9. Валерий К (klinval) 08.08.16 13:57
(8) karpik666,
вот про эти курсы говорил http://www.spec8.ru/kurs-po-skd-besplatno
там в 21 кажется уроке описывает про "выражение представления" поля и описывается, что в них можно использовать данный функционал.

Потом качну/посмотрю. А точно 21 урок? Я вроде по порядку подсчитал: 21 это "Возможности упорядочивания в отчетах". Вы наверное имели ввиду "Вычисляемые поля"?
А вот, что нашел про использование функций "ТекущаяДата()" и "значениеЗаполнено()", они вообще доступны с релиза 8.2.14 http://1cskd.ru/2011/07/novye-funkcii-skd-8-2-14/

Про текущую дату уже писал в статье, что про неё есть упоминания в ИТС, но нет в справке. Посмотрел про "ЗначениеЗаполнено" - оказывается есть в справке. Статью поправил, ЗначениеЗаполнено зачеркнул. Так что не удивительно, что они уже давно работают: один я не заметил в справке, другой есть в доках на ИТСе.

Я не спорю: вполне возможно всё это работает уже давно, просто когда-то кто-то забыл внести это в справку. Т.е. методы уже годами работают, только никто об этом не знает... Может они не внесены в справку, т.к. официально находятся в тестовом режиме. Мы можем только гадать. Будет ответ от ТП - отпишусь.
10. Андрей Карпов (karpik666) 08.08.16 17:51
(9) klinval, точно 21, но там описывается именно про "Выражение упорядочивания" в параметрах, и как в них использовать общие модули.
11. Сергей Лесовой (Synoecium) 10.08.16 07:42
Сделал в глобальном модуле такую функцию:
Функция глВыполнитьПроизвольныйКод(Арг, ТекстКода,Результат=0) Экспорт
Выполнить(ТекстКода);Возврат Результат;
КонецФункции

и теперь можно вызывать любую функцию или кусок кода на языке 1с из СКД. В том числе СокрЛП()
12. Андрей Карпов (karpik666) 10.08.16 07:49
(11) Synoecium, Например такой?
	Для Каждого лРегистр Из Метаданные.РегистрыНакопления Цикл	
		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ Различные
		|	Регистр.Регистратор
		|ИЗ
		|	РегистрНакопления." + лРегистр.Имя + " КАК Регистр";
		лВыборка = Запрос.Выполнить().Выбрать();
		лНаборЗаписей = РегистрыНакопления[лРегистр.Имя].СоздатьНаборЗаписей();
		Пока лВыборка.Следующий() Цикл
			лНаборЗаписей.Отбор.Регистратор.Установить(лВыборка.Регистратор);
			лНаборЗаписей.Записать(); 
		КонецЦикла; 
	КонецЦикла; 
...Показать Скрыть
13. Валерий К (klinval) 10.08.16 09:29
(10) karpik666, посмотрел 21/22 "Возможности упорядочивания в отчетах" , 20/21 Представление полей компоновки в отчете"и 24/25 "Вычисляемые поля" - там этого нет... Зато есть в 15/16 "Функции выражений компоновки данных" про текущую дату и значение заполнено.
Но оба этих метода объяснимы: ЗначениеЗаполнено - я не заметил, что оно уже есть в справке, а то что ТекущаяДата() работает на СКД - есть упоминание на ИТСе.

Попробую проверить на 8.2 что ещё работает. Отпишусь как проверю

//10.08.16 9:38
Проверил: естественно не заработали методы которых физически не было в на той платформы типа "СтрНайти" (и даже "найти" не заработало), "ТекущийВариантИнтерфейсаКлиентскогоПриложения" и т.д. А остальные заработали.
//9:43
По результатам проверки обновил статью.
14. Валерий К (klinval) 10.08.16 09:53
(11) Synoecium, да это понятно. Функции общих модулей уже давно можно было использовать! Вот только что делать если нужно, например "ЧислоПрописью", а база на поддержке? Или пишешь что-нибудь универсальное для публикации на ИС (или для продажи): в инструкции писать, что базу обязательно надо снять с поддержки и внедрить такой-то модуль с таким-то текстом?
А если база своя то можно где-то обойтись и функциями общих модулей - тут согласен. Правда не всегда это будет оптимально в плане производительности.
15. Сергей Лесовой (Synoecium) 10.08.16 10:44
(12) karpik666, практически любой, но если получать метаданные и вертеть запросы для каждой записи СКД, то будет очень тормозить (если их много конечно)
16. Sergey Andreev (starik-2005) 10.08.16 10:47
Даже экспортные функции и даже на 8.2 работают. Так что не понимаю, в чем новизна статьи.
17. Валерий К (klinval) 10.08.16 11:03
(16) starik-2005,
Даже экспортные функции и даже на 8.2 работают

Уже который раз пишу: да уже давно работают функции общих модулей. Я это нигде не отрицал и не представлял как своё открытие.
Так что не понимаю, в чем новизна статьи.

Покажите мне место в документации или на ИТС, где написано, что, например, ЧислоПрописью работает в СКД? Нигде этого нет, хотя метод работает ещё с 8.2.

В этом и суть статьи: показать программисту 1С, что некоторые методы, не описанные в документации, вполне себе работают на чистом СКД. Да, эти же методы можно было бы применять через функции общих модулей, но есть минусы, описанные выше в (14).
18. Андрей Карпов (karpik666) 10.08.16 11:18
(15) Synoecium, это был сарказм, оставлять метод "ВыполнитьПроизвольныйКод", да и еще и экспортный это огромная уязвимость. такой простенький код как мой может просто уничтожить данные в базе, наверное вишенкой такого метода можно еще выполнять передаваемый код в привилегированном режиме. Если уж хотите выполнять какой-то код из модуля, то лучше передавать наименование метода, и параметры к нему, и обрабатывать его уже в коде. А от вашего способа лучше воздержаться.
19. Владимир Чаклин (vec435) 10.08.16 11:22
(12) karpik666, а можно передать в эту функцию значение поля конкретной записи как какой-нить параметр?
20. Ирина progr-2008 Санкт-Петербург (progr-2008) 10.08.16 11:23
Интересно как дополнение к курсам.
21. Валерий К (klinval) 10.08.16 12:26
(18) karpik666, согласен, что
"ВыполнитьПроизвольныйКод", да и еще и экспортный это огромная уязвимость

Единственное, что хотел добавить: СКД на некоторый код пишет ошибку <Установлен безопасный режим. Выполнение операции запрещено> даже если встроить отчет в БД или добавить во внешние обработки с БезопаснымРежимом=Ложь. Соответственно код в привилегированном режиме из СКД работать не будет, т.к. видимо любой код в вычисляемых выражениях принудительно работает в безопасном режиме и это не отменить.

Естественно ВыполнитьПроизвольныйКод с вызовом из СКД и удалением в привилегированном режиме из ограниченного пользователя я на практике не проверял, т.к. сам таким методом не пользуюсь. Но глобальный экспортный метод ведь не только из СКД можно вызвать...
22. Сергей Лесовой (Synoecium) 10.08.16 12:30
(18) karpik666, в 1с столько дыр в безопасности, что глобальный экспортный метод это такая малость, что даже смешно обсуждать.
23. Сергей Лесовой (Synoecium) 10.08.16 12:47
(14) klinval, вообще да, согласен. Глобальные методы из коробки - хорошее подспорье для внешних отчетов например. Так что плюс)
24. Александр Потапов (tiniji) 11.08.16 15:12
(2) tindir, Эта информация есть в режиме 1С Предприятие. В конфигураторе такого нет про СКД.
25. Валерий К (klinval) 29.08.16 09:12
Пришёл ответ от разработчиков (далее цитирую):
Ответ от разработчиков:
В выражениях компоновки данных можно использовать функции общих модулей и функции глобального контекста.
26. Сан Саныч (herfis) 29.08.16 09:42
В выражениях компоновки данных можно использовать функции общих модулей и функции глобального контекста.

Может, они имеют в виду - при включенном режиме использования функций общих модулей? Потому что иначе это противоречит твоим исследованиям. Глобальный контекст доступен очень ограниченно.
Результаты сабжевого исследования очень похожи на непреднамеренное "просачивание" контекста в связи с какими-то доработками СКД. Поэтому я почти уверен, что разработчики сами достоверно не знают чего там нового доступно стало в конексте выражений СКД, так как это побочный эффект а не целенаправленный.
27. Валерий К (klinval) 29.08.16 10:04
(26) herfis, ну да, тот же СокрЛП не работает, хотя тоже функция глобального контекста. Т.е. их ответ явно не полный.
Результаты сабжевого исследования очень похожи на непреднамеренное "просачивание" контекста в связи с какими-то доработками СКД. Поэтому я почти уверен, что разработчики сами достоверно не знают чего там нового доступно стало в конексте выражений СКД, так как это побочный эффект а не целенаправленный.

У меня это тоже основная версия, но никто кроме разработчиков платформы её подтвердить или опровергнуть не может...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа