При разработке отчетов или печатных форм в конфигурации 1С:Управление производственным предприятием 1.3 (УПП) часто возникает задача: имея ссылку на документ РеализацияТоваровУслуг, получить номер и дату связанного с ним документа СчетФактураВыданный. Особенность архитектуры 1С заключается в том, что в самом документе реализации нет прямой ссылки на счет-фактуру. Связь организована «от обратного»: именно счет-фактура хранит в себе ссылку на документ-основание. Рассмотрим подробно, как правильно извлечь эти данные, используя запросы и программные методы.
Проанализируем структуру метаданных. В 1С:УПП документ СчетФактураВыданный содержит табличную часть ДокументыОснования. Именно в ней хранится ссылка на одну или несколько реализаций. Чтобы получить номер счета-фактуры, нам необходимо выполнить соединение таблиц. Разберем по шагам создание такого запроса.
Для начала выберем данные из реализации и присоединим к ним данные счета-фактуры. Важно помнить, что к одной реализации теоретически может быть выписано несколько счетов-фактур (хотя это редкость для типовой логики), поэтому стоит использовать ЛЕВОЕ СОЕДИНЕНИЕ, чтобы не потерять строки реализации, если счет-фактура еще не выписан.
ВЫБРАТЬ
Реализация.Ссылка КАК ДокументРеализации,
СчетФактураОснования.Ссылка.Номер КАК НомерСчетаФактуры,
СчетФактураОснования.Ссылка.Дата КАК ДатаСчетаФактуры
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураВыданный.ДокументыОснования КАК СчетФактураОснования
ПО СчетФактураОснования.ДокументОснование = Реализация.Ссылка
ГДЕ
Реализация.Ссылка = &Ссылка
И (СчетФактураОснования.Ссылка.Проведен ИЛИ СчетФактураОснования.Ссылка.Проведен ЕСТЬ NULL)
В данном примере мы используем условие на Проведен, чтобы исключить помеченные на удаление или просто записанные, но не проведенные документы, которые не имеют юридической силы. Обратите внимание на поле ДокументОснование — оно является ключевым для связи в этой табличной части.
Рассмотрим более производительный и современный способ. В последних релизах УПП 1.3 (начиная с внедрения постановления №1137) данные о счетах-фактурах дублируются в специализированном регистре сведений ЖурналУчетаСчетовФактур. Использование регистра в запросах предпочтительнее, так как он индексирован и обращение к нему происходит быстрее, чем к табличным частям документов.
Выясним причину, почему этот способ лучше: регистр объединяет информацию о разных типах счетов-фактур (выданных, на аванс, корректировочных) в единую структуру. Запрос будет выглядеть следующим образом:
ВЫБРАТЬ
Журнал.НомерСчетаФактуры,
Журнал.ДатаСчетаФактуры
ИЗ
РегистрСведений.ЖурналУчетаСчетовФактур КАК Журнал
ГДЕ
Журнал.ДокументОснование = &Ссылка
И Журнал.ТипСчетаФактуры = ЗНАЧЕНИЕ(Перечисление.ТипСчетаФактуры.Выставленный)
Важный нюанс: при использовании этого регистра мы сразу получаем готовые строковые представления номера и даты, что удобно для вывода в печатные формы без дополнительного форматирования.
Если задача стоит не в рамках одного большого запроса, а при разработке программного кода (например, в форме документа или обработке), стоит воспользоваться «багажом» типовых функций УПП. В конфигурации существует общий модуль УчетНДС, который содержит функции для поиска связанных документов.
Посмотрим на пример использования функции НайтиСчетФактуру. Она возвращает ссылку на документ или Неопределено, если связь не найдена. Это избавляет нас от необходимости писать запросы вручную.
// СсылкаДокумента - это ссылка на нашу Реализацию
СчетФактураСсылка = УчетНДС.НайтиСчетФактуру(СсылкаДокумента);
Если ЗначениеЗаполнено(СчетФактураСсылка) Тогда
НомерСФ = СчетФактураСсылка.Номер;
ДатаСФ = СчетФактураСсылка.Дата;
КонецЕсли;
Еще одна полезная функция — УчетНДС.ПолучитьТекстСостоянияСФ(СсылкаДокумента). Проанализируем её работу: она возвращает готовую строку вида «Счет-фактура № 123 от 01.01.2023». Именно эта функция используется в типовой форме реализации для отображения гиперссылки в нижней части окна. Если вам нужно просто вывести информацию пользователю, это самый быстрый путь.
В процессе обсуждения на форумах часто возникают споры о реквизите Сделка. Разберем ситуацию подробнее: реквизит Сделка в документе РеализацияТоваровУслуг обычно ссылается на ЗаказПокупателя или СчетНаОплатуПокупателю. Он никогда не содержит ссылку на счет-фактуру в типовой конфигурации. Попытка вытащить номер СФ через Реализация.Сделка.Номер приведет к получению номера заказа, что является ошибкой.
Также рассмотрим ошибку «Поле объекта не обнаружено "Выставлен"». В некоторых релизах или региональных версиях (например, УПП для Украины) структура документа может отличаться. Реквизит Выставлен и связанные с ним поля (дата выставления, способ выставления) появились в российской версии УПП после вступления в силу правил по электронному документообороту и постановления №1137. Если вы столкнулись с такой ошибкой, убедитесь, что вы обращаетесь к реквизитам документа программно только после проверки их существования в метаданных или через попытку-исключение:
Попытка
Если ДокОбъект.Выставлен Тогда
// Логика обработки выставленного счета
КонецЕсли;
Исключение
// Реквизит отсутствует в данной версии конфигурации
КонецПопытки;
При построении запросов важно учитывать сложные хозяйственные операции:
ДокументыОснования корректно найдет одну и ту же СФ для всех связанных реализаций.КорректировочныйСчетФактура. Если вам нужны данные именно первичного документа, всегда фильтруйте запрос по типу ссылки или метаданным.ПометкаУдаления. Пользователи могут создать счет-фактуру, пометить его на удаление и создать новый. Без фильтрации ваш запрос «размножит» строки в отчете.Подводя итог, наиболее надежным и быстрым способом для отчетов является обращение к регистру сведений ЖурналУчетаСчетовФактур, а для оперативной работы в коде — использование функций модуля УчетНДС.