Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 июл 2024, 19:52

задача по теме запросов

Автор Пушкина, 24 июн 2024, 13:53

0 Пользователей и 1 гость просматривают эту тему.

Пушкина

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

LexaK

Пушкина, а сама задача то, где? ее описание?
(и еще, здесь на форуме все бесплатно! с деньгами/оплатой это к фрилансерам)
если помогло нажмите: Спасибо!

Пушкина

Необходимо проанализировать конфигурацию базы данных и улучшить её, пользуясь новыми знаниями о запросах.
Вам нужно будет найти в конфигурации ошибки двух типов:
•   использование методов НайтиПоНаименованию() и НайтиПоКоду() следует заменить на использование запросов;
•   неправильные или неоптимальные запросы в коде следует исправить.
По своему желанию вы можете дополнительно улучшить работу программы.
Критерии итогового задания:
1.   Добавленный или изменённый код корректно оформлен?
o   Да, соблюдены отступы и форматирование, имена переменных написаны с большой буквы. Где нужно, добавлены комментарии, лишних комментариев
2.   В общем модуле ОбщийМодульСервер поиск по коду заменён на запрос в процедуре ПроверитьПользователяНаИванова()

3.   В общем модуле УправлениеГруппами поиск по наименованию заменён на запрос в процедуре ПроверитьГруппыЭлемента()

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

5.   В модуле формы элемента справочника Товары цикл после запроса заменён на условие в процедуре ПриСозданииНаСервере().

6.   В модуле формы документа РасходТовара убран запрос в цикле, получение цены перенесено в основной запрос в процедуре ЗаполнитьВсемиОстаткамиНаСервере().

7.   В модуле формы документа РасходТовара добавлено заполнение суммы в процедуре ЗаполнитьВсемиОстаткамиНаСервере().

8.   В модуле формы документа РасходТовара процедура ЗаполнитьВсемиОстаткамиНаСервере() заменена на внеконтекстную функцию.




Пушкина


LexaK

Пушкина, это вам реально такие задания дают?
настоящий прогер пришел бы в ужас, если бы ему дали примерно такое задание
вот тебе база УТ11.5 оптимизируй там се! перепиши все запросы! выкини лишний Г..код! и т.д.
так задачи не ставятся (или препод просто издевается над вами)
я понимаю что в вашей базе всего 5 справочников 2 документа и 3 регистра.
но сам подход и методика...
еще не понятно чем препода не устраивают встроенные функции НайтиПоКоду() и НайтиПоНаименованию() ?
нормальное решение.

рассмотрим пример , оптимизации процедуры

&НаСервере
Процедура ЗаполнитьВсемиОстаткамиНаСервере()

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваровОстатки.Товар КАК Товар,
| ОстаткиТоваровОстатки.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(&Дата, ) КАК ОстаткиТоваровОстатки";

Запрос.УстановитьПараметр("Дата", Объект.Дата);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

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

Запрос.УстановитьПараметр("Ссылка", ВыборкаДетальныеЗаписи.Товар);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаЦен = РезультатЗапроса.Выбрать();

Пока ВыборкаЦен.Следующий() Цикл
Строка = Объект.Товары.Добавить();
Строка.Товар = ВыборкаДетальныеЗаписи.Товар;
Строка.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток;
Строка.Цена = ВыборкаЦен.Цена;
КонецЦикла;

КонецЦикла;


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

ее можно сделать так
&НаСервере
Процедура ЗаполнитьВсемиОстаткамиНаСервере()

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваровОстатки.Товар КАК Товар,
| ОстаткиТоваровОстатки.Товар.Цена КАК Цена,
| ОстаткиТоваровОстатки.КоличествоОстаток КАК Количество,
| ОстаткиТоваровОстатки.Товар.Цена
|* ОстаткиТоваровОстатки.КоличествоОстаток как Сумма
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(&Дата, ) КАК ОстаткиТоваровОстатки";

Запрос.УстановитьПараметр("Дата", Объект.Дата);

    //загрузка остатками вообще без циклов!!!
Объект.Товары.Загрузить(Запрос.Выполнить().Выгрузить());

КонецПроцедуры
но Цену ни кто не держит в справочнике Товары! (что приучает к неправильному формированию запроосов...)

В общем какое-то "тухлое" задание

но так как вы "подневольные" лица в этой ситуации, вам все равно придется разгребать эту кучу г..на.
разбивайте эту задачу на маленькие подзадачки и выкладывайте на форум, так вы быстрее ее решите.
чем одной кучей и с такой постановкой - Все оптимизировать! все переписать!



если помогло нажмите: Спасибо!

Пушкина


LexaK

Пушкина, пример замены Поиска по наименованию на запрос
Процедура ВыполнитьПроверкуУникальностиЭлементаСправочника(Источник, Отказ) Экспорт

Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

//Получаем описание справочника источника
Справочник = Источник.Метаданные();

Если Справочник.ДлинаНаименования = 0 Тогда
//У этого справочника не используется наименование, проверку не выполняем
Возврат;
КонецЕсли;

//Запрос - шаблон
лкЗапрос = Новый Запрос;
лкЗапрос.Текст = "
    |Выбрать первые 1
| Истина
|Из
| Справочник.Товары Спр
|Где
|   Спр.Наименование = &Наименование
Спр.Ссылка <> &Ссылка
|";
лкЗапрос.УстановитьПараметр("Наименование", Источник.Наименование);
лкЗапрос.УстановитьПараметр("Ссылка", Источник.Ссылка);

лкЗапрос.Текст = Стрза(лкЗапрос.Текст, "Товары", Справочник.Имя);

Отказ = Не лкЗапрос.Выполнить().Пустой();

Если Отказ Тогда
//сообщаем об ошибке
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Справочник.Имя+ " с таким наименованием уже есть в базе!";
Сообщение.Поле = "Наименование";
Сообщение.УстановитьДанные(Источник);
Сообщение.Сообщить();
КонецЕсли;

КонецПроцедуры   
если помогло нажмите: Спасибо!

LexaK

Пушкина, вот эта процедура вообще не понятно к чему? и ни где неиспользуется!
как вообще планировалось ее использовать?
Функция ПроверитьПользователяНаИванова() Экспорт
Возврат ПараметрыСеанса.ТекущийПользователь = Справочники.Пользователи.НайтиПоКоду("Иванов Иван Иванович");
КонецФункции   
если помогло нажмите: Спасибо!

Пушкина

имеется ввиду, просто заменить поиск на запрос, нигде не будем использовать

LexaK

Цитата: Пушкина от 24 июн 2024, 16:13имеется ввиду, просто заменить поиск на запрос, нигде не будем использовать
а вы вообще эту команду понимаете?
Возврат ПараметрыСеанса.ТекущийПользователь = Справочники.Пользователи.НайтиПоКоду("Иванов Иван Иванович");
как она работает что возвращает?
если помогло нажмите: Спасибо!

Теги:
Рейтинг@Mail.ru

Поиск