Как программно найти счет-фактуру по документу-основанию в 1С:Бухгалтерия 3.0?

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

При доработке или написании внешних обработок для конфигурации 1С:Бухгалтерия 3.0 часто возникает задача получения ссылки на подчиненный счет-фактуру на основании документа реализации или поступления. Рассмотрим подробнее, какими способами можно выполнить этот поиск программно, разберем типовые инструменты системы и проанализируем их ограничения.

Типовая функция для поиска выданного счета-фактуры

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

Чтобы найти документ, мы вызываем функцию НайтиПодчиненныйСчетФактуруВыданныйНаРеализацию. Передав в эту функцию ссылку на документ-основание (например, проведенную реализацию товаров и услуг), мы получим искомую ссылку на документ СчетФактураВыданный. Это самый простой и быстрый способ для единичного документа.

Ограничения стандартного метода

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

  1. Ограничение по виду операции. Рассмотренная функция из модуля УчетНДСПереопределяемый ищет исключительно выданные счета-фактуры с типом операции «На реализацию». Если перед вами стоит задача найти счет-фактуру на аванс, корректировочный документ или счет-фактуру полученный от поставщика, этот метод не сработает. Для поставщиков потребуется обращаться к объекту СчетФактураПолученный.
  2. Наличие исправлений и корректировок. У одного документа-основания в учете может быть несколько подчиненных счетов-фактур. Такое происходит, когда выписывается исправительный или корректировочный документ. Стандартная функция вернет лишь одну (обычно первую найденную) ссылку. Если для вашего алгоритма критически важна вся цепочка исправлений, стандартный подход не подойдет.
  3. Коллизии и дубли в базе. При некорректном ручном переносе данных, ошибках обмена или сбоях пользователи могут создать два одинаковых проведенных счета-фактуры, привязанных к одной реализации. Типовая функция просто вернет первый попавшийся результат, проигнорировав эту логическую ошибку в данных, что может привести к неверным расчетам в вашем коде.

Альтернативные способы поиска: Прямые запросы

Разберем по шагам наиболее гибкий и надежный метод — использование прямого запроса к базе данных. В архитектуре конфигурации 1С:Бухгалтерия 3.0 ссылки на исходные документы хранятся не в шапке документа, а в специальной табличной части ДокументыОснования (в реквизите ДокументОснование). Это касается как объекта СчетФактураВыданный, так и СчетФактураПолученный.

Посмотрим на пример прямого запроса, который сразу отсекает помеченные на удаление документы:


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

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

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

Использование платформенных критериев отбора

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


МассивСвязанныхДокументов = КритерииОтбора.СвязанныеДокументы.Найти(СсылкаНаНашДокумент);
Для Каждого СвязанныйДокумент Из МассивСвязанныхДокументов Цикл
    Если ТипЗнч(СвязанныйДокумент) = Тип("ДокументСсылка.СчетФактураВыданный") Тогда
        // Наш найденный счет-фактура
    КонецЕсли;
КонецЦикла;

Автоматическое создание счета-фактуры

Рассмотрим сценарий, когда мы выполнили поиск, но выяснили, что счет-фактура отсутствует. Если наша задача требует автоматической генерации документа, в подсистеме учета НДС есть готовые методы.

Мы можем использовать метод СоздатьСчетФактуруВыданныйНаОсновании для инициализации нового объекта. Далее, программное заполнение через метод Заполнить() позволит платформе корректно и автоматически перенести все требуемые реквизиты, суммы, ставки НДС и табличные части из документа-основания в новый счет-фактуру без необходимости прописывать это вручную построчно.

← На главную