Как программно получить номер и дату входящего счета-фактуры из документа поступления в 1С:БП 3.0

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

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

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

Способ 1. Получение данных с помощью прямого запроса

Наиболее очевидным и производительным способом получения данных является использование механизма запросов. Рассмотрим ситуацию, когда нам известна ссылка на документ поступления (переменная ДокументОснование).

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


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

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

РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    Сообщить("Номер входящего СФ: " + Выборка.НомерСФ + " от " + Формат(Выборка.ДатаСФ, "ДФ=dd.MM.yyyy"));
КонецЕсли;

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

Способ 2. Учет сводных счетов-фактур (работа с табличной частью)

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

Чтобы наше решение было универсальным и находило счет-фактуру даже в случае "сводного" документа, перепишем запрос следующим образом:


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

Запрос.УстановитьПараметр("ДокументОснование", СсылкаНаПоступление);
// Далее обработка результата аналогично первому примеру

Использование соединения с табличной частью гарантирует, что мы найдем документ вне зависимости от того, как именно он был оформлен в системе. Также добавлена проверка на Проведен = ИСТИНА, так как в учет должны попадать только юридически значимые документы.

Способ 3. Использование типовых методов конфигурации

Для программиста, работающего с типовыми решениями, наиболее правильным путем считается использование функций из общих модулей. Это позволяет сохранить совместимость при обновлениях и использовать уже протестированную логику фирмы "1С".

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


// Структура для отбора (необязательно, если нужен только один документ)
СтруктураОтбора = Новый Структура;
ДанныеСФ = УчетНДСПереопределяемый.РеквизитыДляНадписиОСчетеФактуреПолученном(СсылкаНаПоступление, СтруктураОтбора);

// Функция возвращает структуру, из которой можно извлечь описание
Если ЗначениеЗаполнено(ДанныеСФ.ТекстНадписи) Тогда
    // В ТекстНадписи уже содержится сформированная строка вида "№... от..."
    Сообщить(ДанныеСФ.ТекстНадписи);
КонецЕсли;

Также полезным методом является УчетНДС.ПроверитьНаличиеСчетаФактуры(ДокументСсылка). Он возвращает булево значение, что позволяет быстро проверить наличие документа перед выполнением тяжелых операций.

Особенности работы с УПД (Универсальный передаточный документ)

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

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

Решение проблем с COM-соединением

В процессе обсуждения на форуме возник вопрос об ошибке "Метод объекта не обнаружен (Connect)" при попытке получить данные из другой базы через COMConnector. Проанализируем причину этой ошибки:

  1. Регистрация библиотеки: Убедимся, что на компьютере (или сервере 1С) зарегистрирована библиотека comcntr.dll. Это делается командой regsvr32 в командной строке от имени администратора.
  2. 64-битный сервер: Если код выполняется на стороне 64-битного сервера приложений 1С, а COM-компонент 32-битный, необходимо настроить "Службу компонентов" (dcomcnfg), создав пустое приложение COM+ и добавив туда DLL 1С как компонент.
  3. Версия платформы: В коде инициализации Новый COMОбъект("V83.COMConnector") важно, чтобы версия установленного в системе COM-коннектора соответствовала версии платформы, к которой идет подключение.

Посмотрим на исправленный пример инициализации соединения:


Попытка
    COMConnector = Новый COMОбъект("V83.COMConnector");
    // Используем метод Connect (с заглавной буквы)
    БазаОле = COMConnector.Connect(СтрокаПодключения);
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;

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

← На главную