При разработке и доработке учетных механизмов в 1С часто возникает задача найти подчиненный или связанный документ. Например, в модуле документа ОтчетКомитентуОПродажах требуется получить ссылку на выданный счет-фактуру, созданный на его основании. При попытке написать такое условие разработчики нередко сталкиваются с ошибками синтаксиса или получением пустого результата.
Разберем причины возникновения ошибок и рассмотрим правильные варианты построения запросов в зависимости от структуры метаданных конфигурации.
Посмотрим на пример запроса, который вызывает ошибку:
ВЫБРАТЬ
СчетФактураВыданный.Ссылка КАК Ссылка
ИЗ
Документ.СчетФактураВыданный КАК СчетФактураВыданный
ГДЕ
СчетФактураВыданный.ДокументыОснования.Ссылка = &Ссылка
В данном запросе допущены сразу две принципиальные ошибки:
ГДЕ: Платформа 1С:Предприятие не позволяет обращаться через точку к реквизитам вложенных таблиц из основной таблицы документа (конструкция вида Таблица.ТабличнаяЧасть.Реквизит не поддерживается языком запросов).ДокументыОснования поле ссылки на родительский документ называется ДокументОснование, а не Ссылка. Поле Ссылка в табличной части указывает на сам документ СчетФактураВыданный.В некоторых конфигурациях или ранних редакциях реквизит основания представляет собой одиночное поле в шапке документа с именем ДокументОснование. Проверим структуру метаданных: если у документа СчетФактураВыданный есть реквизит шапки ДокументОснование, текст запроса должен выглядеть следующим образом:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СчетФактура.Ссылка КАК Ссылка
|ИЗ
| Документ.СчетФактураВыданный КАК СчетФактура
|ГДЕ
| СчетФактура.ДокументОснование = &ДокументОснование
| И НЕ СчетФактура.ПометкаУдаления";
Запрос.УстановитьПараметр("ДокументОснование", ЭтотОбъект.Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если в конфигурации счет-фактура может содержать несколько документов-оснований, список оснований вынесен в табличную часть ДокументыОснования с реквизитом ДокументОснование. Чтобы получить ссылку на счет-фактуру без использования сложных вложенных запросов, выберем данные напрямую из таблицы табличной части.
Обязательно добавим ключевое слово РАЗЛИЧНЫЕ, чтобы исключить дублирование ссылок, если основание по какой-то причине указано в строках несколько раз:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| СчетФактураТабЧасть.Ссылка КАК Ссылка
|ИЗ
| Документ.СчетФактураВыданный.ДокументыОснования КАК СчетФактураТабЧасть
|ГДЕ
| СчетФактураТабЧасть.ДокументОснование = &ДокументОснование
| И НЕ СчетФактураТабЧасть.Ссылка.ПометкаУдаления";
Запрос.УстановитьПараметр("ДокументОснование", ЭтотОбъект.Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка найденного счета-фактуры
НайденнаяСсылка = Выборка.Ссылка;
КонецЦикла;
При реализации поиска связанных документов учтем следующие технические особенности платформы:
ЭтотОбъект.Ссылка возвращает пустую ссылку (Ссылка.Пустая()). В таком случае запрос не вернет результатов, так как подчиненных объектов в базе еще существовать не может. Перед выполнением запроса имеет смысл добавить проверку: ЭтоНовый().И НЕ СчетФактура.ПометкаУдаления и при необходимости И СчетФактура.Проведен.
НайденныеДокументы = КритерииОтбора.СвязанныеДокументы.Найти(ЭтотОбъект.Ссылка);
Этот метод вернет массив ссылок на все документы, ссылающиеся на текущий объект.