Как программно получить счет-фактуру документа Реализация товаров и услуг в 1С 8.3

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

При переходе с платформы 1С:Предприятие 8.2 на 8.3, а также при смене редакций конфигураций (например, с Бухгалтерии предприятия 2.0 на 3.0), разработчики часто сталкиваются с тем, что привычные функции общих модулей меняют свои имена, расположение или параметры (например, когда требуется реализовать Ввод документа "Поступление товаров и услуг" на основании "Реализации товаров и услуг" для БП 3.0) — для этого есть настройка создания документов на основании без конфигуратора. Одной из наиболее частых задач является поиск программным способом документа СчетФактураВыданный, созданного на основании РеализацияТоваровУслуг. В этой статье мы подробно разберем, как решить эту задачу в различных современных конфигурациях, проанализируем нюансы работы с метаданными и рассмотрим способы оптимизации кода.

Решение для 1С:Бухгалтерия предприятия 3.0

В актуальных версиях БП 3.0 логика работы с НДС вынесена в специализированные модули (подробнее в материале Справочник методов Бухгалтерии предприятия 3.0). Рассмотрим основной способ получения счета-фактуры через типовой программный интерфейс. Для решения задачи нам потребуется общий модуль УчетНДСПереопределяемый. Мы будем использовать функцию НайтиПодчиненныйСчетФактуруВыданныйНаРеализацию. Также полезно рассмотреть готовое решение: Создание счета-фактуры при записи реализации. БП 3.0.

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


// Допустим, СсылкаНаРеализацию — это ссылка на документ Реализация товаров и услуг
СчетФактура = УчетНДСПереопределяемый.НайтиПодчиненныйСчетФактуруВыданныйНаРеализацию(СсылкаНаРеализацию);

Если ЗначениеЗаполнено(СчетФактура) Тогда
    // Обработка найденного счета-фактуры
    Сообщить("Найден СФ: " + СчетФактура);
Иначе
    Сообщить("Счет-фактура не найден.");
КонецЕсли;

Разберем параметры этой функции подробнее, чтобы понимать возможности гибкой настройки поиска:

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

Решение для 1С:Управление торговлей 11.5, ERP 2.5 и КА 2.5

В конфигурациях, построенных на базе платформы ERP, архитектура поиска документов несколько отличается (см. также Создание и печать полного комплекта документов по заказу клиента). Здесь часто используются вызовы серверных модулей, отвечающих за специфику РФ. Рассмотрим ситуацию, когда нам нужно найти счет-фактуру в УТ 11.5.

Для этого воспользуемся модулем УчетНДСРФВызовСервера. Выясним, какие функции доступны программисту:


// Поиск выданного счета-фактуры
СФ_Выданный = УчетНДСРФВызовСервера.СчетФактураВыданныйПоОснованию(ДокументОснование, Организация);

// Поиск полученного счета-фактуры (если основание — Поступление)
СФ_Полученный = УчетНДСРФВызовСервера.СчетФактураПолученныйПоОснованию(ПараметрыРегистрации);

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

Решение для 1С:Управление производственным предприятием (УПП)

Если вы работаете в УПП или старых редакциях, где используется обычное приложение, но платформа обновлена до 8.3, структура вызова будет ближе к классической схеме 8.2. Используем модуль УчетНДС:


// Пример для УПП 1.3
СФ = УчетНДС.НайтиПодчиненныйСчетФактуру(СсылкаНаДокументОснование, "СчетФактураВыданный");

Оптимизация: использование запросов для обработки списков документов

Рассмотрим ситуацию, когда нам нужно получить счета-фактуры не для одного документа, а для целого списка (например, при заполнении табличной части обработки). Использование функций НайтиПодчиненныйСчетФактуру в цикле является грубой ошибкой проектирования, так как порождает N+1 запрос к базе данных. Это существенно замедляет работу системы.

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


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

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

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

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

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


// Получаем массив всех связанных документов
МассивСвязей = КритерииОтбора.СвязанныеДокументы.Найти(СсылкаНаРеализацию);

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

Этот метод удобен своей универсальностью, так как он работает одинаково для многих типов документов, но он может вернуть лишние данные (например, корректировки или оплаты), которые придется фильтровать в коде.

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

При поиске счета-фактуры всегда важно помнить о следующих моментах:

Подведем итог: для разовых задач в БП 3.0 оптимально использовать УчетНДСПереопределяемый.НайтиПодчиненныйСчетФактуруВыданныйНаРеализацию. Для массовой обработки документов — используйте прямой запрос к табличной части ДокументыОснования документа СчетФактураВыданный. Это обеспечит стабильность и высокую скорость работы вашей обработки.

← На главную