Универсальные функции с примерами использования

0. Роман Уничкин (unichkin) 453 28.01.16 12:36 Сейчас в теме
11 универсальных функций, с примерами использования - для обычного и управляемого интерфейса

Перейти к публикации

Комментарии
1. Артем Бардюг (Йожкин Кот) 1038 26.02.16 17:21 Сейчас в теме
Замер времени можно сделать точнее:
ТекущаяУниверсальнаяДатаВМиллисекундах(). Функция появилась в каком-то релизе 8.3
Dmitriy_T; JesteR; dark_wolf; vladir; +4 Ответить 1
2. tireal 63 02.03.16 08:36 Сейчас в теме
вот держи в копилку, вместо своего замера
докВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
//процедура замера
докВремяКонцаВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах();
докДельта = (докВремяКонцаВыполнения - докВремяНачала) / 1000;


докДельтаПредставление = ПолучитьПредставлениеВремени(докДельта);

Функция ПолучитьПредставлениеВремени(Время)
	Секунды = Время % 60;
	Минуты = (Время-Секунды)/60;
	Минуты = Минуты % 60;
	Часы = (Время-Секунды-Минуты)/3600;
	
	Возврат "" + Окр(Часы) + " ч. " + Окр(Минуты) + " мин. " + Окр(Секунды, 2) + " сек.";
	
КонецФункции
...Показать Скрыть
3. Роман Уничкин (unichkin) 453 02.03.16 12:01 Сейчас в теме
(1) Йожкин Кот, это поддерживается только с 8.2.17
(2) tireal, спасибо за комментарий. Но:
- свою функцию я могу использовать в любом релизе платформы. Да, я порой работаю с 8.1 - как ни странно оно еще есть.
- если мне когда-нибудь понадобится настолько низкоуровневое отслеживание выполнения алгоритма - я скорее воспользуюсь замером времени отладчика
- могу предположить что назначение использования вашей функции - тестирование скорости исполнения алгоритма (т. е. она для этой цели писалась); моей - просто замер времени работы для сообщения/ помещения в лог - секунды вполне устраивают
Останусь при своем, но буду знать и о таком варианте, еще раз спасибо.
4. Виктор Назаров (androgin) 02.03.16 14:58 Сейчас в теме
вместо Функция РазбитьСтроку(стр, сим)
можно вполне использовать СтрРазделить()
5. Роман Уничкин (unichkin) 453 02.03.16 15:12 Сейчас в теме
(4) androgin, Во-первых назначение СтрРазделить() и моей РазбитьСтроку() - разное. От слова совсем. Во-вторых СтрРазделить() - это начиная с 8.3.6.1977.
6. Андрей Акулов (DrAku1a) 1209 03.03.16 02:46 Сейчас в теме
(3) unichkin, посмотри как сделано в ИР и универсальном отчете (от alexk-is), там есть до миллиекунд.
Попытка
		Scr = Новый COMОбъект("MSScriptControl.ScriptControl");
	Исключение
		Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
		Возврат 0;
	КонецПопытки;
	Scr.Language = "javascript";
	Время = Scr.Eval("new Date().getTime()");
	Возврат Время;
...Показать Скрыть

По поводу разделения строки - держи в копилку:
Функция ИзвлечьСлово(Строка, Разделитель)
	П = найти(Строка+Разделитель, Разделитель);
	Ответ = Лев(Строка, П-1);
	Строка = Сред(Строка, П+СтрДлина(Разделитель));
	Возврат Ответ;
КонецФункции

Пример:
стр = "1,2,3,4";
Сообщить(ИзвлечьСлово(стр, ",")); //1
Сообщить(стр); // 2,3,4
Сообщить(ИзвлечьСлово(стр, ",")); //2
Сообщить(стр); // 3,4
Сообщить(ИзвлечьСлово(стр, ",")); //3
Сообщить(стр); // 4
Сообщить(ИзвлечьСлово(стр, ",")); //4
Сообщить(стр); // "" (пустая строка)
Сообщить(ИзвлечьСлово(стр, ",")); // "" (пустая строка)
...Показать Скрыть

Если заранее известно, что строка не содержит символов перевода строки, то можно пользоваться стандартным:
СтрПолучитьСтроку(СтрЗаменить(<ИсходнаяСтрока>, <Разделитель>, Символы.ПС), <НомерСлова>)
7. Андрей (h00k) 44 03.03.16 05:28 Сейчас в теме
(3) unichkin,
- если мне когда-нибудь понадобится настолько низкоуровневое отслеживание выполнения алгоритма - я скорее воспользуюсь замером времени отладчика

