Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Метод НайтиПоИдентификатору() на сервере выдает ошибку          
Gigi Подменю пользователя
сообщение 03.05.17, 16:58
Сообщение #1

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

Привет всем!
Уважаемые форумчане. Столкнулся с одной проблемой. Касательно метода НайтиПоИдентификатору().
Дело в том, что в синтаксис помощнике дает сухие характеристики. Хоть и на примерах, но не все.
проблема в том, что с этот метод в процедуре клиента работает нормально.
Т.е. если на пример нужно выдать значение строки табличной части по указанному индексу, на клиенте.
Но есть нужда получить значение строки табличной части по указанному индексу из другого справочника.
Поэтому проблема в том, следующий вид кода на КЛИЕНТЕ:

Строка = Объект.ТабличнаяЧасть1.НайтиПоИдентификатору(2);
Строка = Строка.Реквизит1;
Сообщить(Строка);


Работает нормально! Т.е. в случае если нужно значение табличной части родного для модуля справочника.
Но если таким же способом сделать для сервера, что бы получить значение из табличной части другого справочника, то пишет:

Цитата
Метод объекта не обнаружен (НайтиПоИдентификатору)


Вот того же самого (но с переменными ТЧ и ТЧ_реквизит), только для сервера:

СтрокаОбъект = РезультПойска.ПолучитьОбъект();
СтрокаТЧ = СтрокаОбъект[ТЧ].НайтиПоИдентификатору(1);
//СтрокаТЧ = СтрокаОбъект[ТЧ].НайтиПоИдентификатору[1];
значСтрокиТЧ = СтрокаТЧ[ТЧ_реквизит];
Возврат  значСтрокиТЧ;


Вопрос...

Почему функция на сервере метод НайтиПоИдентификатору() не находит?
Ведь в синтаксис помощнике написано, что на сервере доступна.
В чем ошибка!

Если кто, скорректирует, буду очень признателен за помощь.

Сообщение отредактировал Vofka - 03.05.17, 17:51

Bernet Подменю пользователя
сообщение 03.05.17, 17:02
Сообщение #2

Ветеран
Иконка группы
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 317 раз
Рейтинг: 0

Gigi @ Сегодня, 17:58 * ,
Посмотрите в отладчике какой у Вас тип переменной СтрокаОбъект[ТЧ], функция которую вы ищете есть только у: ДанныеФормыКоллекция, ДанныеФормыСтруктураСКоллекцией, ДанныеФормыДерево, СписокЗначений


Signature
Дописываю конфигурации на платформе 8.х.
- Управление торговым предприятием для Украины
- Управление производственным предприятием для Украины
- Управление небольшой фирмой для Украины
- Бухгалтерия для Украины;
- Общепит для Украины
- Ресторан (Рарус)
- Розница

Спасибо сказали: Gigi,

Gigi Подменю пользователя
сообщение 03.05.17, 17:07
Сообщение #3

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

Bernet @ Сегодня, 17:02 * ,
Спасибо понял! Посмотрю! 32000000.gif
Но если че, опять буду мусолить, и просить помощи.. 64000000.gif
)))))

Petre Подменю пользователя
сообщение 04.05.17, 8:24
Сообщение #4

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

Тут и смотреть не надо, у вашей переменной нет такого метода.


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

Спасибо сказали: Gigi,

Gigi Подменю пользователя
сообщение 04.05.17, 11:25
Сообщение #5

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

Bernet @ Вчера, 17:02 * ,
Цитата(Bernet @ 03.05.17, 17:02) *
Посмотрите в отладчике какой у Вас тип переменной СтрокаОбъект[ТЧ], функция которую вы ищете есть только у: ДанныеФормыКоллекция, ДанныеФормыСтруктураСКоллекцией, ДанныеФормыДерево, СписокЗначений

Код решил чуть видоизменить, для простоты понимания:

&НаСервере
Процедура Тест_ПолучитьЗначениеТЧпоИндексу()
ЭлементСправочника = Справочники.ТОЧКА.НайтиПоКоду("000000001");
ОбъектСправочника = ЭлементСправочника.ПолучитьОбъект();
Строка = ОбъектСправочника.ТЧ_Субабоненты.НайтиПоИдентификатору(1);
        //{Справочник.Тест_РаботаСколлекциями.Форма.ФормаЭлемента.Форма(19)}: Метод объекта не обнаружен (НайтиПоИдентификатору)
        //Строка = ОбъектСправочника.ТЧ_Субабоненты.НайтиПоИдентификатору(1);
Строка = Строка.Субабоненты;
Сообщить(Строка);
КонецПроцедуры



Отладчик пишет так:
Цитата
{Справочник.Тест_РаботаСколлекциями.Форма.ФормаЭлемента.Форма(19)}: Метод объекта не обнаружен (НайтиПоИдентификатору)
Строка = ОбъектСправочника.ТЧ_Субабоненты.НайтиПоИдентификатору(1);


Поэтому, как понимаю команда, НайтиПоИдентификатору работает только с коллекциями
Ну на пример в таком стиле ...

НаборЗначений= Новый Структура;
и т.д.

И что касается массивов, тут я честно говоря плаваю ... И изучать досконально это долго, а нужно срочно решать задачу, цель которой всего лишь следующая:

ПОЛУЧИТЬ ЗНАЧЕНИЕ СТРОКИ РЕКВИЗИТА ТАБЛИЧНОЙ ЧАСТИ КАКОГО НИ БУДЬ СПРАВОЧНИКА ПО указанному ИНДЕКСУ!
Вот собственно какая задача стоит.

Для этой задачи как мне понимается, что первое это получить количество строк ТЧ. Что удалось сделать всего одной командой.
Но как получить значение по индексу т.е. номеру строки ТЧ вот тут застрял. Сервак Метод НайтиПоИдентификатору не находит.
И поэтому, для этого обязательно надо создавать коллекцию? .. блин... нет ли более простого и для сервака не накладного пути?
Может не ту команду выбрал для этой цели?

Опять буду очень признателен!


 ! 

Правила: 3
 


Сообщение отредактировал logist - 04.05.17, 12:39

Petre Подменю пользователя
сообщение 04.05.17, 11:38
Сообщение #6

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

Gigi @ Сегодня, 12:25 * ,
СтрокаТабличнойЧасти = ТабличнаяЧасть[ИндексСтроки];
СтрокаТабличнойЧасти = ТабличнаяЧасть.Получить(ИндексСтроки);


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

Pepe Подменю пользователя
сообщение 04.05.17, 11:49
Сообщение #7

Почти крутой
Иконка группы
Группа: Местный
Сообщений: 1434
Из: Ужгород
Спасибо сказали: 761 раз
Рейтинг: 230

Petre @ Сегодня, 12:38 * ,
Ничего не понимаю. Тема про программирование 1С 7.7, а вы о
Цитата(Gigi @ 04.05.17, 12:25) *
НаборЗначений= Новый Структура;


Petre Подменю пользователя
сообщение 04.05.17, 12:00
Сообщение #8

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

faceoff.gif
Семен Семеныч! А главного не заметил...


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

Gigi Подменю пользователя
сообщение 04.05.17, 13:31
Сообщение #9

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

Цитата(Pepe @ 04.05.17, 11:49) *
Ничего не понимаю. Тема про программирование 1С 7.7, а вы о


Ну да .. согласен! ... у каждого сайта нужно указывать кучу полей ... достали уже со своими полями ..
Но надеюсь из за этого, модератор не включит в группу не "Общительный", а "нарушитель правил" ))))))
и кроме того команды 1С 7-8 не на много отличаются.

Так вот я решил задачу таким образом:

&НаСервере
Процедура Тест_ПолучитьЗначениеТЧпоИндексу()
// ======= Вариант 1 - не работает!
//РезультПойска = Справочники.ТОЧКА.НайтиПоКоду("000000001");
//ОбъектСправочника = РезультПойска.ПолучитьОбъект();
//Строка = ОбъектСправочника.ТЧ_Субабоненты.НайтиПоИдентификатору(1);
//Строка = Строка.Субабоненты;
//Сообщить(Строка);

// ====== Вариант 2 - работает!
РезультПойска = Справочники.ТОЧКА.НайтиПоКоду("000000001");
номер=1;
n=0;
ОбъектСправочника = РезультПойска.ПолучитьОбъект();
Для каждого Строка Из ОбъектСправочника.ТЧ_Субабоненты Цикл
n=n+1;    
Если n=номер тогда
Сообщить(Строка.Субабоненты);
Перейти ~ПроцедураВыход;
КонецЕсли;
КонецЦикла;
~ПроцедураВыход:;
КонецПроцедуры



И повторю преследуемую цель:
ПОЛУЧИТЬ ЗНАЧЕНИЕ ТАБЛИЧНОЙ ЧАСТИ ФОРМЫ ЭЛЕМЕНТА СПРАВОЧНИКА по указанному ИНДЕСКУ!

В процедуре вариант работающий и не работающий... работающий выдает то, что нужно, но это слишком обычный путь.
Нет ли просто одной или пару команды, для данной цели?
Что бы не было необходимости цыклить

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

logist Подменю пользователя
сообщение 04.05.17, 13:51
Сообщение #10

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

Цитата(Gigi @ 04.05.17, 14:31) *
и кроме того команды 1С 7-8 не на много отличаются.



Бегло просмотрел тему, не понял что надо сделать. Вы пытаетесь изъясняться языком программиста, но не понимаете в нем (в 1С8 по крайней мере), может попробуйте проще пояснить задачу?

