Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: НайтиПоРеквизиту - почему не работает на реквизит неограниченной длины
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование управляемых форм 1С 8.2
Gigi
Всем привет!
Уважаемые форумчане. Никто не подскажет, почему команда НайтиПоРеквизиту выдает ошибку если на реквизите пойска стоит галка "Неограниченная длина"

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


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

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



logist
Цитата(Gigi @ 23.08.17, 11:19) необходимо зарегистрироваться для просмотра ссылки
И что с эти делать?

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

Это никогда не делал и с этим не сталкивался.
Но имеется ввиду в запросе длину ограничить на указанную цифру?
На пример на 500 или 1000?
logist @ Сегодня, 11:24 необходимо зарегистрироваться для просмотра ссылки ,
Batchir
Цитата(logist @ 23.08.17, 11:24) необходимо зарегистрироваться для просмотра ссылки
Искать запросом, с явным ограничением длинны поля


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

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

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

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

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

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

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

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

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

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

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