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