При переходе с платформы 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 оптимально использовать УчетНДСПереопределяемый.НайтиПодчиненныйСчетФактуруВыданныйНаРеализацию. Для массовой обработки документов — используйте прямой запрос к табличной части ДокументыОснования документа СчетФактураВыданный. Это обеспечит стабильность и высокую скорость работы вашей обработки.