Смешно. Вы думаете всякие извращения с джаваскриптами и т.п. появились потому что ни кто не додумался время выполнения в отладчике смотреть?!
Спасибо любимой 1С, они хоть от необходимости использовать внешние скрипты избавили, добавив в платформу функцию
ТекущаяУниверсальнаяДатаВМиллисекундах()

А для старых версий платформы остается только замерять время выполнения при помощи внешних средств, например джава-скрипта.
8. Роман Уничкин (unichkin) 453 03.03.16 11:43 Сейчас в теме
(6) Знаю я об этих фишках, спасибо. Функция "ИзвлечьСлово" - не учитывает что символа может и не быть. И режет исходную строку. Как-раз чтобы этого избежать я наваял сп_РазбитьСтроку() - ее конечно не стоит применять на большом массиве данных, но для чтения небольших листов Excell - самое оно.
(7) h00k, почитайте внимательнее мой комментарий в (3) . И да, мне удобнее воспользоваться замером времени, чем вставлять в конфу отладочную печать. Не могу вспомнить случая, когда я не мог без этого обойтись. Может опыта еще маловато)

Имхо, все извращения с получением настолько точного времени - связаны с необходимостью отслеживать СКОРОСТЬ, а не ВРЕМЯ выполнения алгоритма. Разница трудноуловима, но она есть. Мне не надо с точностью до миллисекунды знать сколько времени проводился массив документов - 20 мин меня вполне устроит. Но если я тестирую напр. как быстрее создавать таблицу значений - тут нужны миллисекунды. Просто для универсальности функция замера обычно реализуется наиболее детализированно - т.е. через тот-же ява-скрипт. Ну а мне как-то не нужно было. Если понадобится - возьму из (6).
9. Валерий Дегрик (mars207) 22 09.03.16 09:37 Сейчас в теме
Загрузка файлов: выбор на клиенте, обработка на сервере

На веб клиенте давно не работает. Проблема всплывающих окон в браузерах. На последних релизах платформы не тестировал, но подозреваю что не исправили.
10. Роман Уничкин (unichkin) 453 09.03.16 09:39 Сейчас в теме
(9) mars207, тестировал на 8.3.5 - у меня работает. чяднт?
11. Виктор Назаров (androgin) 13.03.16 02:25 Сейчас в теме
(9) mars207, все прекрасно работает
12. Виктор Назаров (androgin) 13.03.16 02:26 Сейчас в теме
(5) unichkin, уже давно все типовые версии требуют 8.3.6.2094 как минимальную
13. Михаил (MishaD) 12 13.03.16 10:03 Сейчас в теме
Странно, у меня половина типовых на 8.2.14.540, а еще половина на 7.7.027
14. Роман Уничкин (unichkin) 453 13.03.16 13:18 Сейчас в теме
(12) androgin, далеко не все используют исключительно типовые, и далеко не все еще перешли на новые конфы с УФ и БСП. Я уже писал в (3) что и с 8.1 иногда работаю.
15. Виктор Назаров (androgin) 21.03.16 14:33 Сейчас в теме
(14) unichkin, то, что вы тормозите собственное развитие и сидите в старых платформах и на старых методах - вынуждает вас писать подобные коды и изобретать очередной велосипед.
В 1С далеко не дураки сидят
16. Андрей (h00k) 44 21.03.16 22:31 Сейчас в теме
(15) androgin,
то, что вы тормозите собственное развитие и сидите в старых платформах и на старых методах - вынуждает вас писать подобные коды

Вы можете ошибаться... собственное развитие и вынужденная работа со старыми версиями конфигураций в учетных системах заказчика/ работодателя - в большинстве случаев ни как не связаны.
Переход предприятия на новую систему учета/ платформу - это достаточно дорогое удовольствие, и только из-за желания программиста работать с новыми версиями платформ/ конфигураций ни кто, в здравом уме, переходить не будет.
17. Роман Уничкин (unichkin) 453 22.03.16 01:56 Сейчас в теме
(15) androgin, не понимаю сути претензий. И с чего вы решили что я где-то там "торможусь"?.. Я подписан на рассылку, просматриваю ИТС, мониторю зазеркалье (о птичках) работаю в основном на 8.3.6. И абсолютно солидарен с вами что в 1С сидят не дураки. Я только не понимаю, к чему это было сказано) Лучше перечитайте (5), попробуйте вникнуть в назначение сп_РазбитьСтроку() и понять таки что СтрРазделитьСтроку() в ее контексте в принципе не нужна. Я наверное сам дал еды троллю - лишним было писать "Во-вторых СтрРазделить() - это начиная с 8.3.6.1977".
18. Андрей Крутских (K_A_O) 485 28.03.16 11:33 Сейчас в теме
> Преобразование табличного документа в таблицу значений

Вот это вроде с давних времен работает

Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных=Новый ОписаниеИсточникаДанных(ТабДок.Область());       
Построитель.Выполнить();
ТЗ = Построитель.Результат.Выгрузить();
Azimut-tm; terrorion; yukon; pavlov_dv; TreeDogNight; Rokstedi; unichkin; +7 Ответить 1
19. Александр Шипков (sansys) 31 07.01.17 12:17 Сейчас в теме
Спасибо за статью. Иногда стоит вылезти из своего болота и посмотреть как люди делают :))))) +1
20. Сергей Долинин (ImHunter) 6 09.01.17 07:52 Сейчас в теме
Про замеры времени. Написал пару процедур - засечь время и показать время замера (+ 2 вспомогательные). Недостаток - в многопотоке некорректно работает. А так, удобненько.
// клиентский модуль

Процедура ЗасечьТаймер() Экспорт 
	УправляемыйИнтерфейсСервер.СохранитьЗначениеВХранилище( "ТекВремяТаймера", ТекущаяДата() );
	//ПоместитьВоВременноеХранилище( ТекущаяДата(), );
КонецПроцедуры

Процедура ПоказатьВремяТаймера( пЗаголовок = "", пЧерезСообщение = Ложь ) Экспорт 
	д = УправляемыйИнтерфейсСервер.ПолучитьЗначениеИзХранилища( "ТекВремяТаймера" );
	общ = ТекущаяДата() - д;
	мин = цел( общ / 60 );
	сек = общ - мин * 60;
	час = цел( мин / 60);
	мин = мин - час * 60;
	лВрем = ?( пЧерезСообщение, "Время выполнения:", "Время:" );
	Если час <> 0 Тогда 
		лВрем = лВрем + " " + час + " час"
	КонецЕсли;
	Если Мин <> 0 Тогда 
		лВрем = лВрем + " " + мин + " мин"
	КонецЕсли;
	лВрем = лВрем + " " + сек + " сек";
	Если пЧерезСообщение=Ложь Тогда 
		ПоказатьОповещениеПользователя( пЗаголовок, , лВрем );
	Иначе 
		Сообщить( ?( ПустаяСтрока( пЗаголовок ), "Действие выполнено", пЗаголовок ) + ". " + лВрем );
	КонецЕсли;
КонецПроцедуры

// серверный модуль УправляемыйИнтерфейсСервер

Процедура СохранитьЗначениеВХранилище( пКлюч, пЗначение ) Экспорт
	ХранилищеСистемныхНастроек.Сохранить( , пКлюч, пЗначение, , ПараметрыСеанса.ТекущийПользователь );	
КонецПроцедуры

Функция ПолучитьЗначениеИзХранилища( пКлюч ) Экспорт
	Возврат ХранилищеСистемныхНастроек.Загрузить( , пКлюч, , ПараметрыСеанса.ТекущийПользователь );
КонецФункции


// пример использования
&НаКлиенте
Процедура СделатьЧтоТо()
  УправляемыйИнтерфейс.ЗасечьТаймер();
  // что-то делаем
  // ......................
  УправляемыйИнтерфейс.ПоказатьВремяТаймера("Сделали что-то!");
КонецПроцедуры

...Показать Скрыть
21. Альтаир (Altair777) 638 06.07.17 09:21 Сейчас в теме
(18) А у меня еще дополнено
Построитель.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
Построитель.ЗаполнитьНастройки();
22. Иван Устьянцев (nSpirit2) 09.08.17 13:55 Сейчас в теме
Я конечно все понимаю но раз вы пишите
Код я оформляю в соответствии с соглашениями о написании кода.


Еще раз прочитайте эту часть
https://its.1c.ru/db/v8std#content:2149184103:hdoc

Мне кажется вы не правильно поняли блок как не надо делать
23. Роман Уничкин (unichkin) 453 09.08.17 17:34 Сейчас в теме
(22)
Мне кажется вы не правильно поняли блок как не надо делать

Какой участок кода навел вас на эту мысль?
Оставьте свое сообщение