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

0. 1348 28.01.16 12:36 Сейчас в теме
14 универсальных функций, с примерами использования - для обычного и управляемого интерфейса

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Йожкин Кот 1081 26.02.16 17:21 Сейчас в теме
Замер времени можно сделать точнее:
ТекущаяУниверсальнаяДатаВМиллисекундах(). Функция появилась в каком-то релизе 8.3
Yakud3a; ZOMI; awk; Dmitriy_T; JesteR; dark_wolf; vladir; +7 Ответить
3. unichkin 1348 02.03.16 12:01 Сейчас в теме
(1) Йожкин Кот, это поддерживается только с 8.2.17
(2) tireal, спасибо за комментарий. Но:
- свою функцию я могу использовать в любом релизе платформы. Да, я порой работаю с 8.1 - как ни странно оно еще есть.
- если мне когда-нибудь понадобится настолько низкоуровневое отслеживание выполнения алгоритма - я скорее воспользуюсь замером времени отладчика
- могу предположить что назначение использования вашей функции - тестирование скорости исполнения алгоритма (т. е. она для этой цели писалась); моей - просто замер времени работы для сообщения/ помещения в лог - секунды вполне устраивают
Останусь при своем, но буду знать и о таком варианте, еще раз спасибо.
6. DrAku1a 1418 03.03.16 02:46 Сейчас в теме
(3) посмотри как сделано в ИР и универсальном отчете (от 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
Сообщить(стр); // "" (пустая строка)
Сообщить(ИзвлечьСлово(стр, ",")); // "" (пустая строка)
Показать

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

Имхо, все извращения с получением настолько точного времени - связаны с необходимостью отслеживать СКОРОСТЬ, а не ВРЕМЯ выполнения алгоритма. Разница трудноуловима, но она есть. Мне не надо с точностью до миллисекунды знать сколько времени проводился массив документов - 20 мин меня вполне устроит. Но если я тестирую напр. как быстрее создавать таблицу значений - тут нужны миллисекунды. Просто для универсальности функция замера обычно реализуется наиболее детализированно - т.е. через тот-же ява-скрипт. Ну а мне как-то не нужно было. Если понадобится - возьму из (6).
7. h00k 44 03.03.16 05:28 Сейчас в теме
(3)
- если мне когда-нибудь понадобится настолько низкоуровневое отслеживание выполнения алгоритма - я скорее воспользуюсь замером времени отладчика

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

А для старых версий платформы остается только замерять время выполнения при помощи внешних средств, например джава-скрипта.
2. tireal 72 02.03.16 08:36 Сейчас в теме
вот держи в копилку, вместо своего замера
докВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
//процедура замера
докВремяКонцаВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах();
докДельта = (докВремяКонцаВыполнения - докВремяНачала) / 1000;


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

Функция ПолучитьПредставлениеВремени(Время)
	Секунды = Время % 60;
	Минуты = (Время-Секунды)/60;
	Минуты = Минуты % 60;
	Часы = (Время-Секунды-Минуты)/3600;
	
	Возврат "" + Окр(Часы) + " ч. " + Окр(Минуты) + " мин. " + Окр(Секунды, 2) + " сек.";
	
КонецФункции
Показать
Merkalov; croga; +2 1 Ответить
4. androgin 02.03.16 14:58 Сейчас в теме
вместо Функция РазбитьСтроку(стр, сим)
можно вполне использовать СтрРазделить()
5. unichkin 1348 02.03.16 15:12 Сейчас в теме
(4) androgin, Во-первых назначение СтрРазделить() и моей РазбитьСтроку() - разное. От слова совсем. Во-вторых СтрРазделить() - это начиная с 8.3.6.1977.
12. androgin 13.03.16 02:26 Сейчас в теме
(5) уже давно все типовые версии требуют 8.3.6.2094 как минимальную
14. unichkin 1348 13.03.16 13:18 Сейчас в теме
(12) androgin, далеко не все используют исключительно типовые, и далеко не все еще перешли на новые конфы с УФ и БСП. Я уже писал в (3) что и с 8.1 иногда работаю.
15. androgin 21.03.16 14:33 Сейчас в теме
(14) то, что вы тормозите собственное развитие и сидите в старых платформах и на старых методах - вынуждает вас писать подобные коды и изобретать очередной велосипед.
В 1С далеко не дураки сидят
saa@kuzov.org; dj_serega; BigB; the1; smaximaa; +5 7 Ответить
16. h00k 44 21.03.16 22:31 Сейчас в теме
(15) androgin,
то, что вы тормозите собственное развитие и сидите в старых платформах и на старых методах - вынуждает вас писать подобные коды

Вы можете ошибаться... собственное развитие и вынужденная работа со старыми версиями конфигураций в учетных системах заказчика/ работодателя - в большинстве случаев ни как не связаны.
Переход предприятия на новую систему учета/ платформу - это достаточно дорогое удовольствие, и только из-за желания программиста работать с новыми версиями платформ/ конфигураций ни кто, в здравом уме, переходить не будет.
sskripatch; klinval; zannv; Lapitskiy; izidakg; mysm; dbachinsky; Dach; eugeniezheludkov; +9 Ответить
17. unichkin 1348 22.03.16 01:56 Сейчас в теме
(15) androgin, не понимаю сути претензий. И с чего вы решили что я где-то там "торможусь"?.. Я подписан на рассылку, просматриваю ИТС, мониторю зазеркалье (о птичках) работаю в основном на 8.3.6. И абсолютно солидарен с вами что в 1С сидят не дураки. Я только не понимаю, к чему это было сказано) Лучше перечитайте (5), попробуйте вникнуть в назначение сп_РазбитьСтроку() и понять таки что СтрРазделитьСтроку() в ее контексте в принципе не нужна. Я наверное сам дал еды троллю - лишним было писать "Во-вторых СтрРазделить() - это начиная с 8.3.6.1977".
38. skyadmin 97 18.04.20 23:19 Сейчас в теме
(5) Можно так

 РазбитаяСтрока = СтрЗаменить(ИсходнаяСтрока, Разделитель, Символы.ПС);
