Разберем ситуацию, когда при формировании документа или отчета (например, «Записи книги продаж») в платформах 1С 7.7 штатный черный запрос прерывается со следующими сообщениями об ошибках:
Запрос[5] : Неверно заданный путь 'ПриходныйОрдер'
Запрос[10] : Ошибка в условии
Проанализируем текст запроса, вызвавший данный сбой. В коде модуля обращение к метаданным и секции условий выглядели следующим образом:
ТекстЗапроса = ТекстЗапроса + "
|ДокументПоставки = Документ.Выписка.ДокументПоставки, Документ.ПриходныйОрдер.ДокументПоставки, Документ.РасходныйОрдер.ДокументПоставки;
|Сумма = Документ.ПриходныйОрдер.Сумма, Документ.Выписка.Приход, Документ.РасходныйОрдер.Сумма;
|Функция СуммаДок = Сумма(Сумма);
|Группировка ДокументПоставки без групп без упорядочивания;
|Условие(ДокументПоставки.Выбран()=1);
|Условие(Сумма>0);
|Условие(ДокументПоставки.Договор.АвтоОбработкаНДС=1);
|";
Выясним основные причины, из-за которых платформа 1С 7.7 генерирует данные ошибки:
Неверно заданный путь 'ПриходныйОрдер' означает, что в текущей конфигурации отсутствует вид документа с точным идентификатором ПриходныйОрдер. Это часто бывает при переносе кода из другой конфигурации или при переименовании документа в Конфигураторе (например, на ПриходныйКассовыйОрдер)..Выбран() в запросе: Метод Выбран() предназначен только для объектов в коде программы. В секции Условие() черных запросов 1С 7.7 его использование недопустимо и приводит к сбою синтаксического анализатора.ДокументПоставки.Договор.АвтоОбработкаНДС пытается обратиться к реквизитам второго и третьего уровня вложенности. Если реквизит ДокументПоставки имеет составной (неопределенный) тип, штатный язык запросов 1С 7.7 не может разобрать такой путь в секции условий.Рассмотрим, как исправить первую причину сбоя. Перейдем в Конфигуратор и откроем дерево метаданных. Раскроем ветку Документы и проверям точные идентификаторы объектов.
Если документ в конфигурации называется ПриходныйКассовыйОрдер, а в коде указано ПриходныйОрдер, исправляем имя вида документа в строках присвоения переменных запроса. Если же такой документ вообще не предусмотрен в системе, полностью удаляем обращение к нему из текста запроса.
Посмотрим на условие проверки заполненности документа. Чтобы проверить, выбран ли документ, вместо метода Выбран() используем встроенную функцию ПустоеЗначение().
Заменим ошибочную строку:
|Условие(ДокументПоставки.Выбран()=1);
На корректное условие:
|Условие(ПустоеЗначение(ДокументПоставки) = 0);
Чтобы обойти ограничение платформы 1С 7.7 при каскадном обращении через несколько точек (для реквизитов составного типа), исключим проверку ДокументПоставки.Договор.АвтоОбработкаНДС из текста запроса и перенесем её в цикл обхода результатов.
Сформируем правильный текст запроса:
ТекстЗапроса = "
|Период с ДатаНач по ДатаКон;
|ДокументПоставки = Документ.Выписка.ДокументПоставки, Документ.ПриходныйКассовыйОрдер.ДокументПоставки, Документ.РасходныйОрдер.ДокументПоставки;
|Сумма = Документ.ПриходныйКассовыйОрдер.Сумма, Документ.Выписка.Приход, Документ.РасходныйОрдер.Сумма;
|Функция СуммаДок = Сумма(Сумма);
|Группировка ДокументПоставки без групп без упорядочивания;
|Условие(ПустоеЗначение(ДокументПоставки) = 0);
|Условие(Сумма > 0);
|";
Теперь организуем обработку результатов с помощью функции Выполнить() и вынесем проверку реквизитов договора в цикл выборки:
Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
Пока Запрос.Группировка() = 1 Цикл
// Безопасное обращение к реквизитам через объект из выборки запроса
Если Запрос.ДокументПоставки.Договор.АвтоОбработкаНДС = 1 Тогда
// Заполнение строки книги продаж
КонецЕсли;
КонецЦикла;
КонецЕсли;
Таким образом, мы устранили синтаксическую ошибку пути к метаданным, исправили работу с условиями в черном запросе и обеспечили корректное формирование записей книги продаж.