Как в запросе 1С получить Счет-фактуру по документу-основанию?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке и доработке учетных механизмов в 1С часто возникает задача найти подчиненный или связанный документ. Например, в модуле документа ОтчетКомитентуОПродажах требуется получить ссылку на выданный счет-фактуру, созданный на его основании. При попытке написать такое условие разработчики нередко сталкиваются с ошибками синтаксиса или получением пустого результата.

Разберем причины возникновения ошибок и рассмотрим правильные варианты построения запросов в зависимости от структуры метаданных конфигурации.

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

Посмотрим на пример запроса, который вызывает ошибку:


ВЫБРАТЬ
    СчетФактураВыданный.Ссылка КАК Ссылка
ИЗ
    Документ.СчетФактураВыданный КАК СчетФактураВыданный
ГДЕ
    СчетФактураВыданный.ДокументыОснования.Ссылка = &Ссылка

В данном запросе допущены сразу две принципиальные ошибки:

  1. Обращение через точку к табличной части в секции ГДЕ: Платформа 1С:Предприятие не позволяет обращаться через точку к реквизитам вложенных таблиц из основной таблицы документа (конструкция вида Таблица.ТабличнаяЧасть.Реквизит не поддерживается языком запросов).
  2. Неверное имя поля: В табличной части ДокументыОснования поле ссылки на родительский документ называется ДокументОснование, а не Ссылка. Поле Ссылка в табличной части указывает на сам документ СчетФактураВыданный.

Вариант 1. Запрос, если основание хранится в реквизите шапки

В некоторых конфигурациях или ранних редакциях реквизит основания представляет собой одиночное поле в шапке документа с именем ДокументОснование. Проверим структуру метаданных: если у документа СчетФактураВыданный есть реквизит шапки ДокументОснование, текст запроса должен выглядеть следующим образом:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    СчетФактура.Ссылка КАК Ссылка
    |ИЗ
    |    Документ.СчетФактураВыданный КАК СчетФактура
    |ГДЕ
    |    СчетФактура.ДокументОснование = &ДокументОснование
    |    И НЕ СчетФактура.ПометкаУдаления";

Запрос.УстановитьПараметр("ДокументОснование", ЭтотОбъект.Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Вариант 2. Запрос напрямую к табличной части «ДокументыОснования»

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

Обязательно добавим ключевое слово РАЗЛИЧНЫЕ, чтобы исключить дублирование ссылок, если основание по какой-то причине указано в строках несколько раз:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    СчетФактураТабЧасть.Ссылка КАК Ссылка
    |ИЗ
    |    Документ.СчетФактураВыданный.ДокументыОснования КАК СчетФактураТабЧасть
    |ГДЕ
    |    СчетФактураТабЧасть.ДокументОснование = &ДокументОснование
    |    И НЕ СчетФактураТабЧасть.Ссылка.ПометкаУдаления";

Запрос.УстановитьПараметр("ДокументОснование", ЭтотОбъект.Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
    // Обработка найденного счета-фактуры
    НайденнаяСсылка = Выборка.Ссылка;
КонецЦикла;

Важные нюансы при выполнении запроса

При реализации поиска связанных документов учтем следующие технические особенности платформы:

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