Цитата(Gigi @ 03.05.17, 17:58) *
Почему функция на сервере метод НайтиПоИдентификатору() не находит?

Она доступна на сервере, но работает с типом ДанныеФормыКоллекция, коим не является ваш другой справочник

Может это...
&НаСервереБезКонтекста
Процедура Тест_ПолучитьЗначениеТЧпоИндексу(Индекс)
    Запрос = Новый Запрос("ВЫБРАТЬ
    |    Спр.Субабоненты
    |ИЗ
    |    Справочник.ТОЧКА.ТЧ_Субабоненты КАК Спр
    |ГДЕ
    |    Спр.Ссылка = &Ссылка
    |    И Спр.НомерСтроки = &НомерСтроки")
    Запрос.УстановитьПараметр("Ссылка", Справочники.ТОЧКА.НайтиПоКоду("000000001"));
    Запрос.УстановитьПараметр("НомерСтроки", Индекс);
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Сообщить(Выборка.Субабоненты);
    КонецЕсли;
КонецПроцедуры


Signature
Личные бесплатные консультации не даю, для этого есть форум!

Gigi Подменю пользователя
сообщение 04.05.17, 17:18
Сообщение #11

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

logist @ Сегодня, 13:51 * ,
Цитата(logist @ 04.05.17, 13:51) *
Она доступна на сервере, но работает с типом ДанныеФормыКоллекция, коим не является ваш другой справочник

Отлично ... великолепно.. Но в первую очередь спасибо...

Цитата(logist @ 04.05.17, 13:51) *
Вы пытаетесь изъясняться языком программиста, но не понимаете в нем (в 1С8 по крайней мере)


Ну я бы не сказал бы, что совсем уже и не понимаю ... а в остальном .... ну а что вы хотели... если имел бы большой опыт работы и глубокие знания всех тонкостей то в таком случае, что я здесь вообще потерял. ))

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

logist Подменю пользователя
сообщение 05.05.17, 13:23
Сообщение #12

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

Цитата(Gigi @ 04.05.17, 18:18) *
предложенный вариант не сильный наклад на сервак?

я ж не знаю что у вас там происходит, если это одновременно требуется для большого количества строк, то имеет смысл собрать все строки и получить сразу для всех потом заполнить, может вообще задача решается по другому.

Цитата(Gigi @ 04.05.17, 18:18) *
Или вообще есть ли какая нибудь одна команда, на подобие НайтиПоИдентификатору()

что вы прицепились этому идентификатору, вот вообще не пойму, нет никакой одной одной команды.

Цитата(Gigi @ 04.05.17, 18:18) *
И сократит объем кода.

Минимальный объем кода не всегда значит быструю производительность, иногда может быть наоборот.


Signature
Личные бесплатные консультации не даю, для этого есть форум!

Gigi Подменю пользователя
сообщение 05.05.17, 16:38
Сообщение #13

Оратор
*****
Группа: Пользователи
Сообщений: 498
Спасибо сказали: 5 раз
Рейтинг: 0

Цитата(Gigi @ 04.05.17, 17:18) *
я ж не знаю что у вас там происходит, если это одновременно требуется для большого количества строк, то имеет смысл собрать все строки и получить сразу для всех потом заполнить, может вообще задача решается по другому.


Цитата(logist @ 05.05.17, 13:23) *
что вы прицепились этому идентификатору, вот вообще не пойму, нет никакой одной одной команды.


Ответ на эти вопросы, возможно дать только если скину образец процедур на клиенте и на сервере.
И я решил все таки скинуть ... и думаю этим не уйду в сторону от поднятой темы. Ибо скинутое опять имеет отношение к получению значения по индексу табличной части.
А в остальном, конечно может будет накладно вникать, но рассчитываю, на понимание и в любом случае спасибо!
Вот код:

&НаКлиенте
Процедура ТестФункции_ПолучитьЗначПоляТЧпоИдексу()
//===========================================
Конфиг = "Справочники";
КонфигИмя="ТОЧКА";
АдреОбъекта=Конфиг+"."+КонфигИмя;
//===========================================
знКодаПойска="000000001";
//------------------------------------------
знТЧ="ТЧ_Субабоненты";
знТЧреквизит="Субабоненты";
номерИндекса=1;
//===========================================
// Команада: НайтиПоИдентификатору(2) для табличной части родной ФормыЭлемента нормально работает!

            //Пример команды: НайтиПоИдентификатору(2)для  табличной части родной ФормыЭлемента
            //СтрокаТЧ = Объект.ТабличнаяЧасть1.НайтиПоИдентификатору(2);
            //ТЧреквЗнач = Строка.Реквизит1;
            //Сообщить(ТЧреквЗнач);
            