9. mars207 27 09.03.16 09:37 Сейчас в теме
Загрузка файлов: выбор на клиенте, обработка на сервере

На веб клиенте давно не работает. Проблема всплывающих окон в браузерах. На последних релизах платформы не тестировал, но подозреваю что не исправили.
10. unichkin 1348 09.03.16 09:39 Сейчас в теме
(9) mars207, тестировал на 8.3.5 - у меня работает. чяднт?
11. androgin 13.03.16 02:25 Сейчас в теме
(9) mars207, все прекрасно работает
13. MishaD 14 13.03.16 10:03 Сейчас в теме
Странно, у меня половина типовых на 8.2.14.540, а еще половина на 7.7.027
18. K_A_O 530 28.03.16 11:33 Сейчас в теме
> Преобразование табличного документа в таблицу значений

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

Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных=Новый ОписаниеИсточникаДанных(ТабДок.Область());       
Построитель.Выполнить();
ТЗ = Построитель.Результат.Выгрузить();
user615001_Shumeyko; purgin; mysm; ZOMI; igormiro; LordKim; BigB; Azimut-tm; terrorion; yukon; pavlov_dv; TreeDogNight; Rokstedi; unichkin; +14 Ответить
21. Altair777 643 06.07.17 09:21 Сейчас в теме
(18) А у меня еще дополнено
Построитель.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
Построитель.ЗаполнитьНастройки();
19. sansys 72 07.01.17 12:17 Сейчас в теме
Спасибо за статью. Иногда стоит вылезти из своего болота и посмотреть как люди делают :))))) +1
20. ImHunter 213 09.01.17 07:52 Сейчас в теме
Про замеры времени. Написал пару процедур - засечь время и показать время замера (+ 2 вспомогательные). Недостаток - в многопотоке некорректно работает. А так, удобненько.
// клиентский модуль

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

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

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

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

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


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

Показать
22. nSpirit2 09.08.17 13:55 Сейчас в теме
Я конечно все понимаю но раз вы пишите
Код я оформляю в соответствии с соглашениями о написании кода.


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

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

Какой участок кода навел вас на эту мысль?
24. LexSeIch 208 31.10.17 03:49 Сейчас в теме
Мир этому дому! Всегда приятно ознакомиться с чьим то опытом, и не менее приятна дискуссия по его обсуждению, где рождается если не истина, то разные варианты решения. Порой фраза в таком обсуждении рождает новые идеи даже не связанные, с текущей темой.
25. Aphanas 145 31.07.18 13:42 Сейчас в теме
Функция ИдентификаторПоСтроке соответствует алгоритму платформы?
26. unichkin 1348 31.07.18 19:53 Сейчас в теме
(25)
Функция ИдентификаторПоСтроке соответствует алгоритму платформы?

Специально не тестил, свое предназначение выполняет; вообще, должна. Возможно в регистрах символов будет различие, но т.к не имею кода платформы на руках 100% гарантии дать не могу)
27. SerVer1C 373 12.11.18 13:29 Сейчас в теме
Функция ЭтоGUID(Идентификатор)
	Попытка
		GUID = Новый УникальныйИдентификатор(Идентификатор);
	Исключение
	КонецПопытки;
	
	Возврат GUID <> Неопределено;
КонецФункции
28. unichkin 1348 12.11.18 20:59 Сейчас в теме
(27) Решать задачи через попытку там где можно ее не использовать - очень плохой тон.
andy_zhav; +1 Ответить
29. SerVer1C 373 13.11.18 08:18 Сейчас в теме
(28) Эту фразу вы вычитали в "умных" книжках? Корректная работа с СУБД при записи данных идет через попытку. Вы считаете, что использовать портянки кода там, где можно обойтись одной строкой, это хороший тон? Сначала доработайте алгоритм, чтобы он не считал "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz" валидным ГУИДом, а потом еще проверьте его на быстродействие.
30. Артано 700 13.11.18 10:05 Сейчас в теме
(29) Регулярные выражения. По быстродействию предлагаю провести сравнение. Было бы инетересно
31. SerVer1C 373 13.11.18 13:05 Сейчас в теме
(30) Замерил с помощью внешней компоненты /public/940766 на венде х64 - получился прирост в скорости в ~16 раз. Использовал шаблон "([0-9A-Fa-f]{8})-([0-9A-Fa-f]{4})-([0-9A-Fa-f]{4})-([0-9A-Fa-f]{4})-([0-9A-Fa-f]{4,12})"
32. Артано 700 13.11.18 14:31 Сейчас в теме
(31) А в цифрах для каждого типа?
33. unichkin 1348 13.11.18 14:53 Сейчас в теме
(29) я эту фразу пережил на собственном опыте. Попробуйте поотлаживаться когда есть пара сотен итераций цикла, и на каждой происходит выброс по попытке.
34. SerVer1C 373 13.11.18 15:01 Сейчас в теме
(33) Для этого давным-давно придумали замечательную вещь: Исключения.
35. unichkin 1348 13.11.18 17:37 Сейчас в теме
(34) не понимаю, о чем вы, если можно - подробнее? з.ы. я не уточнил - имелась в виду отладка с включенным флагом "Остановка по ошибке".
37. unichkin 1348 03.11.19 00:12 Сейчас в теме
(27) Обнаружил недавно в БСП СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор:

// Проверяет, является ли строка уникальным идентификатором.
// В качестве уникального идентификатора предполагается строка вида
// "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где X = [0..9,a..f].
//
// Параметры:
//  Значение - Строка - проверяемая строка.
//
// Возвращаемое значение:
//  Булево - Истина, если переданная строка является уникальным идентификатором.
//
Функция ЭтоУникальныйИдентификатор(Знач Значение) Экспорт
	
	Шаблон = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
	
	Если СтрДлина(Шаблон) <> СтрДлина(Значение) Тогда
		Возврат Ложь;
	КонецЕсли;
	Для Позиция = 1 По СтрДлина(Значение) Цикл
		Если КодСимвола(Шаблон, Позиция) = 88 // X
			И ((КодСимвола(Значение, Позиция) < 48 Или КодСимвола(Значение, Позиция) > 57) // 0..9
			И (КодСимвола(Значение, Позиция) < 97 Или КодСимвола(Значение, Позиция) > 102) // a..f
			И (КодСимвола(Значение, Позиция) < 65 Или КодСимвола(Значение, Позиция) > 70)) // A..F
			Или КодСимвола(Шаблон, Позиция) = 45 И КодСимвола(Значение, Позиция) <> 45 Тогда // -
				Возврат Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Истина;

КонецФункции

Показать
36. svilsa 5 14.11.18 11:55 Сейчас в теме
Очень классно, спасибо!!! Такая шпаргалка в закладках, чтобы не ломать каждый раз голову. Коротко и ясно.
39. andy_zhav 190 18.08.20 15:38 Сейчас в теме
Я бы предложил сделать 3й вариант преобразования табличного документа в коллекцию: преобразование в массив структур. Причина - Таблица значений может существовать только на сервере, а массив структур можно передавать и использовать как на клиенте так и на сервере.

Ну или сделать опциональный параметр в функции ТабличныйДокументВТаблицуЗначений по значению которого будет возвращаться таблица значений или массив структур
40. unichkin 1348 18.08.20 16:10 Сейчас в теме
(39) А зачем гонять такой трафик с с сервера на клиент O_o?.. Представляете, сколько инфы там может быть? Конкретно эта функция с моей т.з предполагает использование только на сервере. Вы разумеется можете доработать под себя, как угодно. Но я смысла не вижу)
41. andy_zhav 190 18.08.20 16:17 Сейчас в теме
(40) К примеру, на клиенте стоит какое-либо приложение либо оборудование, в которое есть необходимость передать разобранные данные. В этом случае придется как-то передавать с сервера на клиент. Как раз тут то и поможет использование массива структур вместо таблицы значений.

Хотя, конечно, это частный случай. Но я на всякий пожарный стараюсь использовать такой способ, чтобы потом не переделывать. Пару раз наталкивался
42. andy_zhav 190 18.08.20 16:22 Сейчас в теме
(40) Ну или такая структура позволит не гонять лишний раз данные на сервер и выполнять функцию непосредственно на клиенте
43. andy_zhav 190 18.08.20 16:39 Сейчас в теме
Немного отсебятины добавлю в коллекцию
Код
// Процедура удаляет строки из таблицы значений по условию.
//
// Параметры:
//  прТаблица             - ТаблицаЗначений - таблица значений.
//  прУсловие             - Строка - условие по которому присходит удаление.
//  прСтруктураДопЗначений - Структура - дополнительные значения, передаваймые в процедуру
//                          для использования в условии удаления
//
Процедура УдалитьСтрокиПоУсловию(прТаблица, прУсловие = "", прСтруктураДопЗначений = Неопределено) Экспорт
   
   КолвоСтрок = прТаблица.Количество();
   
   Если прУсловие = "" Тогда Возврат; КонецЕсли;
   
   Условие = "ВыполненоУсловиеУдаления = (" + прУсловие + ")";
   
   Для ОбратныйИндекс = 1 По КолвоСтрок Цикл
      
      СтрокаТаблицы = прТаблица[КолвоСтрок - ОбратныйИндекс];
      
      ВыполненоУсловиеУдаления = Ложь;
      
      Выполнить(Условие);
      
      Если ВыполненоУсловиеУдаления Тогда
         
         прТаблица.Удалить(СтрокаТаблицы);
         
      КонецЕсли;
      
   КонецЦикла;
   
КонецПроцедуры

Функция ТаблицаЗначенийВТаблицуХТМЛ(ТабЗначений,СтруктураПараметрыТаблицыХТМЛ = Неопределено) Экспорт
   
   //СтруктураПараметрыТаблицыХТМЛ
   //
   //Общие параметры:
   //СтруктураПараметрыТаблицыХТМЛ.ШиринаТаблицы - общая ширина таблица
   //СтруктураПараметрыТаблицыХТМЛ.ЦветШапки - цвет шапки таблицы пример "eadbaf"
   //СтруктураПараметрыТаблицыХТМЛ.ПунктПорядкуИспользуется - по умолчанию ЛОЖЬ
   //
   //Индивиуальные для каждой колонки:
   //СтруктураПараметрыТаблицыХТМЛ.Заголовок1 - заголовок для первой колонки, цифра на конце обознает номер колонки (не с нуля)
   //СтруктураПараметрыТаблицыХТМЛ.Ширина1 - ширина для первой колонки, цифра на конце обознает номер колонки (не с нуля)
   //СтруктураПараметрыТаблицыХТМЛ.Положение1 - отвечает за положение текста в колонке (по умол. лево), передовать "center" или "right"
   
   //ТабЗначений = Новый ТаблицаЗначений;
   МассивИменКолонок = Новый Массив;
   
   Если ТипЗнч(СтруктураПараметрыТаблицыХТМЛ) <> Тип("Структура") Тогда
      СтруктураПараметрыТаблицыХТМЛ = Новый Структура;
   КонецЕсли;
   
   КоличествоКолонок = ТабЗначений.Колонки.Количество();
   ПунктПорядкуИспользуется = ?(СтруктураПараметрыТаблицыХТМЛ.Свойство("ПунктПорядкуИспользуется"),СтруктураПараметрыТаблицыХТМЛ.ПунктПорядкуИспользуется,ЛОЖЬ);   
   
   Если КоличествоКолонок < 0 Тогда
      Возврат Неопределено;
   КонецЕсли;
   
   ЦветШапки = ?(СтруктураПараметрыТаблицыХТМЛ.Свойство("ЦветШапки")," bgcolor=""#" + СтруктураПараметрыТаблицыХТМЛ.ЦветШапки + """","");
   ШиринаТаблицы = ?(СтруктураПараметрыТаблицыХТМЛ.Свойство("ШиринаТаблицы")," style=""width:" + СтруктураПараметрыТаблицыХТМЛ.ШиринаТаблицы + "px""",""); 
   ТаблицаХТМЛ = "<table border=""1"" cellpadding=""1"" cellspacing=""0"" " + ШиринаТаблицы + ">
   |<tbody>
   |<tr>";
   
   //Первым выводим столбик П/П если он задан в шапку
   Если ПунктПорядкуИспользуется Тогда
      ТаблицаХТМЛ = ТаблицаХТМЛ + "
      |<td" + ЦветШапки + " style=""width:30px"" align=""center"">п/п</td>";   
   КонецЕсли;
   
   //Формируем шапку
   Для Счетчик = 1 по КоличествоКолонок Цикл
      ИмяСвойстваШирина = "Ширина" + Счетчик;
      ШиринаСтолбца = ?(СтруктураПараметрыТаблицыХТМЛ.Свойство(ИмяСвойстваШирина)," style=""width:" + СтруктураПараметрыТаблицыХТМЛ[ИмяСвойстваШирина] + "px""","");
      ИмяКолонки = ТабЗначений.Колонки[Счетчик-1].Имя;
      ИмяСвойстваЗаголовок = "Заголовок" + Счетчик;
      ЗаголовокКолонки = ?(СтруктураПараметрыТаблицыХТМЛ.Свойство(ИмяСвойстваЗаголовок),СтруктураПараметрыТаблицыХТМЛ[ИмяСвойстваЗаголовок],ИмяКолонки);
      ТаблицаХТМЛ = ТаблицаХТМЛ + " 
      |<td" + ЦветШапки + ШиринаСтолбца + " align=""center"">" + ЗаголовокКолонки + "</td>";   
      МассивИменКолонок.Добавить(ИмяКолонки);
   КонецЦикла;
   ТаблицаХТМЛ = ТаблицаХТМЛ + "
   |</tr>";
   
   //Заполняем таблицу   
   ПунктПорядку = 0;
   Для каждого СтрокаТаблицы Из ТабЗначений Цикл
      ПунктПорядку = ПунктПорядку + 1;
      ТаблицаХТМЛ = ТаблицаХТМЛ + "
      |<tr>" + ?(ПунктПорядкуИспользуется, Символы.ПС + "<td align=""center"">" + ПунктПорядку + "</td>","") + "";
      Для Счетчик = 0 по КоличествоКолонок - 1 Цикл
         ИмяСвойстваПоложение = "Положение" + Строка(Счетчик + 1);
         Положение = " align=""" + ?(СтруктураПараметрыТаблицыХТМЛ.Свойство(ИмяСвойстваПоложение),СтруктураПараметрыТаблицыХТМЛ[ИмяСвойстваПоложение],"left") + """";
         ТаблицаХТМЛ = ТаблицаХТМЛ + "
         |<td " + Положение + ">" + СтрокаТаблицы[МассивИменКолонок[Счетчик]] + "</td>";         
      КонецЦикла;            
      ТаблицаХТМЛ = ТаблицаХТМЛ + "
      |</tr>";
   КонецЦикла;   
   
   ТаблицаХТМЛ = ТаблицаХТМЛ + " 
   |</tbody>
   |</table>";
   
   Возврат ТаблицаХТМЛ;
   
КонецФункции

Показать полностью
unichkin; +1 Ответить
44. andy_zhav 190 18.08.20 17:09 Сейчас в теме
Ну и еще немного повредничаю по поводу массива структур:
РезультатЗапросаВСтруктуру это частный случай результата запроса в массив структур. Так и напрашивается функция.
45. unichkin 1348 19.08.20 01:57 Сейчас в теме
(44) результат запроса в структуру нужен для того, чтобы пустой и не пустой результат запроса (с единственной записью) использовать единообразно, это упрощает и уменьшает код. &НаСервере.
Возвращать кучу данных на клиент, которые по здравой логике должен отработать сервер, вернув более лёгкий ответ - могу назвать только костылями.
Соглашусь, что случаи бывают разные. Но здесь заплатки публиковать не намерен.
46. andy_zhav 190 19.08.20 07:48 Сейчас в теме
(45) Давайте поговорим про костыли.

Посмотрите функцию БСП ОбщегоНазначения.ТаблицаЗначенийВМассив

Ничего не напоминает? Да это же тот же самый костыль который мы сейчас обсуждаем! Это массив структур из таблицы значений. А для чего 1с его сделали? наверное как раз для тех же самых целей, которые вы считаете костылем. Передача коллекции с сервера на клиента.

// Преобразует таблицу значений в массив структур.
// Может использоваться для передачи на клиент данных в том случае, если таблица
// значений содержит только такие значения, которые могут
// быть переданы с сервера на клиент.
//
// Полученный массив содержит структуры, каждая из которых повторяет
// структуру колонок таблицы значений.
//
// Не рекомендуется использовать для преобразования таблиц значений
// с большим количеством строк.
//
// Параметры:
//  ТаблицаЗначений - ТаблицаЗначений - исходная таблица значений.
//
// Возвращаемое значение:
//  Массив - коллекция строк таблицы в виде структур.
//
Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт
	
	Массив = Новый Массив();
	СтруктураСтрокой = "";
	НужнаЗапятая = Ложь;
	Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
		Если НужнаЗапятая Тогда
			СтруктураСтрокой = СтруктураСтрокой + ",";
		КонецЕсли;
		СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;
		НужнаЗапятая = Истина;
	КонецЦикла;
	Для Каждого Строка Из ТаблицаЗначений Цикл
		НоваяСтрока = Новый Структура(СтруктураСтрокой);
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
		Массив.Добавить(НоваяСтрока);
	КонецЦикла;
	Возврат Массив;

КонецФункции
Показать


Про передачу большого количества данных - тут бесспорно. Нельзя так делать
47. Vovan58 51 31.01.21 23:26 Сейчас в теме
Понравилось почти все. Но отображение замеров времени - это что-то с чем-то. Есть простой вариант :

	
// Длительность - в миллисекундах
ВремяСтрокой = Формат('00010101' + Цел(Длительность/ 1000), "ДЛФ=T"); 


Все остальное - ну очень не лениво :)
Оставьте свое сообщение
Вопросы с вознаграждением