Версия для печати темы (https://pro1c.org.ua/index.php?s=9f792f5a6d77cd86c21e3d0fb383cb9b&showtopic=39747)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование управляемых форм 1С 8.2 _ НайтиПоРеквизиту - почему не работает на реквизит неограниченной длины

Автор: Gigi 23.08.17, 10:19

Всем привет!
Уважаемые форумчане. Никто не подскажет, почему команда НайтиПоРеквизиту выдает ошибку если на реквизите пойска стоит галка "Неограниченная длина"

РезультПойска = Документы[МетаданныеИмя].НайтиПоРеквизиту(СтолбецПойска, ТекстПойска);


Нажимал выполнить и бац и выдает ошибку
Рыл .. копал .. искал ошибку .. думал может синтаксис не правильный. Аж извивался ... но ошибки вроде нигде не обнаружилвал. Думаю че за хрень еб....ая.
Потом думаю давай другой реквизит укажу. Указал... и что я вижу ... все без сбоев.
Потом вспомнил, что прежний "СтолбецПойска" имел неограниченную длину. И понял, что в этом и все дело.
Блин! Че за опять капризы платформы. Почему эта команда не работает на реквизит неограниченной длины.
И что с эти делать? Сменю длину могут стереться данные.
И вообще ... что бы реквизит был неограниченной длины это НУЖНО!
Как заставить команду работать на такой тип реквизита?

Буду признателен!




Автор: logist 23.08.17, 10:24

Цитата(Gigi @ 23.08.17, 11:19) *
И что с эти делать?

Искать запросом, с явным ограничением длинны поля

Автор: Gigi 23.08.17, 10:34

Цитата(logist @ 23.08.17, 11:24) *
с явным ограничением длинны поля

Это никогда не делал и с этим не сталкивался.
Но имеется ввиду в запросе длину ограничить на указанную цифру?
На пример на 500 или 1000?
logist @ Сегодня, 11:24 * ,

Автор: Batchir 23.08.17, 11:00

Цитата(logist @ 23.08.17, 11:24) *
Искать запросом, с явным ограничением длинны поля


Я вообще уже давно не использую конструкции НайтиПоРеквизиту.
А причина на самом деле проста. Метод НайтиПоРеквизиту быстрее запроса, если объект поиска простой и не используется в цикле.
Но представьте что в объекте поиска есть реквизит с типом ХранилищеЗначений и в котором будет храниться скажем 50МБ информации.
Метод НайтиПоРеквизиту получит всю эту информацию и поместит в память, а нужно ли это?
Если нужно, то использование будет оправданным, а если нет, то просто так дадим неоправданную нагрузку на сервер.
А с помощью запроса мы получаем только ту информацию с ИБ, которая нам нужна.

З.ы. если честно, то тесты "что лучше НайтиПоРеквизиту или Запрос" проводил давно, может ситуация уже и изменилась, но привычка "получать данные только запросом" осталась)))

Автор: Gigi 23.08.17, 11:33

Цитата(Batchir @ 23.08.17, 12:00) *
Я вообще уже давно не использую конструкции НайтиПоРеквизиту.
А причина на самом деле проста. Метод НайтиПоРеквизиту быстрее запроса, если объект поиска простой и не используется в цикле

Конечно в каких то случаях запрос быстрее, но просто такие команды удобны тем, что не требуют дополнительной писанины.
Всего одна строка в теле когда и все.
Но в моем случае команда НайтиПоРеквизиту используется в цикле табличной части.
Ну типа таким образом ...
&НаСервере
Процедура ЗагрузитьДанныеПоЗначениюРеквизита()
СтолбецПойска="НомерУчетнойТочки"
//-------------------------------------------
Для каждого Строка Из Объект.ТЧ Цикл
ТекстПойска=Строка.РеквизитПойска;
РезультПойска = Документы.ТочкиУчета_Показания.НайтиПоРеквизиту(СтолбецПойска, ТекстПойска);
// ... и т.д. .....
КонецЦикла;
КонецПроцедуры

Просто нужно получить реквизит по поиску текста строк реквизита ТЧ и потом вставить нужные данные уже в другой указанный реквизит для вставки данных
Т.е. тут речь не о реквизите с типом ХранилищеЗначений. Речь об обычных реквизитах. И процедур пойска и вставки данных в нужные поля.
Не знаю как это с точки зрения скорости работы, но чисто для написания кода так легче. А то уже надоело писать.. писать... кучу процедур и функций, когда есть встроенные команды.
Просто так меньше писанины и труда.
Но при этом нужно, что бы реквизит пойска имел неограниченную длину.
Если это невозможно ... ладно .. сниму галку и сделаю длину на пример 500 и все.
Вот собственно вся задача
Ладно! Спасибо!

Автор: Егор Динин 23.08.17, 11:49

база sql?
как-то давно сталкивался с ошибками в типовых,
в sql такой тип данных отсутствует.

Автор: logist 23.08.17, 11:53

Цитата(Gigi @ 23.08.17, 12:33) *
Но в моем случае команда НайтиПоРеквизиту используется в цикле табличной части.

Тогда тем более запрос - лучшее решение, всё что нужно можно сделать запросом, не перебирая ТЧ.

Автор: Batchir 23.08.17, 18:29

Цитата(Gigi @ 23.08.17, 12:33) *
Просто нужно получить реквизит по поиску текста строк реквизита ТЧ и потом вставить нужные данные уже в другой указанный реквизит для вставки данных
Т.е. тут речь не о реквизите с типом ХранилищеЗначений. Речь об обычных реквизитах. И процедур пойска и вставки данных в нужные поля.
Не знаю как это с точки зрения скорости работы, но чисто для написания кода так легче. А то уже надоело писать.. писать... кучу процедур и функций, когда есть встроенные команды.
Просто так меньше писанины и труда.
Но при этом нужно, что бы реквизит пойска имел неограниченную длину.
Если это невозможно ... ладно .. сниму галку и сделаю длину на пример 500 и все.
Вот собственно вся задача

Браво, 5 балов )))
т.к. Вы сравнительно недавно с 1С, то я ваш ход мыслей понимаю, но не в коем случае не соглашусь с ним.
команда НайтиПоРеквизиту на уровне СУБД это тот же запрос так же как и обращение к реквизиту ссылки через точку.
Вот когда Вы осмыслите разницу между (код чисто для примера):
Артикул = НоменклатураСсылка.Артикул;

И
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    спрНоменклатура.Артикул КАК Артикул
|ИЗ
|    Справочник.Номенклатура КАК спрНоменклатура
|ГДЕ
|    спрНоменклатура.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", НоменклатураСсылка);

РезультатЗапроса = Запрос.Выполнить();
Ариткул = "";
Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
        Ариткул = Выборка.Ариткул;
    КонецЦикла;    
КонецЕсли;

Тогда мы сможем конструктивно разговаривать, т.к. будем друг друга понимать.
Сейчас, к сожалению, что бы я и другие люди не говорили - Вы нас не поймете.

Цитата(Gigi @ 23.08.17, 12:33) *
Но в моем случае команда НайтиПоРеквизиту используется в цикле табличной части.

Советую так же изучить тему запросов в цикле.
Удачи в изучении 1С.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua