Имя: Пароль:
1C
1C 7.7
v7: не удается найти строку в таблице значения 1с77
0 alpha78
 
29.05.19
14:38
добрый день, не удается найти строку в таблице значения 1с77
вот код, должно работать, ТЗ - таблица значения внешней обработки
ОС, Счет - строковые реквизиты формы

объявление таблицы значения - 3 колонки:
           ТЗ.НоваяКолонка("КодОС","Строка",10);
       ТЗ.НоваяКолонка("ОС","Строка",200);
       ТЗ.НоваяКолонка("Сумма","Число",15,2);

а вот код поиска строки таблицы значения с нужными данными
Процедура ВыборкаИзТЗ()
    С="";
    Если ТЗ.НайтиЗначение(СокрЛП(Выбор.Наименование),С,"ОС")=1
    Тогда
    ТЗ.ПолучитьСтрокуПоНомеру(С);
    ОС = ТЗ.ОС;
    Счет = ТЗ.СчетДт;
    Предупреждение ("Таблица есть, нужно выгрузить = "+ОС);
    Иначе
    Предупреждение ("Нет значения");    
    КонецЕсли;    
КонецПроцедуры    


что не так, благодарю
1 HawkEye
 
29.05.19
14:41
(0) сокрЛП - не так...
2 HawkEye
 
29.05.19
14:42
ЧтоИщем = Лев(СокрЛП(Выбор.Наименование) + "ТУТ СТО ПРОБЕЛОВ", 100);
Если ТЗ.НайтиЗначение(ЧтоИщем, С, "ОС") = 1
3 alpha78
 
29.05.19
14:43
без него тоже не фурычит
4 HawkEye
 
29.05.19
14:43
даже не сто, а двести )))
а чего по коду не ищется?
5 HawkEye
 
29.05.19
14:43
(3) надо не без него.. а вместе с ним...
6 ZDenis
 
29.05.19
14:47
(0) А еще проще убрать 200
ТЗ.НоваяКолонка("ОС","Строка");
7 1Сергей
 
29.05.19
14:48
Если ТЗ.НайтиЗначение(Формат(Выбор.Наименование, "С200"),С,"ОС")=1

Как-то так. Не помню точно синтаксис
8 alpha78
 
29.05.19
15:03
все равно пишет нет значения. я насчет с - номера строки. ведь при  поиске неизвестно где находится искомая строка, ранее я задаю с="";
то есть нулевая, вот метод НайтиЗначение() и ищет в нулевой строке, если не задавать начальное значение С, то выдаст неизвестная переменная

как тут быть?
9 HawkEye
 
29.05.19
15:05
(8) ничего не понял, но при с = 0 - нормально все ищет
10 1Сергей
 
29.05.19
15:05
(8) нуль загони в неё. будет искать по всем
11 ZDenis
 
29.05.19
15:06
(8) Можно и С=0 и С="", проблема точно не в этом
12 Garykom
 
гуру
29.05.19
15:08
(8) Проверить перебором всей ТЗ построчно а есть ли искомое значение.
13 ZDenis
 
29.05.19
15:09
(0) Что такое "Выбор.Наименование", ведь в эту процедуру не передаются параметры у тебя
14 alpha78
 
29.05.19
15:11
Выбор реквизит типа справочник
15 HawkEye
 
29.05.19
15:13
(14) ТЗ как заполняешь?
16 alpha78
 
29.05.19
15:14
сейчас:

Опер = СоздатьОбъект("Операция");
Опер.ВыбратьОперацииСПроводками(Дата1,Дата2,"*,423");
Пока Опер.ПолучитьПроводку()=1 Цикл            
ТЗ.НоваяСтрока();
Спр = СоздатьОбъект("Справочник.НеоборотныеАктивы");
Если Спр.НайтиПоКоду(Опер.Дебет.Субконто(2))=1 Тогда
        НаименованиеОС = Спр.ТекущийЭлемент();
        НаименованиеОС = НаименованиеОС.Наименование;
        ТЗ.ОС=НаименованиеОС;
КонецЕсли    ;
        ТЗ.КодОС =Опер.Дебет.Субконто(2);     // получаем код ОС
        ТЗ.СчетДт=Опер.Дебет.Счет.Код;    // полукчаем счет дебета 10*
        ТЗ.СчетКт=Опер.Кредит.Счет.Код;   // получаем счет кредита  423 - счет переоценки
        ТЗ.Сумма =Опер.Сумма;  //получаем сумм проводки П2 - П1 для конкретного ОС
КонецЦикла;
ТЗ.Сортировать("ОС+")
17 alpha78
 
29.05.19
15:15
тз заполняется нормально
18 HawkEye
 
29.05.19
15:16
(16) ну ожидаемо... что мешает то сам объект пихать в ТЗ и искать уже потом по нему?
19 Mikeware
 
29.05.19
15:18
(18) ссылку... :-)
20 HawkEye
 
29.05.19
15:19
(19) не будем усложнять ))
21 ZDenis
 
29.05.19
15:22
(16) Очень страшно выглядит конструкция.
Опер.Дебет.Субконто(2) - Это что код справочника? Точно не сам элемент?
22 Ёпрст
 
29.05.19
15:23
(16) феерический п..ц
23 Mikeware
 
29.05.19
15:24
может. устроим тотализатор  - догадается ТС про существование отладчика, или нет?
24 HawkEye
 
29.05.19
15:24
(21) Опер.Дебет.Субконто(2) - это элемент, но видимо у него представление в виде кода, поэтому в ТЗ - код... ))
25 Ёпрст
 
29.05.19
15:29
(16)



ТЗ.НоваяКолонка("КодОС");
ТЗ.НоваяКолонка("ОС");
ТЗ.НоваяКолонка("Сумма");
.....
Опер = СоздатьОбъект("Операция");
Опер.ВыбратьОперацииСПроводками(Дата1,Дата2,"*,423");
Пока Опер.ПолучитьПроводку()=1 Цикл            
    ТЗ.НоваяСтрока();
    ОС  = Опер.Дебет.Субконто(2);
    ТЗ.КодОС =ОС.Код;    // получаем код ОС
    ТЗ.ОС =ОС;    // получаем ОС
    ТЗ.СчетДт=Опер.Дебет.Счет;    // полукчаем счет дебета 10*
    ТЗ.СчетКт=Опер.Кредит.Счет;  // получаем счет кредита  423 - счет переоценки
    ТЗ.Сумма =Опер.Сумма;  //получаем сумм проводки П2 - П1 для конкретного ОС
КонецЦикла;
ТЗ.Сортировать("ОС");
....

С="";
Если ТЗ.НайтиЗначение(Выбор.ТекущийЭлемент(),С,"ОС")=1 Тогда
        Сообщить("И не благодари");
26 alpha78
 
29.05.19
16:52
по поиску по строке получилось

Перем С;

// запись П2-П1
Если ТЗ.НайтиЗначение(Выбор.Наименование,С,"ОС")=1 Тогда

ТЗ.ПолучитьСтрокуПоНомеру(С);
ОС = ТЗ.ОС;
КодОС = ТЗ.КодОС;
Счет = ТЗ.СчетДт;
ДельтаП = ТЗ.Сумма;
Я объявил переменную С для получения номера найденной строки и все пошло

другая проблема в этой же таблице значений поиск нужен не по наименованию, а по коду, код числовое значение
вот новая структура таблицы значения :

ТЗ.НоваяКолонка("КодОС","Число");
ТЗ.НоваяКолонка("ОС","Строка");
ТЗ.НоваяКолонка("СчетДт","Число",10);
ТЗ.НоваяКолонка("СчетКт","Число",10);
ТЗ.НоваяКолонка("Сумма","Число",15,2);

пишу алгоритм поиска строки по коду (числовое значение)

Перем С;
Перем С2;

СпрОС = СоздатьОбъект("Справочник.НеоборотныеАктивы");

// запись П2-П1
//Сообщить (Выбор.Код);

Если ТЗ.НайтиЗначение(Выбор.Код,С,"КодОС")=1 Тогда


ТЗ.ПолучитьСтрокуПоНомеру(С);

ОС = ТЗ.ОС;
КодОС = ТЗ.КодОС;
Счет = ТЗ.СчетДт;
ДельтаП = ТЗ.Сумма;

Если СпрОС.НайтиПоКоду(ТЗ.КодОС,0)=1 Тогда

СпрОС.ПереоценкаПервСт = ТЗ.Сумма;
СпрОС.Записать();
Сообщить (ТЗ.ОС+" найдено "+" переоценка первоначальной стоимости записана"+Строка(ТЗ.Сумма));

Иначе Сообщить("Запись переоценки первоначалки не найдена");
КонецЕсли;
Иначе Сообщить("поиск по коду неудачен");
КонецЕсли;    

вообще не ищет - выдает как сказано в коде - поиск по коду неудачен, в чем дело, не подскажете, спасибо!
27 Arbuz
 
29.05.19
17:50
(26) Ёпрст же уже всё сделал для/за тебя. там и кодос есть в отдельной колонке. и, опять, зачем тебе ос как строка? храни ссылку (сам объект), как тебе показали. опять много лишнего и сумбурного. если ты уже разок нашёл объект в строке тз, то далее используй НайтиЭлемент() вместо НайтиПоКоду(). и поищи обработку просмотра произвольных тз - после заполнения тз, смотри её глазами, очень помогает.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший