Прямые запросы к базе данных

  • Автор темы Автор темы vitfil
  • Дата начала Дата начала
дык конечно медленно - расчет остатков идет для каждой строчки - сколько строчек, столько запросов к бд. Если вы сделаете прямым запрсом для каждой строчки - шибко быстрее не будет. лучше сделайте как я предложил - запрос один, а потом в его результатах ищутся значеня для вывода.
 
А если поставить запрос в функцию ПриОткрытии, не будет в первый раз долго открываться справочник?
 
Добрый день уважаемые форумчане. Имеем 1С 7.7 ТиС. на SQL 2008 R2. Вопрос, как сделать так чтобы в справочнике номенклатуры когда набирается код товара, делать перехват поиска по этому коду и начинать поиск только после ввода, скажем 5 символа?
 
Добрый день уважаемые форумчане. Имеем 1С 7.7 ТиС. на SQL 2008 R2. Вопрос, как сделать так чтобы в справочнике номенклатуры когда набирается код товара, делать перехват поиска по этому коду и начинать поиск только после ввода, скажем 5 символа?

дословно никак. а вообще как вопрос относится к теме "прямые запросы к базе данных"?
 
Доброго времени суток, возможно создать отчет , где поле Материалы будут выбираться из списка?
 
дословно никак. а вообще как вопрос относится к теме "прямые запросы к базе данных"?
[/quote]
Напрямую и относится. Ибо, насколько я понимаю, именно через прямой запрос и можно перехватить набор первых символов кода и посылать запрос в скуль только после набора, например первых 5 символов. Поэтому и вопрос, как это сделать.

Добавлено:
дословно никак. а вообще как вопрос относится к теме "прямые запросы к базе данных"?
[/quote]
Напрямую и относится. Ибо, насколько я понимаю, именно через прямой запрос и можно перехватить набор первых символов кода и посылать запрос в скуль только после набора, например первых 5 символов. Поэтому и вопрос, как это сделать.
 
Доброго времени суток, возможно создать отчет , где поле Материалы будут выбираться из списка?
в принципе да, но средства зависят от типа поля "материалы" и от платформы (7.7 или 8.2)
 
Всем доброго дня. Есть такая обработка Загрузка ККМ. Сейчас у нас ТиС 7.7 на SQL2008 R2 и порядка 140 000 наименований номенклатуры. До перехода на SQL в файловой версии загрузка занимала порядка 3-4 минут. После перехода перебор справочника номенклатуры стал занимать 16-18 минут. Переписали на прямой запрос, стало порядка 8 минут. Можно еще что-то оптимизировать в нашем коде? Саму выборку получает мгновенно, а вот потом из этой выборки ВыбратьСтроки получается очччень долго. Подскажите люди добрые.






Перем СписокСкладов;//ВыбФирма
//******************************************************************************
// Описание:
// Получает список товаров выбранной фирмы на выбранном розничном складе,
// формирует таблицу значений, в которую записывает полученную инфрмацию и
// и вызывает функцию для загрузки этой информации в выбранную ККМ.
//
Процедура Выполнить()
Перем ОписаниеОш,Поз;
//ДН
Если ТЦены.Выбран()=0 Тогда
Предупреждение("Выберите тип цены для выгрузки!");
Возврат;
КонецЕсли;
//
СписокТоваров = СоздатьОбъект("ТаблицаЗначений");
СписокТоваров.НоваяКолонка("Код");
СписокТоваров.НоваяКолонка("Штрихкод");
СписокТоваров.НоваяКолонка("Наименование");
СписокТоваров.НоваяКолонка("Цена");
СписокТоваров.НоваяКолонка("Количество");
СписокТоваров.НоваяКолонка("Отдел");
СписокТоваров.НоваяКолонка("Родитель");
СписокТоваров.НоваяКолонка("Группа");
СписокТоваров.НоваяКолонка("Уровень");
СписокТоваров.НоваяКолонка("Признак");
СписокТоваров.НоваяКолонка("СхемаВнутрАвтСкидки");
СписокТоваров.НоваяКолонка("ТипТовСкидки");
СписокТоваров.НоваяКолонка("ТовСкидка");




СписокТоваровПоСтарому = СоздатьОбъект("ТаблицаЗначений");
СписокТоваровПоСтарому.НоваяКолонка("Код");
СписокТоваровПоСтарому.НоваяКолонка("Штрихкод");
СписокТоваровПоСтарому.НоваяКолонка("Наименование");
СписокТоваровПоСтарому.НоваяКолонка("Цена");
СписокТоваровПоСтарому.НоваяКолонка("Количество");
СписокТоваровПоСтарому.НоваяКолонка("Отдел");

СпрТоваров = СоздатьОбъект("Справочник.Номенклатура");
СпрПризнакЗагрузки = СоздатьОбъект("Справочник.ПризнакЗагрузки");
СпрТоварВОтдел=СоздатьОбъект("Справочник.ТоварВОтдел");

ВсегоТоваров=0;
Отобрано=0;

Сообщить("Начали"+текущеевремя());
//

СписокГрупп = СоздатьОбъект("СписокЗначений");
Текст = "
|SELECT
| СпрН.ID as [Элемент $Справочник.Номенклатура],
| $ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) Цена
|FROM
| $Справочник.Номенклатура as СпрН
|LEFT JOIN
| $Справочник.Цены СпрЦ ON СпрЦ.ParentExt = СпрН.ID AND
| $СпрЦ.ТипЦен = :ТипЦен
|WHERE
| СпрН.IsFolder = 2 AND
| СпрН.IsMark = 0
|";
RecordSet.УстановитьТекстовыйПараметр("ВыбДата",РабочаяДата());
RecordSet.УстановитьТекстовыйПараметр("ТипЦен",ТЦены);
ТЗТ = глПолучитьВыборку(, Текст);
Ном=1;
ТЗТ.ВыбратьСтроки();
Пока ТЗТ.ПолучитьСтроку()=1 Цикл
ВсегоТоваров=ВсегоТоваров+1;
Состояние(Строка(ВсегоТоваров)+" ("+Отобрано+" )");
Если (ТЗТ.Цена=0) Тогда Продолжить; КонецЕсли;
НайденнаяСкидка = "";
Отобрано=Отобрано+1;
СпрЕд=СоздатьОбъект("Справочник.Единицы");
СпрЕд.ИспользоватьВладельца(ТЗТ.Элемент);
СпрЕд.ВыбратьЭлементы();
Пока СпрЕд.ПолучитьЭлемент()=1 Цикл
(СтрДлина(СокрЛП(СпрЕд.ТекущийЭлемент().Штрихкод))=12) Тогда
(СтрДлина(СокрЛП(СпрЕд.ТекущийЭлемент().Штрихкод))=13) Тогда

Склад = "";
СпрТоварВОтдел.ИспользоватьВладельца(ТЗТ.Элемент);
СпрТоварВОтдел.ВыбратьЭлементы();
Пока СпрТоварВОтдел.ПолучитьЭлемент()=1 Цикл
Если СписокСкладов.НайтиЗначение(СпрТоварВОтдел.Магазин_Отдел)<>0 Тогда
Отдел = Число(СпрТоварВОтдел.Магазин_Отдел.НомерСекции);
Склад = СпрТоварВОтдел.Магазин_Отдел;
Прервать;
КонецЕсли;
КонецЦикла;

КонецЦикла;
Если (ПустоеЗначение(Склад)=1)и(БезОтдела=0) Тогда
Отдел = 0;
Продолжить;
КонецЕсли;



СписокТоваров.НоваяСтрока();
СписокТоваров.Код = СокрЛП(ТЗТ.Элемент.Код);
СписокТоваров.Код=ТЗТ.Элемент.Код;
СписокТоваров.Признак = Признак;
СписокТоваров.Штрихкод = СокрЛП(ТЗТ.Элемент.БазоваяЕдиница.Штрихкод);
СписокТоваров.Наименование = СокрЛП(ТЗТ.Элемент.ПолнНаименование); //ТАНЕКО НаименованиеЦенника
// СписокТоваров.Цена = НайденнаяЦена;
СписокТоваров.Цена = ТЗТ.Цена;


// СписокТоваров.Количество = глВернутьОстаток2(СпрТоваров.ТекущийЭлемент(),ВыбФирма,Склад);

СписокТоваров.Отдел = Отдел;
СписокТоваров.Родитель = ТЗТ.Элемент.Родитель.Код;
СписокТоваров.Группа = 0;
СписокТоваров.Уровень = ТЗТ.Элемент.Уровень();



Родитель =ТЗТ.Элемент.Родитель;
Пока ПустоеЗначение(Родитель)=0 Цикл
Если СписокГрупп.НайтиЗначение(Родитель)=0 Тогда
СписокГрупп.ДобавитьЗначение(Родитель);
КонецЕсли;
Родитель = Родитель.Родитель;
КонецЦикла;
КонецЦикла;
//
Сообщить("Подгодовили табл: "+текущеевремя());
//
ВсегоГрупп = СписокГрупп.РазмерСписка();
i = 0;
Для i = 1 По ВсегоГрупп Цикл
Группа = СписокГрупп.ПолучитьЗначение(i);
СписокТоваров.НоваяСтрока();
СписокТоваров.Код = СокрЛП(Группа.Код);
СписокТоваров.Признак = 1;
СписокТоваров.Штрихкод = "";
СписокТоваров.Наименование = СокрЛП(Группа.Наименование); //ТАНЕКО НаименованиеЦенника
СписокТоваров.Родитель = ?(ПустоеЗначение(Группа.Родитель)=0,Группа.Родитель.Код,"");
СписокТоваров.Группа = 1;
СписокТоваров.Уровень = Группа.Уровень();

//СписокТоваров.СхемаВнутрАвтСкидки = Группа.НайденнаяСкидка;
КонецЦикла;

СписокТоваров.Сортировать("Уровень+,Группа-");




ЕстьПоСтарому=0;
ТЗ_Кассы.ВыбратьСтроки();
Пока ТЗ_Кассы.ПолучитьСтроку()=1 Цикл
Если ТЗ_Кассы.Флаг=2 Тогда
Продолжить;
КонецЕсли;

ВыбКасса = ТЗ_Кассы.Касса;
Поз = 0;

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

Если Прав(КаталогОбмена,1)<>"\" Тогда
КаталогОбмена=КаталогОбмена+"\";
КонецЕсли;

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

КонецЦикла;

Сообщить("Усе; "+текущеевремя());

//КонецЦикла;
КонецПроцедуры


Процедура МеняемФирму()

СпрКассы = СоздатьОбъект("Справочник.Кассы");
СпрКассы.ВыбратьЭлементы();
ТЗ_Кассы.УдалитьСтроки();
Пока СпрКассы.ПолучитьЭлемент() = 1 Цикл
Если (СпрКассы.Выбран() = 1) И (СпрКассы.РежимККМ = Перечисление.РежимыККМ.OffLine) Тогда
Если ВыбФирма <> СпрКассы.Магазин Тогда
Продолжить;
КонецЕсли;

ВыбКасса = СпрКассы.ТекущийЭлемент();
ТЗ_Кассы.НоваяСтрока();
ТЗ_Кассы.Флаг = 1;
ТЗ_Кассы.Касса=СпрКассы.ТекущийЭлемент();
ТЗ_Кассы.Номер=СпрКассы.ЗаводскойНомерККМ;
ТЗ_Кассы.Каталог=СокрЛП(СпрКассы.КаталогОбмена);

КонецЕсли;
КонецЦикла;

ТЗ_Склады.УдалитьСтроки();
СписокСкладов.УдалитьВсе();
Если ПустоеЗначение(ВыбКасса)=0 Тогда
Если ПустоеЗначение(ВыбКасса.СкладКомпании)=0 Тогда
СпрСклады = СоздатьОбъект("Справочник.Склады");
СпрСклады.ВыбратьЭлементы();
Пока СпрСклады.ПолучитьЭлемент()=1 Цикл
Если
(СпрСклады.СкладМагазина=ВыбКасса.СкладКомпании)или
(СпрСклады.СкладМагазина2=ВыбКасса.СкладКомпании)
Тогда
ТЗ_Склады.НоваяСтрока();
ТЗ_Склады.Флаг=1;
ТЗ_Склады.Склад=СпрСклады.ТекущийЭлемент();
СписокСкладов.ДобавитьЗначение(СпрСклады.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
Иначе
Сообщить("У кассы не задан магазин!");
КонецЕсли
КонецЕсли;

КонецПроцедуры

//******************************************************************************
// Предопределенная процедура.
//
Процедура ПриОткрытии(ФлагЧтенияНастройки)
Перем ПозСтр;
Выбдата = РабочаяДата();
ТЗ_Склады.НоваяКолонка("Флаг",,,,,4,,);
ТЗ_Склады.НоваяКолонка("Склад",,,,,,,);
ТЗ_Склады.ВыводитьПиктограммы("Флаг");

ТЗ_Кассы.НоваяКолонка("Флаг",,,,,4,,);
ТЗ_Кассы.НоваяКолонка("Касса",,,,,12,,);
ТЗ_Кассы.НоваяКолонка("Номер",,,,,8,,);
ТЗ_Кассы.НоваяКолонка("Каталог",,,,,,,);
ТЗ_Кассы.ВыводитьПиктограммы("Флаг");

//ВыбФирма = Константа.Магазин;

СпрКассы = СоздатьОбъект("Справочник.Кассы");
СпрКассы.ВыбратьЭлементы();
Пока СпрКассы.ПолучитьЭлемент() = 1 Цикл
Если (СпрКассы.Выбран() = 1) И (СпрКассы.РежимККМ = Перечисление.РежимыККМ.OffLine) Тогда
Если ВыбФирма <> СпрКассы.Магазин Тогда
Продолжить;
КонецЕсли;

ВыбКасса = СпрКассы.ТекущийЭлемент();
ТЗ_Кассы.НоваяСтрока();
ТЗ_Кассы.Флаг = 1;
ТЗ_Кассы.Касса=СпрКассы.ТекущийЭлемент();
ТЗ_Кассы.Номер=СпрКассы.ЗаводскойНомерККМ;
ТЗ_Кассы.Каталог=СокрЛП(СпрКассы.КаталогОбмена);

КонецЕсли;
КонецЦикла;

ТЗ_Склады.УдалитьСтроки();
СписокСкладов.УдалитьВсе();
Если ПустоеЗначение(ВыбКасса)=0 Тогда
Если ПустоеЗначение(ВыбКасса.СкладКомпании)=0 Тогда
СпрСклады = СоздатьОбъект("Справочник.Склады");
СпрСклады.ВыбратьЭлементы();
Пока СпрСклады.ПолучитьЭлемент()=1 Цикл
Если
(СпрСклады.СкладМагазина=ВыбКасса.СкладКомпании)или
(СпрСклады.СкладМагазина2=ВыбКасса.СкладКомпании)
Тогда
ТЗ_Склады.НоваяСтрока();
ТЗ_Склады.Флаг=1;
ТЗ_Склады.Склад=СпрСклады.ТекущийЭлемент();
СписокСкладов.ДобавитьЗначение(СпрСклады.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
Иначе
Сообщить("У кассы не задан магазин!");
КонецЕсли
КонецЕсли;

Если ТЗ_Склады.КоличествоСтрок()=0 Тогда
//Форма.Сформировать.Доступность(0);
КонецЕсли;
КонецПроцедуры // ПриОткрытии()

Процедура ПриВыбореЯчейкиСоставаКассы()
Перем ТекСтрока, ТекКолонка;

// ТекСтрока = ТЗ_Склады.ТекущаяСтрока();
ТЗ_Кассы.ТекущаяКолонка(, ТекКолонка);
Если ТекКолонка = 1 Тогда //
Если ТЗ_Кассы.Флаг=1 Тогда
ТЗ_Кассы.Флаг=2;
Иначе
ТЗ_Кассы.Флаг=1;
КонецЕсли;
КонецЕсли;

КонецПроцедуры // ПриВыбореЯчейкиСостава()

СписокСкладов = СоздатьОбъект("СписокЗначений");
ПерезаписыватьБазу = 0;
 
Пока ТЗТ.ПолучитьСтроку()=1 Цикл
ВсегоТоваров=ВсегоТоваров+1;
Состояние(Строка(ВсегоТоваров)+" ("+Отобрано+" )");

Этот блок работает медленно и еще вот этот

СписокТоваров.НоваяСтрока();
СписокТоваров.Код = СокрЛП(ТЗТ.Элемент.Код);
СписокТоваров.Код=ТЗТ.Элемент.Код;
СписокТоваров.Признак = Признак;
СписокТоваров.Штрихкод = СокрЛП(ТЗТ.Элемент.БазоваяЕдиница.Штрихкод);
СписокТоваров.Наименование = СокрЛП(ТЗТ.Элемент.ПолнНаименование); //ТАНЕКО НаименованиеЦенника
// СписокТоваров.Цена = НайденнаяЦена;
СписокТоваров.Цена = ТЗТ.Цена;
 
Пока ТЗТ.ПолучитьСтроку()=1 Цикл
ВсегоТоваров=ВсегоТоваров+1;
Состояние(Строка(ВсегоТоваров)+" ("+Отобрано+" )");

Этот блок работает медленно
нормальные люди пользуют метод ТЗТ.КоличествоСтрок() для того чтобы избежать этого ненужного цикла (этого блока)

И ХВАТИТ УЖЕ ФЛУДИТЬ В ЭТОЙ ТЕМЕ!!! ОрловАлександр, ВАШИ ВОПРОСЫ НЕ ИМЕЮТ НИКАКОГО ОТНОШЕНИЯ К ДАННОМУ ТОПИКУ!
 
Здравствуйте я простой продавец.Хотел бы попросить у вас помощи.
Вообщем ситуация такая... магазин существует уже 7 месяцев и каждый месяц большие недостачи, магазин связан с офисом и базой данных терминалом, в конце дня все передается на офис.Каждая сверка остатка по базе и наличия товара выливается недостачей! Начальник не верит что что-то с техникой, мол в 40 магазинах все хорошо, а у вас нет! Админ там уникальный, у него помощи просто нет смысла просить. Не могли бы вы подсказать может это глючит 1С или терминал не все передает или кто-то там специально над нами издевается? Подскажите, ждем помощи!
 
Здравствуйте я простой продавец.Хотел бы попросить у вас помощи.
Вообщем ситуация такая... магазин существует уже 7 месяцев и каждый месяц большие недостачи, магазин связан с офисом и базой данных терминалом, в конце дня все передается на офис.Каждая сверка остатка по базе и наличия товара выливается недостачей! Начальник не верит что что-то с техникой, мол в 40 магазинах все хорошо, а у вас нет! Админ там уникальный, у него помощи просто нет смысла просить. Не могли бы вы подсказать может это глючит 1С или терминал не все передает или кто-то там специально над нами издевается? Подскажите, ждем помощи!
Подсказываю по пунктам:
1. Прежде чем писать в тему - убедитесь, соответствует ли Ваш вопрос теме, в которую Вы собираетесь писать. Если не соотвествует - пишите в другую тему или создайте новую чтобы НЕ ФЛУДИТЬ!
2. Если Ваш админ Вас не устраивает - ищите другого. В любом случае обратитесь к любому другому админу или 1Снику - пускай все проверит. Это единственное что Вы можете сделать самостоятельно!
 
B DBF-версии 1С компонента позволяет посредством "движка" SQLite и встроенного в него механизма "виртуальных таблиц" обращатся на чтение к таблицам базы данных 1С через "родные" методы самой 1С, а это позволяет выполнять запросы даже к базе запущенной монопольно. Помимо SQL запросов к DBF базам может пригодится:
- для организации обмена данными;
- как альтернатива таблицы значений для выполнения временных расчётов, поисков и хранения данных, благодаря способности создавать чрезвычайно быстрые "in-memory" (в памяти) базы данных.
 
lita, понятия не имею, зачем задействовать еще и компонент sqllite, если можно вполне довольствоваться и обычным Эксцелем, а если нужна база массивней, то в силу вступает и Эксес.
Есть еще один способ использовать альтернативную БД для своих проэктов. Метод отлично описан здесь -
 
Мы в соцсетях:

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