1.
G_103497175510539409820
14.03.24 12:54 Сейчас в теме
Коллеги, привет.
По рекомендациям 1С функцию НайтиСтроки() необходимо использовать исключительно на сервере. Передача ДанныеФормыКоллекция между клиентом-сервером невозможна, однако, их пример возвращает чистое булево, про передачу самих строк не сказано ни слова. Возвращаемый массив сдержит ссылки на сами строки в таблицы и они могут быть редактируемы.
&НаСервере
Функция ЕстьСтрокиСНулевымКоличеством()
//возвращают булево, но что если нам нужны САМИ строки?
Возврат Объект.Товары.НайтиСтроки(Новый Структура("Количество", 0 )).Количество() > 0;
КонецФункции
&НаКлиенте
Процедура ПроверитьНаличиеСтрокСНезаполненнымКоличеством()
Если ЕстьСтрокиСНулевымКоличеством() Тогда
Предупреждение(НСтр("ru = 'Есть строки с нулевым количеством'"));
КонецЕсли;
КонецПроцедуры
Показать
Каким образом нам использовать НайтиСтроки() в её чистом виде с ДанныеФормыКоллекция &НаСевере, не пользуясь неявным серверным вызовом &НаКлиенте? Мне нужны сами найденные строки и ссылки к ним. Передавать параметрами вложив их во всевозможные массивы и структуры? Неужели нет менее костыльного варианта?
Использование данной функции &НаКлиенте дает очень плохие результаты по производительности.
3.
G_103497175510539409820
14.03.24 13:41 Сейчас в теме
(2) Эти строки позже используются и редактируются. Если бы нужны были только данные, то я давно использовал РеквизитФормыВЗначение(), однако, эти строки позже редактируются, дополняются и используются как для расчетов, так и для отображения данных динамически.
Передача ДанныеФормыКоллекция между клиентом-сервером невозможна
Не совсем верное утверждение. Передача ДанныеФормыКоллекция возможна по значению. Автор, видимо, имел в виду ДанныеФормыЭлементКоллекции. Итого: передача всей коллекции между клиентом и сервером возможна, а вот передача отдельных элементов коллекции не предусмотрена.
6.
G_103497175510539409820
14.03.24 13:52 Сейчас в теме
(4) Если вы зашли в тему просто поворчать, то прошу пройти мимо. Однако, если бы вы копнули чуть глубже, то узнали, что возвращаемый массив хранит ссылки на строки коллекции, а это значит, что передача их в чистом виде между клиент-сервером будет невозможна.
(6) Не то что бы невозможна, не предусмотрена. Однако, если вам действительно нужны значения, то их можно упаковать в массив структур и вернуть на клиент.
(6) Передавайте идентификаторы строк в массиве. Используйте ПолучитьИдентификатор / НайтиПоИдентификатору.
ДанныеФормыКоллекция можно, кстати, передать на сервер и без контекста формы:
&НаКлиенте
Процедура Команда1(Команда)
МассивИдентификаторов = ПолучитьМассивИднетификаторов(Таблица);
Для Каждого ИдентификаторСтроки Из МассивИдентификаторов Цикл
СтрокаТаблицы = Таблица.НайтиПоИдентификатору(ИдентификаторСтроки);
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьМассивИднетификаторов(Знач ДанныеФормыКоллекция)
МассивСтрок = ДанныеФормыКоллекция.НайтиСтроки(Новый Структура("Реквизит1", ""));
Результат = Новый Массив;
Для Каждого Стр Из МассивСтрок Цикл
Результат.Добавить(Стр.ПолучитьИдентификатор());
КонецЦикла;
Возврат Результат
КонецФункции
10.
G_103497175510539409820
14.03.24 14:09 Сейчас в теме
(9) Мне требуется оптимизировать вызов НайтиСтроки(), который используется много раз &НаКлиенте за все время обработки, однако, упаковка в массив структур и передача их на сервер и обратно или обработка ДанныеФормыКоллекция в цикле прямо на клиенте займет чуть ли не столько же если не больше времени, поэтому я и обратился на форум в поисках более элегантного и быстродействующего решения.
1С документация очень суха на этот счет и не дала ответы на мои вопросы, хотя рекомендовано для быстродействия этот метод использовать на сервере во избежание неявных вызовов, но при этом мы упираемся в ограничения клиент-серверной архитектуры, когда речь заходит о ДанныеФормыКоллекция.
(14)Не видя кода сложно что-то советовать.
Но можно еще рассмотреть вариант переноса кода на сервер.
Чтобы все многократные поиски и вот это вот все выполнялось в одном серверном вызове.