ДанныеФормыКоллекция и НайтиСтроки()

1. G_103497175510539409820 14.03.24 12:54 Сейчас в теме
Коллеги, привет.

По рекомендациям 1С функцию НайтиСтроки() необходимо использовать исключительно на сервере. Передача ДанныеФормыКоллекция между клиентом-сервером невозможна, однако, их пример возвращает чистое булево, про передачу самих строк не сказано ни слова. Возвращаемый массив сдержит ссылки на сами строки в таблицы и они могут быть редактируемы.

&НаСервере
Функция ЕстьСтрокиСНулевымКоличеством()
//возвращают булево, но что если нам нужны САМИ строки?
 Возврат Объект.Товары.НайтиСтроки(Новый Структура("Количество", 0 )).Количество() > 0;
КонецФункции

&НаКлиенте
Процедура ПроверитьНаличиеСтрокСНезаполненнымКоличеством()
 Если ЕстьСтрокиСНулевымКоличеством() Тогда
  Предупреждение(НСтр("ru = 'Есть строки с нулевым количеством'"));
 КонецЕсли;
КонецПроцедуры
Показать


Каким образом нам использовать НайтиСтроки() в её чистом виде с ДанныеФормыКоллекция &НаСевере, не пользуясь неявным серверным вызовом &НаКлиенте? Мне нужны сами найденные строки и ссылки к ним. Передавать параметрами вложив их во всевозможные массивы и структуры? Неужели нет менее костыльного варианта?

Использование данной функции &НаКлиенте дает очень плохие результаты по производительности.
По теме из базы знаний
Найденные решения
12. G_103497175510539409820 15.03.24 12:14 Сейчас в теме
По итогу тестов всех возможных способов, быстрее всего будет использовать обход ДанныеФормыКоллекция циклом, при этом при сравнении строк НЕ пользоваться СтрСравнить(Строка1, Строка2), а именно проверять равенством.

Все остальные способы оказались медленнее.

Всем спасибо.
NicolasCage; ElGatoGris; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 35 14.03.24 13:32 Сейчас в теме
(1)
Мне нужны сами найденные строки и ссылки к ним.

Зачем? Опишите что именно вам надо? Какая задача стоит?
3. G_103497175510539409820 14.03.24 13:41 Сейчас в теме
(2) Эти строки позже используются и редактируются. Если бы нужны были только данные, то я давно использовал РеквизитФормыВЗначение(), однако, эти строки позже редактируются, дополняются и используются как для расчетов, так и для отображения данных динамически.
5. SlavaKron 14.03.24 13:50 Сейчас в теме
(1) На клиенте подойдёт простой перебор строк в цикле.
7. G_103497175510539409820 14.03.24 13:54 Сейчас в теме
(5) Корректно ли будет обходить более 200 строк в цикле с проверками на клиенте?
8. SlavaKron 14.03.24 13:59 Сейчас в теме
(7) Если проверка не требует ресурсов сервера, считаю, что корректно.
16. uno-c 265 28.06.24 20:08 Сейчас в теме
(1)
Передача ДанныеФормыКоллекция между клиентом-сервером невозможна

Не совсем верное утверждение. Передача ДанныеФормыКоллекция возможна по значению. Автор, видимо, имел в виду ДанныеФормыЭлементКоллекции. Итого: передача всей коллекции между клиентом и сервером возможна, а вот передача отдельных элементов коллекции не предусмотрена.
4. ElGatoGris 14.03.24 13:44 Сейчас в теме
Что такое "НайтиСтроки() в её чистом виде"? Что такое "ДанныеФормыКоллекция &НаСевере"? Что такое "сами строки"?

Функция возвращает массив ссылок на строки, сами строки вы не получите, только значения. Что вас смущает в приведённом вами примере?
6. G_103497175510539409820 14.03.24 13:52 Сейчас в теме
(4) Если вы зашли в тему просто поворчать, то прошу пройти мимо. Однако, если бы вы копнули чуть глубже, то узнали, что возвращаемый массив хранит ссылки на строки коллекции, а это значит, что передача их в чистом виде между клиент-сервером будет невозможна.
9. ElGatoGris 14.03.24 14:00 Сейчас в теме
(6) Не то что бы невозможна, не предусмотрена. Однако, если вам действительно нужны значения, то их можно упаковать в массив структур и вернуть на клиент.
11. SlavaKron 14.03.24 14:10 Сейчас в теме
(6) Передавайте идентификаторы строк в массиве. Используйте ПолучитьИдентификатор / НайтиПоИдентификатору.
ДанныеФормыКоллекция можно, кстати, передать на сервер и без контекста формы:
&НаКлиенте
Процедура Команда1(Команда)
	МассивИдентификаторов = ПолучитьМассивИднетификаторов(Таблица);
	Для Каждого ИдентификаторСтроки Из МассивИдентификаторов Цикл
		СтрокаТаблицы = Таблица.НайтиПоИдентификатору(ИдентификаторСтроки);
	КонецЦикла;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьМассивИднетификаторов(Знач ДанныеФормыКоллекция)
	МассивСтрок = ДанныеФормыКоллекция.НайтиСтроки(Новый Структура("Реквизит1", ""));
	Результат = Новый Массив;
	Для Каждого Стр Из МассивСтрок Цикл
		Результат.Добавить(Стр.ПолучитьИдентификатор());
	КонецЦикла;
	Возврат Результат
КонецФункции
Показать
G_103497175510539409820; +1 Ответить
10. G_103497175510539409820 14.03.24 14:09 Сейчас в теме
(9) Мне требуется оптимизировать вызов НайтиСтроки(), который используется много раз &НаКлиенте за все время обработки, однако, упаковка в массив структур и передача их на сервер и обратно или обработка ДанныеФормыКоллекция в цикле прямо на клиенте займет чуть ли не столько же если не больше времени, поэтому я и обратился на форум в поисках более элегантного и быстродействующего решения.

1С документация очень суха на этот счет и не дала ответы на мои вопросы, хотя рекомендовано для быстродействия этот метод использовать на сервере во избежание неявных вызовов, но при этом мы упираемся в ограничения клиент-серверной архитектуры, когда речь заходит о ДанныеФормыКоллекция.
12. G_103497175510539409820 15.03.24 12:14 Сейчас в теме
По итогу тестов всех возможных способов, быстрее всего будет использовать обход ДанныеФормыКоллекция циклом, при этом при сравнении строк НЕ пользоваться СтрСравнить(Строка1, Строка2), а именно проверять равенством.

Все остальные способы оказались медленнее.

Всем спасибо.
NicolasCage; ElGatoGris; +2 Ответить
13. SlavaKron 15.03.24 14:26 Сейчас в теме
(12) Это было понятно сразу, о чем было сказано еще в (5)
14. G_103497175510539409820 15.03.24 14:49 Сейчас в теме
(13) Почему-то всем все всегда становится очевидным только когда решение уже найдено))
15. Sashares 35 15.03.24 15:12 Сейчас в теме
(14)Не видя кода сложно что-то советовать.
Но можно еще рассмотреть вариант переноса кода на сервер.
Чтобы все многократные поиски и вот это вот все выполнялось в одном серверном вызове.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот