Как в 1С 7.7 получить номер подчиненного счета-фактуры для документа основания

Программист 1С v7.7
← На главную

В процессе разработки механизмов выгрузки данных (например, при формировании XML-файлов для электронного документооборота) часто возникает необходимость найти связанный документ. Типичная задача для платформы 1С 7.7 — получить номер счета-фактуры, который был выписан на основании товарно-транспортной накладной (ТТН) или реализации. Несмотря на то что платформа считается устаревшей, механизмы работы с объектной моделью в ней требуют четкого понимания синтаксиса и логики работы ссылочных связей.

Рассмотрим, как правильно реализовать поиск подчиненного документа, какие методы использовать и на что обратить внимание, чтобы избежать типичных ошибок начинающих разработчиков.

Базовый алгоритм поиска через подчиненные документы

Основным инструментом для решения этой задачи в 1С 7.7 является метод ВыбратьПодчиненныеДокументы. Этот метод позволяет проанализировать дерево связей и найти все объекты, у которых текущий документ указан в качестве «Документа-основания».

Разберем по шагам стандартную функцию поиска. Для начала нам необходимо создать объект типа «Документ», инициализировать выборку и в цикле проверить каждый найденный документ на соответствие нужному нам виду (в нашем случае — «СчетФактураВыданный»).

Пример корректной функции для получения номера счета-фактуры:


Функция ПолучитьНомерПодчиненногоСФ(ДокОснование)
    Перем ДокПодч;
    // Проверяем, что документ-основание выбран и записан в базе
    Если ДокОснование.Выбран() = 0 Тогда
        Возврат "";
    КонецЕсли;

    ДокПодч = СоздатьОбъект("Документ");
    
    // Инициируем выборку подчиненных документов
    // Важно: используем ТекущийДокумент() для позиционирования
    ДокПодч.ВыбратьПодчиненныеДокументы(, , ДокОснование.ТекущийДокумент());
    
    Пока ДокПодч.ПолучитьДокумент() = 1 Цикл
        // Проверяем вид документа. Название должно точно совпадать с конфигуратором
        Если ДокПодч.Вид() = "СчетФактураВыданный" Тогда
            // Если нашли нужный вид, возвращаем его номер
            Возврат ДокПодч.НомерДок;
        КонецЕсли;
    КонецЦикла;

    Возврат ""; // Если ничего не нашли
КонецФункции

Важные нюансы и причины возможных ошибок

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

  1. Состояние документа в базе: Метод ВыбратьПодчиненныеДокументы работает только с данными, которые физически записаны в таблицы базы данных. Если вы пытаетесь найти подчиненный документ сразу после его создания в коде, но до момента вызова Записать(), выборка будет пустой.
  2. Использование ТекущийДокумент(): Это критически важный момент. При передаче ссылки на документ-основание в метод выборки, необходимо использовать ДокОснование.ТекущийДокумент(). Это гарантирует, что система получит актуальный внутренний идентификатор объекта, а не просто контекст формы или пустую ссылку.
  3. Пометки на удаление: Стандартная выборка включает в себя и те документы, которые были помечены пользователем на удаление. Если в системе создавались ошибочные счета-фактуры, функция может вернуть номер первого попавшегося «мусорного» документа. Для исключения таких случаев стоит добавить проверку: Если ДокПодч.ПометкаУдаления() = 0 Тогда.
  4. Точное имя вида документа: В разных конфигурациях (Бухгалтерия, Торговля и Склад, Комплексная) идентификатор объекта может отличаться. Проверьте в Конфигураторе, как именно называется объект: СчетФактура, СчетФактураВыданный или ГФ_СчетФактура. Ошибка в одном символе приведет к тому, что условие поиска никогда не выполнится.

Оптимизация для производительности

Если ваша задача — выгрузка большого массива данных (например, тысячи накладных за месяц), использование ВыбратьПодчиненныеДокументы внутри цикла выгрузки может существенно замедлить процесс. Это происходит из-за большого количества обращений к базе данных для каждой итерации.

В таких случаях профессионалы рекомендуют рассмотреть альтернативные варианты:

Разбор практической ситуации

Рассмотрим ситуацию, описанную в обсуждении: программист получает номер текущего документа вместо подчиненного. Это происходит, когда в коде вместо обращения к атрибуту найденного объекта ДокПодч.НомерДок происходит возврат значения из неправильного контекста или ошибочное использование ТекущийДокумент(). Всегда проверяйте, к какому именно объекту вы обращаетесь внутри цикла Пока ... Цикл.

Правильный подход к получению данных внутри цикла:


Пока ДокПодч.ПолучитьДокумент() = 1 Цикл
    Если ДокПодч.Вид() = "СчетФактураВыданный" Тогда
        // Правильно: берем номер именно из объекта выборки
        ТекНомер = ДокПодч.НомерДок; 
        Возврат ТекНомер;
    КонецЕсли;
КонецЦикла;

Таким образом, для успешного получения номера подчиненного счета-фактуры в 1С 7.7 достаточно аккуратно использовать механизм выборки подчиненных объектов, не забывая о проверках на запись документа в базу и корректность имен метаданных.

← На главную