В процессе разработки расширений или внешних печатных форм для конфигурации 1С:Бухгалтерия предприятия 3.0 (БП 3.0) часто возникает задача получения данных о входящем счете-фактуре, основываясь на ссылке на документ ПоступлениеТоваровУслуг. Поскольку счет-фактура является отдельным документом, связанным с поступлением, необходимо знать структуру метаданных и программные способы извлечения этой информации.
В этой статье мы подробно разберем несколько способов решения этой задачи: от использования прямых запросов к базе данных до применения встроенных методов типовой конфигурации. Мы также проанализируем нюансы, связанные со сводными счетами-фактурами и Универсальными передаточными документами (УПД).
Наиболее очевидным и производительным способом получения данных является использование механизма запросов. Рассмотрим ситуацию, когда нам известна ссылка на документ поступления (переменная ДокументОснование).
В простейшем случае, когда один счет-фактура соответствует одному поступлению, связь хранится в реквизите ДокументОснование шапки документа СчетФактураПолученный. Разберем по шагам создание такого запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СчетФактураПолученный.НомерВходящегоДокумента КАК НомерСФ,
| СчетФактураПолученный.ДатаВходящегоДокумента КАК ДатаСФ
|ИЗ
| Документ.СчетФактураПолученный КАК СчетФактураПолученный
|ГДЕ
| СчетФактураПолученный.ДокументОснование = &ДокументОснование
| И СчетФактураПолученный.ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("ДокументОснование", СсылкаНаПоступление);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Сообщить("Номер входящего СФ: " + Выборка.НомерСФ + " от " + Формат(Выборка.ДатаСФ, "ДФ=dd.MM.yyyy"));
КонецЕсли;
Важный нюанс: Обратите внимание, что мы используем именно НомерВходящегоДокумента и ДатаВходящегоДокумента. В конфигурации 1С номер самого объекта (внутренний номер системы) и номер, присвоенный поставщиком, — это разные поля. Для налоговой отчетности и взаимодействия с контрагентами всегда важен именно входящий номер.
Проанализируем ситуацию глубже. В 1С:БП 3.0 реализована возможность регистрации одного счета-фактуры на несколько документов поступления. В этом случае реквизит шапки ДокументОснование может быть пустым или содержать только одно из поступлений, а полный список связей хранится в табличной части ДокументыОснования.
Чтобы наше решение было универсальным и находило счет-фактуру даже в случае "сводного" документа, перепишем запрос следующим образом:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| СчетФактура.НомерВходящегоДокумента КАК Номер,
| СчетФактура.ДатаВходящегоДокумента КАК Дата
|ИЗ
| Документ.СчетФактураПолученный.ДокументыОснования КАК СФОснования
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный КАК СчетФактура
| ПО СФОснования.Ссылка = СчетФактура.Ссылка
|ГДЕ
| СФОснования.ДокументОснование = &ДокументОснование
| И СчетФактура.Проведен = ИСТИНА
| И СчетФактура.ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("ДокументОснование", СсылкаНаПоступление);
// Далее обработка результата аналогично первому примеру
Использование соединения с табличной частью гарантирует, что мы найдем документ вне зависимости от того, как именно он был оформлен в системе. Также добавлена проверка на Проведен = ИСТИНА, так как в учет должны попадать только юридически значимые документы.
Для программиста, работающего с типовыми решениями, наиболее правильным путем считается использование функций из общих модулей. Это позволяет сохранить совместимость при обновлениях и использовать уже протестированную логику фирмы "1С".
Выясним, какие методы нам доступны. В конфигурации БП 3.0 существует общий модуль УчетНДСПереопределяемый или УчетНДС. Рассмотрим пример получения данных через функцию, которая часто используется для формирования надписей в формах списков или документах:
// Структура для отбора (необязательно, если нужен только один документ)
СтруктураОтбора = Новый Структура;
ДанныеСФ = УчетНДСПереопределяемый.РеквизитыДляНадписиОСчетеФактуреПолученном(СсылкаНаПоступление, СтруктураОтбора);
// Функция возвращает структуру, из которой можно извлечь описание
Если ЗначениеЗаполнено(ДанныеСФ.ТекстНадписи) Тогда
// В ТекстНадписи уже содержится сформированная строка вида "№... от..."
Сообщить(ДанныеСФ.ТекстНадписи);
КонецЕсли;
Также полезным методом является УчетНДС.ПроверитьНаличиеСчетаФактуры(ДокументСсылка). Он возвращает булево значение, что позволяет быстро проверить наличие документа перед выполнением тяжелых операций.
Разберем ситуацию, когда в документе поступления установлен признак УПД. В этом случае визуально в интерфейсе поле для ввода счета-фактуры исчезает, так как номер и дата счета-фактуры совпадают с номером и датой накладной (акта).
Несмотря на это, в БП 3.0 технически все равно создается объект Документ.СчетФактураПолученный. Он создается автоматически при проведении поступления, если включен флаг СчетФактураУПД. Поэтому вышеописанные запросы будут работать корректно и для случая с УПД. Однако стоит учитывать, что в самом поступлении есть реквизиты НомерВходящегоДокумента и ДатаВходящегоДокумента, которые при установленном УПД и являются данными счета-фактуры.
В процессе обсуждения на форуме возник вопрос об ошибке "Метод объекта не обнаружен (Connect)" при попытке получить данные из другой базы через COMConnector. Проанализируем причину этой ошибки:
comcntr.dll. Это делается командой regsvr32 в командной строке от имени администратора.Новый COMОбъект("V83.COMConnector") важно, чтобы версия установленного в системе COM-коннектора соответствовала версии платформы, к которой идет подключение.Посмотрим на исправленный пример инициализации соединения:
Попытка
COMConnector = Новый COMОбъект("V83.COMConnector");
// Используем метод Connect (с заглавной буквы)
БазаОле = COMConnector.Connect(СтрокаПодключения);
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;
Резюме: Для извлечения номера входящего счета-фактуры в БП 3.0 рекомендуется использовать запрос к табличной части ДокументыОснования документа СчетФактураПолученный или обращаться к методам общего модуля УчетНДС. Это обеспечит надежность кода при работе со сводными документами и УПД.