//Тут нужно, получить значение ЧТ из другой ФормыЭлемента по указанному индексу.
НужноеЗначение=ПолучитьЗначПоляТЧпоИдексу(Конфиг,КонфигИмя, знКодаПойска, знТЧ,знТЧреквизит,номерИндекса);
Сообщить(НужноеЗначение);
//===========================================
КонецПроцедуры

&НаСервере
Функция ПолучитьЗначПоляТЧпоИдексу(Конфигурат,КонфигуратЭлемент, КодПойска, ТЧ, ТЧ_реквизит,Индекс)
//==========================================================================
Если Конфигурат = "Справочники" Тогда
    Попытка
        РезультПойска = Справочники[КонфигуратЭлемент].НайтиПоКоду(КодПойска);
    Исключение
        Возврат "Указанный адрес: «"+Конфигурат+"."+КонфигуратЭлемент+"» не существует!";
    КонецПопытки
ИначеЕсли  Конфигурат = "Документы" Тогда
    Попытка
        РезультПойска = Документы[КонфигуратЭлемент].НайтиПоКоду(КодПойска);    
    Исключение
        Возврат "Указанный адрес: «"+Конфигурат+"."+КонфигуратЭлемент+"» не существует!";
    КонецПопытки
Иначе
    Возврат "Не корректное указание объекта конфирурации!";
КонецЕсли;
//==========================================================================
Если РезультПойска.Пустая() Тогда
Сообщить("В Списке: «"+Конфигурат+"."+КонфигуратЭлемент+"» КодПойска: «" + КодПойска + "» не найден!");
Иначе
// ====ВОТ ГДЕ ЗАЦЫКЛИЛСЯ И НИКАК НЕ СМОГ НАЙТИ ПРИЕМЛЕМОЕ РЕШЕНИЕ!
// ТУТ МНЕ ПРОСТО НУЖНО ПОЛУЧИТЬ ЗАЧЕНИЕ РЕКВИЗИТА ТАБЛИЧНОЙ ЧАСТИ ПО ИНДЕКСУ!
//И ПРИЧИНА ТОГО, ПОЧЕМУ Я ПРИЦЕПИЛСЯ К КОМАНДЕ: "НайтиПоИдентификатору(Индекс)", в том, что она просто удобна, для взятого курса алгоритма.
//И ею очень удобно воспользоваться, для ТЧ ФормыЭлемент на клиенте. Но тут она не срабатывает, по выше описанной причине!
//И наверно где такое счастье, что бы везде работала.

// ======= Вариант 1 - не работает!
    //ОбъектКонфиг = РезультПойска.ПолучитьОбъект();
    //СтрокаТЧ = ОбъектКонфиг[ТЧ].НайтиПоИдентификатору(Индекс);
    //значСтрокиТЧ = СтрокаТЧ[ТЧ_реквизит];
    //Возврат  значСтрокиТЧ;

////====== Вариант 2 - работает!
//    ОбъектСправочника = РезультПойска.ПолучитьОбъект();
//    n=0;
//    Для каждого СтрокаТЧ Из ОбъектСправочника[ТЧ] Цикл
//    n=n+1;    
//        Если n=Индекс тогда
//            значСтрокиТЧ = СтрокаТЧ[ТЧ_реквизит];    
//            Перейти ~ПроцедураВыход;
//        КонецЕсли;
//    КонецЦикла;
//    ~ПроцедураВыход:;
//    Возврат  значСтрокиТЧ;
    
////====== Вариант 3 - ?
//Запрос = Новый Запрос("ВЫБРАТЬ
//   |    Спр[ТЧ_реквизит]
//   |ИЗ
//   |    Справочник[КонфигуратЭлемент][ТЧ] КАК Спр
//   |ГДЕ
//   |    Спр.Ссылка = &Ссылка
//   |    И Спр.НомерСтроки = &НомерСтроки");
//   Запрос.УстановитьПараметр("Ссылка", Справочники[КонфигуратЭлемент].НайтиПоКоду("000000001"));
//   Запрос.УстановитьПараметр("НомерСтроки", Индекс);
//   Выборка = Запрос.Выполнить().Выбрать();
//   Если Выборка.Следующий() Тогда
//       Возврат  Выборка[ТЧ_реквизит];
//   КонецЕсли;

Возврат  "ШЫШЬ!))";    
КонецЕсли;
//==========================================================================
КонецФункции



Буду признателен если надеться оптимальное решение вопроса!

logist Подменю пользователя
сообщение 05.05.17, 17:07
Сообщение #14

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

Цитата(Gigi @ 05.05.17, 17:38) *
если надеться оптимальное решение вопроса!

Вопрос то в чем? Для того что бы понимать оптимальность/правильность кода - надо понимать задачу которую он выполняет (не конкретный пункт действия, а в целом)


Signature
Личные бесплатные консультации не даю, для этого есть форум!

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 29.03.24, 1:27
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!