Как исправить ошибку «Неверно заданный путь» и ошибки в условии запроса в 1С 7.7 при формировании книги продаж

Программист 1С v7.7 1C:Бухгалтерия Налоговый учет
← На главную

Анализ проблемы и причин возникновения ошибки

Разберем ситуацию, когда при формировании документа или отчета (например, «Записи книги продаж») в платформах 1С 7.7 штатный черный запрос прерывается со следующими сообщениями об ошибках:


Запрос[5] : Неверно заданный путь 'ПриходныйОрдер'
Запрос[10] : Ошибка в условии

Проанализируем текст запроса, вызвавший данный сбой. В коде модуля обращение к метаданным и секции условий выглядели следующим образом:


ТекстЗапроса = ТекстЗапроса + "        
    |ДокументПоставки = Документ.Выписка.ДокументПоставки, Документ.ПриходныйОрдер.ДокументПоставки, Документ.РасходныйОрдер.ДокументПоставки;
    |Сумма = Документ.ПриходныйОрдер.Сумма, Документ.Выписка.Приход, Документ.РасходныйОрдер.Сумма;
    |Функция СуммаДок = Сумма(Сумма);
    |Группировка ДокументПоставки без групп без упорядочивания;
    |Условие(ДокументПоставки.Выбран()=1);
    |Условие(Сумма>0);
    |Условие(ДокументПоставки.Договор.АвтоОбработкаНДС=1);
    |";

Выясним основные причины, из-за которых платформа 1С 7.7 генерирует данные ошибки:

  1. Несоответствие дерева метаданных тексту запроса: Сообщение Неверно заданный путь 'ПриходныйОрдер' означает, что в текущей конфигурации отсутствует вид документа с точным идентификатором ПриходныйОрдер. Это часто бывает при переносе кода из другой конфигурации или при переименовании документа в Конфигураторе (например, на ПриходныйКассовыйОрдер).
  2. Некорректное использование метода .Выбран() в запросе: Метод Выбран() предназначен только для объектов в коде программы. В секции Условие() черных запросов 1С 7.7 его использование недопустимо и приводит к сбою синтаксического анализатора.
  3. Каскадные обращения через несколько точек: Выражение ДокументПоставки.Договор.АвтоОбработкаНДС пытается обратиться к реквизитам второго и третьего уровня вложенности. Если реквизит ДокументПоставки имеет составной (неопределенный) тип, штатный язык запросов 1С 7.7 не может разобрать такой путь в секции условий.

Шаг 1. Проверка метаданных и наименований документов

Рассмотрим, как исправить первую причину сбоя. Перейдем в Конфигуратор и откроем дерево метаданных. Раскроем ветку Документы и проверям точные идентификаторы объектов.

Если документ в конфигурации называется ПриходныйКассовыйОрдер, а в коде указано ПриходныйОрдер, исправляем имя вида документа в строках присвоения переменных запроса. Если же такой документ вообще не предусмотрен в системе, полностью удаляем обращение к нему из текста запроса.

Шаг 2. Корректировка условий проверки на заполнение реквизитов

Посмотрим на условие проверки заполненности документа. Чтобы проверить, выбран ли документ, вместо метода Выбран() используем встроенную функцию ПустоеЗначение().

Заменим ошибочную строку:

|Условие(ДокументПоставки.Выбран()=1);

На корректное условие:

|Условие(ПустоеЗначение(ДокументПоставки) = 0);

Шаг 3. Перенос каскадной проверки реквизитов из запроса в цикл выборки

Чтобы обойти ограничение платформы 1С 7.7 при каскадном обращении через несколько точек (для реквизитов составного типа), исключим проверку ДокументПоставки.Договор.АвтоОбработкаНДС из текста запроса и перенесем её в цикл обхода результатов.

Сформируем правильный текст запроса:


ТекстЗапроса = "
|Период с ДатаНач по ДатаКон;
|ДокументПоставки = Документ.Выписка.ДокументПоставки, Документ.ПриходныйКассовыйОрдер.ДокументПоставки, Документ.РасходныйОрдер.ДокументПоставки;
|Сумма = Документ.ПриходныйКассовыйОрдер.Сумма, Документ.Выписка.Приход, Документ.РасходныйОрдер.Сумма;
|Функция СуммаДок = Сумма(Сумма);
|Группировка ДокументПоставки без групп без упорядочивания;
|Условие(ПустоеЗначение(ДокументПоставки) = 0);
|Условие(Сумма > 0);
|";

Теперь организуем обработку результатов с помощью функции Выполнить() и вынесем проверку реквизитов договора в цикл выборки:


Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
    Пока Запрос.Группировка() = 1 Цикл
        // Безопасное обращение к реквизитам через объект из выборки запроса
        Если Запрос.ДокументПоставки.Договор.АвтоОбработкаНДС = 1 Тогда
            // Заполнение строки книги продаж
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

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

← На главную