При построении запроса я столкнулся с такой проблемой. При вытягивании счёта мне нужно определять, является ли субконто контрагентом, и если является, то идёт сравнение этого контрагента с текущей организацией по ИНН. Если он одинаковый, то беру определённый счёт. И казалось бы, я собрал конструкцию, которая должна была бы работать в обычном коде:
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(Данные.СубконтоДт1) = ТИП(Справочник.Контрагенты)
И Данные.Организация.ИНН = Данные.СубконтоДт1.ИНН
ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоТекущимОперациям)
ИНАЧЕ ЕСТЬNULL(ПрочиеДт.СчетУчета, ЕСТЬNULL(СчетаДтДанных.Ссылка, &ПустаяСсылка))
КОНЕЦ
Обычный код должен был проверить первое условие "КОГДА ТИПЗНАЧЕНИЯ(Данные.СубконтоДт1) = ТИП(Справочник.Контрагенты)", и в случае если оно Ложь, даже не проверял бы второе условие, а сразу перешёл к ИНАЧЕ. Но в запросе почему-то после проверки первого условия у меня вываливается в ошибку на втором условии мол у Данные.СубконтоДт1 отсутствует реквизит ИНН. Разумеется он там отсутствует, я ради этого и делал первую проверку. Я подумал, может в запросе он будет проверять все условия, которые идут через оператор И и немного доделал конструкцию:
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(Данные.СубконтоДт1) = ТИП(Справочник.Контрагенты) ТОГДА
(ВЫБОР
КОГДА Данные.Организация.ИНН = Данные.СубконтоДт1.ИНН ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоТекущимОперациям)
ИНАЧЕ ЕСТЬNULL(ПрочиеДт.СчетУчета, ЕСТЬNULL(СчетаДтДанных.Ссылка, &ПустаяСсылка))
КОНЕЦ)
ИНАЧЕ ЕСТЬNULL(ПрочиеДт.СчетУчета, ЕСТЬNULL(СчетаДтДанных.Ссылка, &ПустаяСсылка))
КОНЕЦ
Но нет, в этом варианте он точно также вываливается в ошибку, что у субконто отсутствует ИНН. Я собрал систему, в которой я вручную подаю данные в этот запрос, чтобы удостовериться что проблема не в данных. Закинул в запрос ТЗшку с одной строкой через параметр, где указал что субконто это Статья расходов. Ошибка повторилась. Закинул в субконто контрагента, ошибки нет. Зачем 1Ска в запросе идёт проверять условия, которые она и так обойдёт стороной? Методы ВЫРАЗИТЬ и ССЫЛКА тут с субконто не работают, жалуются на несоответствие типов. И как тогда эту проблему можно решить? Если только вне запроса, то это будет очень громостко и костыльно.
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(Данные.СубконтоДт1) = ТИП(Справочник.Контрагенты)
И Данные.Организация.ИНН = Данные.СубконтоДт1.ИНН
ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоТекущимОперациям)
ИНАЧЕ ЕСТЬNULL(ПрочиеДт.СчетУчета, ЕСТЬNULL(СчетаДтДанных.Ссылка, &ПустаяСсылка))
КОНЕЦ
Обычный код должен был проверить первое условие "КОГДА ТИПЗНАЧЕНИЯ(Данные.СубконтоДт1) = ТИП(Справочник.Контрагенты)", и в случае если оно Ложь, даже не проверял бы второе условие, а сразу перешёл к ИНАЧЕ. Но в запросе почему-то после проверки первого условия у меня вываливается в ошибку на втором условии мол у Данные.СубконтоДт1 отсутствует реквизит ИНН. Разумеется он там отсутствует, я ради этого и делал первую проверку. Я подумал, может в запросе он будет проверять все условия, которые идут через оператор И и немного доделал конструкцию:
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(Данные.СубконтоДт1) = ТИП(Справочник.Контрагенты) ТОГДА
(ВЫБОР
КОГДА Данные.Организация.ИНН = Данные.СубконтоДт1.ИНН ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоТекущимОперациям)
ИНАЧЕ ЕСТЬNULL(ПрочиеДт.СчетУчета, ЕСТЬNULL(СчетаДтДанных.Ссылка, &ПустаяСсылка))
КОНЕЦ)
ИНАЧЕ ЕСТЬNULL(ПрочиеДт.СчетУчета, ЕСТЬNULL(СчетаДтДанных.Ссылка, &ПустаяСсылка))
КОНЕЦ
Но нет, в этом варианте он точно также вываливается в ошибку, что у субконто отсутствует ИНН. Я собрал систему, в которой я вручную подаю данные в этот запрос, чтобы удостовериться что проблема не в данных. Закинул в запрос ТЗшку с одной строкой через параметр, где указал что субконто это Статья расходов. Ошибка повторилась. Закинул в субконто контрагента, ошибки нет. Зачем 1Ска в запросе идёт проверять условия, которые она и так обойдёт стороной? Методы ВЫРАЗИТЬ и ССЫЛКА тут с субконто не работают, жалуются на несоответствие типов. И как тогда эту проблему можно решить? Если только вне запроса, то это будет очень громостко и костыльно.
По теме из базы знаний
- Составные типы — бесплатный сыр мышеловки производительности
- Опыт оптимизации и контроля производительности в БД с 3000 пользователей
- Повышение качества разработки. Статья 3. Ошибки программы
- 1C + Python + Django Rest Framework + Vue.js. Опыт несложной full-stack разработки
- Взаимодействие с сотрудниками и клиентами из одного окна конфигурации 1С (Телеграм, ВКонтакте, Facebook, Discord). Преимущества, технические особенности, подводные камни
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
А так не работает?
Но сразу вопрос.. ИНН точно субконто? Дайте корректный запрос
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(Данные.СубконтоДт1) = ТИП(Справочник.Контрагенты)
И Данные.Организация.ИНН = Данные.СубконтоДт1.ИНН
ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоТекущимОперациям)
ИНАЧЕ ЕСТЬNULL(ПрочиеДт.СчетУчета, ЕСТЬNULL(СчетаДтДанных.Ссылка, &ПустаяСсылка))
КОНЕЦ
КОГДА ТИПЗНАЧЕНИЯ(Данные.СубконтоДт1) = ТИП(Справочник.Контрагенты)
И Данные.Организация.ИНН = Данные.СубконтоДт1.ИНН
ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоТекущимОперациям)
ИНАЧЕ ЕСТЬNULL(ПрочиеДт.СчетУчета, ЕСТЬNULL(СчетаДтДанных.Ссылка, &ПустаяСсылка))
КОНЕЦ
А так не работает?
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(Данные.СубконтоДт1) = ТИП(Справочник.Контрагенты)
И Данные.Организация.ИНН = Данные.СубконтоДт1.ИНН
ТОГДА ВЫРАЗИТЬ(ПланСчетов.Хозрасчетный.РасчетыПоТекущимОперациям) КАК РасчетыПоТекущимОперациям
ИНАЧЕ ЕСТЬNULL(ПрочиеДт.СчетУчета, ЕСТЬNULL(СчетаДтДанных.Ссылка, &ПустаяСсылка))
КОНЕЦ
Но сразу вопрос.. ИНН точно субконто? Дайте корректный запрос
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот