• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

1c7.7 Справочник.Владелец - как уснановить?

  • Автор темы KiR
  • Дата начала
P

puh14

Если правильно понял - ты перебираешь результаты первого запроса(сиквельного) и внутри перебора делаешь второй по каждому значению(Контрагентов вытаскиваешь).
Проще в переборе первого запроса добавлять каждое значение запроса в список значений (Хочешь - можешь сделать его на форме, чтобы проверять), а после перебора делать запрос к контрагентам с условием по сформированному списку значений. Результаты второго запроса выгружаешь в ТЗ и смотришь, есть ли косяк. Оставшихся строк таким образом нет - все номера договоров уже в списке которым фильтруешь, а результаты с использованием фильтра - в ТЗ.
 
K

KiR

Итак. у меня есть табличная часть с результатами сиквельного запроса, в которой есть код, сумма и тип операции; есть ТЗ с результатами запроса, в которой есть код договора, договор и контрагент. Как мне в результате объеденить эти таблицы? такое условие всегда дает 0:
Код:
НС = 0;
ВыбратьСтроки(); 
Пока ПолучитьСтроку() = 1 Цикл 
Если ТЗ.НайтиЗначение(Прав(Код,6),НС,СокрЛП(ТЗ.Код)) = 1 Тогда
ПолучитьСТрокуПоНомеру(НС); 
Контрагент = ТЗ.Контрагент;
Договор =ТЗ.Договор;
КонецЕсли;
КонецЦикла;
 
P

puh14

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

Хотя найти в ТЗ мне мало нравится - иногда один только раз находит (только щас задумался - а я переменную с номером строки обнулял или нет? Ведь если не обнулить он только в это строке искать будет.) , а потом - фиг. Мож придется через перебор ТЗ писать.
 
K

KiR

puh14

ТЗ.НайтиЗначение(СокрЛП(Сред(Код,2)),НС,"Код") = ТЗ.НайтиЗначение(Прав(Код,6),НС,СокрЛП(ТЗ.Код)) = 0
Разницы нет - все равно 0 возвращает, хотя я вижу что искомое значение там есть...
 
P

puh14

А ТЗ.КОд у тебя строка или число? может
ТЗ.НайтиЗначение(Число(СокрЛП(Сред(Код,2))),НС,"Код")

Как точно колонка с кодом договора называется? мож ошибка в уловии? попробуй вместо"код" подставить переменную, а ещё лучше - номер колонки числовой.
НС лучше пустым делай и обнуляй в начеле цикла перебора таб части - а то он у тебя только в одной строке искать будет.

ТЗ.НайтиЗначение(СокрЛП(Сред(Код,2)),НС,"Код") = ТЗ.НайтиЗначение(Прав(Код,6),НС,СокрЛП(ТЗ.Код)) - разница есть

ТЗ.Код - это не идентификатор колонки
Прав(Код,6) - он у тебя опять пробелы наоткусывает? лучше СРЕД
 
K

KiR

Делаю через отладчик ТЗ.НайтиЗначение(500094,,) получаю 0. Уже все поубирал что только можно
текс.... может стоит при выгрузке с запроса жестко назначить типы?
Запрос.Выгрузить(ТЗ) - не назначает колонкам типы как в восьмерке?
 
P

puh14

попробуй перебором строк ТЗ раз не работает НайтиЗначение
 
K

KiR

я в шоке!!!
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Код","Строка",,,,,,);
ТЗ.НоваяКолонка("Договор","Справочник.Договоры",,,,,,);
ТЗ.НоваяКолонка("Контрагент","Справочник.Контрагенты",,,,,,);
Проверяю отладчиком - ТипЗначения(ТЗ.Договор) = 0. И так каждую колонку.

попробуй перебором строк ТЗ раз не работает НайтиЗначение
И это будет все равно быстрее чем предыдущий вариант с двумя запросами, от которого я хочу уйти?
 
P

puh14

ну ТЗ довольно шустро быстро перебирается и другим пользователям не мешает. Побыстрее чем два запроса, но помедленнее чем НайтиЗначение
 
S

SeverBap

Да народ я в шоке скин md что у тебя там давай посмотрю!!! блин написал же все работает, нет полезли через Запросы, потом двойные - запросы штука интересная но по скорости дольше!
:lol:
 
K

KiR

Вар, думаю тебе md-шник мало чем поможет. Код могу и сюда скинуть если хошь, ток толку в этом не много
 
P

puh14

знаешь - походу код договора у тебя числовой. А если перед поископ по ТЗ перебрать строки и переформатировать код в строку? ктати - может быть, что код у те представлен например 000000000500094 - потому и н находит.
 
K

KiR

puh14
Врядли. для проверки сделал ТЗ.ВыбратьСтроку() - отображается все нормально

Короче вот код, который работает долго. Какие есть предложения по оптимизации:
Код:
Процедура Загрузить()
УдалитьСтроки(); 
Необрабатываемые = СоздатьОбъект("Справочник.НеобрабатываемыеКонтрагенты"); 
ВД = СоздатьОбъект("Справочник.ВидыДоговоров");
ВД.НайтиПоКоду("00002");
Брокерский = ВД.ТекущийЭлемент();
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = 
"//{{ЗАПРОС(Сформировать)
|Период с (НачГода(ТекущаяДата())) по (ТекущаяДата());
|Без итогов;
|Контрагент = Справочник.Договоры.ТекущийЭлемент, Справочник.Договоры.Владелец;
|Договор = Справочник.Договоры.ТекущийЭлемент;
|Группировка Контрагент Без Групп;
|Условие(Договор.ВидДоговора = Брокерский);
|Условие(Найти(СокрЛП(Договор.Код),СокрЛП(Сред(recordset.Fields(""client_code"").VALUE,2)))>0);
|"//}}ЗАПРОС
;
Д = Строка(ДатаГод(ДатаДок));
Д = ?(ДатаМесяц(ДатаДок)<10,Д +"0" + Строка(ДатаМесяц(ДатаДок)),Д + Строка(ДатаМесяц(ДатаДок)));
Д = ?(ДатаЧисло(ДатаДок)<10,Д +"0" + Строка(ДатаЧисло(ДатаДок)),Д + Строка(ДатаЧисло(ДатаДок)));
//получение данных SQL 
СтрокаСоединения="Provider=SQLOLEDB.1;Password=e4;Persist Security Info=True; User ID=a;Initial Catalog=bk;Data Source=db";
Соединение=СоздатьОбъект("ADODB.Connection");
Соединение.Open(СтрокаСоединения);
Записи=СоздатьОбъект("ADODB.Command");
Записи.ActiveConnection=Соединение; 
Записи.CommandTimeout = 180;
Записи.CommandType = 1; 
Записи.CommandText = "exec [dbo].[un_forts4buh] @oper_date='"+Д+"';
recordset = Записи.Execute();
Пока recordset.EOF() = 0 Цикл 
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
Если Запрос.Группировка() = 1 Тогда// Цикл
НоваяСтрока();
Контрагент = Запрос.Контрагент.Владелец;
Договор = Запрос.Договор;
Код = recordset.Fields("client_code").VALUE;
Сумма = recordset.Fields("sum_bal").VALUE;	
Если recordset.Fields("oper_name").VALUE = "VM profit" Тогда
Опер = "Вариационная маржа - доход";
ИначеЕсли recordset.Fields("oper_name").VALUE = "VM loss" Тогда
Опер = "Вариационная маржа - убыток";
ИначеЕсли recordset.Fields("oper_name").VALUE = "PR profit" Тогда
Опер = "Премия по опционам - доход";
ИначеЕсли recordset.Fields("oper_name").VALUE = "PR loss" Тогда
Опер = "Премия по опционам - убыток";
ИначеЕсли recordset.Fields("oper_name").VALUE = "ComTS" Тогда
Опер = "Комиссии Биржи";
ИначеЕсли recordset.Fields("oper_name").VALUE = "ComBrok" Тогда
Опер = "Комиссии Брокера";	
ИначеЕсли recordset.Fields("oper_name").VALUE = "TransToFORTS" Тогда
Опер = "Перевод ДС на ФОРТС";
ИначеЕсли recordset.Fields("oper_name").VALUE = "TransFromFORTS" Тогда
Опер = "Перевод ДС с ФОРТС";
ИначеЕсли recordset.Fields("oper_name").VALUE = "IncomToFORTS" Тогда
Опер = "Приход ДС от клиента на Фортс";
КонецЕсли;
ИначеЕсли (Запрос.Группировка() = 0) И (Необрабатываемые.НайтиПоКоду(recordset.Fields("client_code").VALUE) = 0) Тогда
Сообщить ("Контрагент "+recordset.Fields("client_name").VALUE+" с кодом "+ recordset.Fields("client_code").VALUE+" не найден ни в одном справочнике!");
КонецЕсли;
Иначе 
Сообщить("Проблемный запрос. Обратитесь к разработчику");
КонецЕсли;
recordset.MoveNext();
КонецЦикла; 
КонецПроцедуры
 
P

puh14

ну так отображение - это одно, а как оно для компа - другое. Лучше форматнуть. У меня тож часто не находило - предпочитал делать перебором.
 
K

KiR

Ща на всяк случай сделал так:
Код:
ТЗ.ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл 
ТЗ.Код = СокрЛП(ТЗ.Код);
КонецЦикла;	
ВыбратьСтроки(); 
Пока ПолучитьСтроку() = 1 Цикл 
//НС = 0;
//ТЗ.ВыбратьСтроку();
Если ТЗ.НайтиЗначение(Сред(Код,2),,ТЗ.Код) = 1 Тогда
//	ТекущаяСтрока(НС); 
ТЗ.Контрагент = Контрагент;
ТЗ.Договор = Договор;
КонецЕсли;
КонецЦикла;
Тока все равно возвращает постоянно 0
 
P

puh14

ТЗ.ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
КодСтрочный = СокрЛП(Строка(ТЗ.Код));
ТЗ.Код = КодСтрочный;// и посмотри, что у тебя за код после этого. в ТЗ СокрЛП из числа тебе 0 не уберет
КонецЦикла;
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
НС = "";// надо - а то после первого нахождения он будет у тебя искать только в строке НС старой
//ТЗ.ВыбратьСтроку();
Если ТЗ.НайтиЗначение(Сред(Код,2),НС,"Код") = 1 Тогда // тут не ТЗ.Код а имя колоки в строке или просто код колонки. НС не забуть - а то номер похерится
ТекущаяСтрока(НС); // или серез ПолучитьЗначение
ТЗ.Контрагент = Контрагент;
ТЗ.Договор = Договор;
КонецЕсли;
КонецЦикла;
 
K

KiR

Короче сделал так:
Код:
ТЗ.УстановитьПараметрыКолонки("Код","Строка",6,,,,,);
ВыбратьСтроки(); 
Пока ПолучитьСтроку() = 1 Цикл 
НС = "";
Если ТЗ.НайтиЗначение(Сред(Код,2),НС,"Код") = 1 Тогда
ТЗ.ПолучитьСтрокуПоНомеру(НС); 
Контрагент = ТЗ.Контрагент;
Договор = ТЗ.Договор;
КонецЕсли;
КонецЦикла;
Пока что меня устраивает, но не дай Бог колво символов в коде измениться.....
А НайтиЗначение - видимо ищет только полностью иденичтное значение к сожалению
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!