• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

1c 7.7 Поиск Документа

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

Paume

Добрый день!

Разбираюсь с долгоиграющей обработкой, где есть вот такой кусочек:

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

Вопрос - может быть, это я чего-то не знаю, и действительно грамотнее писать
ДокСпец=СоздатьОбъект("Документ");
а потом делать проверку на его вид.

а не так, как я:
ДокСпец=СоздатьОбъект("Документ.Специальности");
и цикл только по документам этого вида.
 
V

vbs

Если Специальность является реквизитом нескольких видов документов - тогда первый вариант (возможно, для документов вида НЕ Специальности нужна обработка по другому типу),
если только одного - тогда второй сработает.
А в чем проблема ?
 
P

Paume

В данном случае - обработка только по этому виду документа.
Проблема - слишком большой объем базы, чтобы перебирать ВСЕ документы.
Ну и опять же - я не могу отрицать, что человек, который это писал, обладает знаниями, которых у меня может и не быть. Короче, пока я не понимаю, почему он все поиски в настройке пишет вот так:

Док = создатьОбъект("документ");
Док.ВыбратьДокументы();
Пока ПолучитьДокумент()=1 цикл
Если Док.Вид()=НужныйВид Тогда
КонецЕсли;
КонецЦикла;

у меня нет уверенности, что это действительно неправильно.
 
K

KiR

если нужно обрабатывать только один вид документов то его и надо определить в
Док = создатьОбъект("документ.конкретныйвид");
а потом уже можно будет искать к примеру по номеру или еще по чему-нибудь, не перебирая все доки. если база на скуле - нужно тогда цикл запросом заменить в котором можно указать необходимое условие

Ну и опять же - я не могу отрицать, что человек, который это писал, обладает знаниями, которых у меня может и не быть.
или же этот человек был неопытным и написал просто как сумел
 
P

Paume

или же этот человек был неопытным и написал просто как сумел

Неа. ;)
Там такая логика описана, что у меня до сих пор голова кругом - не то что реализовать, а просто чтобы придумать такое, нужно быть очень вумным. ;)))
 
K

KiR

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

Дайнеко

Paume! Я хочу придать тебе уверенности, что глядя на написанную дебилом глупость, не надо считать себя неопытным и полагать, что ты не понимаешь чужой "мудрости". "Он же такую большую прогу написал!"


Тогда есть смысл эту логику сюда сообщить чтобы люди подсказывали что-то конкретное, а не тыкали пальцем в небо.
Человек покритиковал, и причем конкретными примерами. Вот и не надо ему пенять "пальцем в небо". Я бы за такое творчество руки отрывал. Может кто меня поддержит, когда я время от времени смотрю типовые конфигурации, диву даюсь, как можно написать так сложно и громоздко. Создалось впечатление, что в 1С одна команда создает гениальные инструменты, и совсем другая команда бывших бухгалтерш лепит не нем хлам.
 
H

Hryv

Если мне не изменяет склероз, то после
ДокСпец=СоздатьОбъект("Документ.Специальность");
не будет работать
ДокСпец.ВыбратьПоЗначению(,,"Специальность",Спр.ТекущийЭлемент());

поэтому, как я понял, там и используется ДокСпец=СоздатьОбъект("Документ");
это во-первых


но во-вторых после
ДокСпец.ВыбратьПоЗначению(,,"Специальность",Спр.ТекущийЭлемент());
хоть убейте не пойму зачем
Если ДокСпец.Специальность=Спр.ТекущийЭлемент() Тогда
оно ведь всегда будет равно
;)
 
P

puh14

Не - криво написано.По сути надо определить есть в базе хоть один документ специальность с выбранной специальностью не помеченный на удаление. Запрос спасет отца русской демократии! хотя слова обратныйпорядок настораживают - сколько же там таких документов? Если дофига тогда проще проводить этот документ, и писать например специальность и документ специальность (измерения) + одинресурсик числовой в отдельный регистр остатков. Отмена проведения или пометка на удаление убивают запись в регистре. Плюсы - там ТОЛЬКО проведенные документы, будет летать.
 
P

Paume

Код писал человек умный ;) и ленивый ;)))
По-моему, одно на второе не влияет, ну и наоборот тоже ;)))

Всем спасибо - то, что хотелось услышать, мною услышано. ;)

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

Самая показательная настройка в этом плане была Лаборатории Дайнеко. ;)))

Опыта огребаешь - по самое нехочу! ;)))
 
V

vbs

Если мне не изменяет склероз, то после
ДокСпец=СоздатьОбъект("Документ.Специальность");
не будет работать
ДокСпец.ВыбратьПоЗначению(,,"Специальность",Спр.ТекущийЭлемент());
Склероз не изменяет, документ не может быть определенного вида !. А я лоханулся ;)
 
Д

Дайнеко

Извиняюсь, твою "пальцем в небо" не совсем правильно понял.
 
Мы в соцсетях:

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