Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Основные ошибки 1Сников, когда они начинают писать запросы для Супермага : Супермаг Плюс (Супермаг 2000)

22.11.2024 3:40


27.05.2020 14:15
Не хочется обобщать, конечно, но в последнее время какое-то обострение по количеству .. странных людей, которые представляются 1С-программистами и начинают писать какие-то состыковки с Супермагом. Хорошо, если удается схватить их за руку еще до того, как они явят свои творения пользователям, в противном случае, тоже уже налетал - ворох абсолютно непотребных поделий со странными запросами, которые в принципе не гарантируют правильных результатов, запускается пользователями для галочки и без проверки этих самых результатов. А поскольку сами запросы выковыриваются пальцем из носу, то они еще и тормозят адски, роняя базу на колени.

Вот, автор поделия ниже, программист 1С, спросил меня, почему тут не только приходные накладные в итоге отбираются. Когда же я намекнул, что это мог родить только абсолютно незнакомый с темой человек, в ответ получил, дословно: "Неужели ORACLE настолько нежная СУБД, что валится от SELECT'ов?".

SQL код:
SELECT
  DOCTYPE,
    ID
FROM
  SMDOCUMENTS
WHERE
  SMDOCUMENTS.DOCTYPE = 'WI'
  AND OPCODE IN ('16', '17')
  OR (OPCODE = 4 AND USEROP = 412)
  AND (TO_CHAR(CREATEDAT, 'RRRR:MM:DD') >= '2020:05:25' AND TO_CHAR(CREATEDAT, 'RRRR:MM:DD') <= '2020:05:31') 
Думаю, вам самим будет интересно найти здесь ошибки? Тут их минимум три (или четыре, две одинаковые). Пишите, что найдете...
27.05.2020 14:30
AND OPCODE IN ('16', '17')
OR (OPCODE = 4 AND USEROP = 412)

opcode число или строка?
27.05.2020 14:35
число, конечно...
27.05.2020 14:50
OR нужно закрыть в скобки с OPCODE IN , иначе ломается логика
OPCODE = 4 не будет отобран, т.к. это перемещение
CREATEDAT зря в строку конвертится - по индексу не пойдет

а вот IN со строковыми значениями прокатит, в число преобразует автоматом.
27.05.2020 15:42
Цитата:
vdm нужно закрыть в скобки
конечно
Цитата:
vdm в число преобразует автоматом
Да, это неявное преобразование типов, которого я рекомендую избегать, поскольку не всегда автомат приводит к нужному типу. В данном случае - opcode может преобразовываться в строку. И не всегда могут правильно сравниваться итоговые типы.
Цитата:
vdm по индексу не пойдет
именно, не говоря уж неоптимальности сравнения дат, как строк... Особенно любят 1Сники косячить, сравнивая дату со строкой без указания региональных настроек. Типа DATE<'27.05.2020'... И пофиг, что где-то дата с английской локалью...
27.05.2020 18:46
Если начинать работу на языке с конструкциями "Справочник.открыть()", приведенное выше - это еще хотя бы неплохо, хотя бы попытка разобраться.

Я познакомился с 1С именно в таком виде, и первый же звонок был, когда 1С-ник сказал "так у вас сеть 10 Мбит/с".
27.05.2020 20:26
Вот у меня это где-то третий 1Сник за год в таком стиле. Еще не сильно воинствующий.
До этого попадался один гений, который сообщил мне, что его задача - писать запросы, а моя - делать в базе так, чтобы они нормально работали.
Шах и мат. :)
Часовой пояс GMT +3, время: 03:40.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.