В процессе разработки механизмов выгрузки данных (например, при формировании XML-файлов для электронного документооборота) часто возникает необходимость найти связанный документ. Типичная задача для платформы 1С 7.7 — получить номер счета-фактуры, который был выписан на основании товарно-транспортной накладной (ТТН) или реализации. Несмотря на то что платформа считается устаревшей, механизмы работы с объектной моделью в ней требуют четкого понимания синтаксиса и логики работы ссылочных связей.
Рассмотрим, как правильно реализовать поиск подчиненного документа, какие методы использовать и на что обратить внимание, чтобы избежать типичных ошибок начинающих разработчиков.
Основным инструментом для решения этой задачи в 1С 7.7 является метод ВыбратьПодчиненныеДокументы. Этот метод позволяет проанализировать дерево связей и найти все объекты, у которых текущий документ указан в качестве «Документа-основания».
Разберем по шагам стандартную функцию поиска. Для начала нам необходимо создать объект типа «Документ», инициализировать выборку и в цикле проверить каждый найденный документ на соответствие нужному нам виду (в нашем случае — «СчетФактураВыданный»).
Пример корректной функции для получения номера счета-фактуры:
Функция ПолучитьНомерПодчиненногоСФ(ДокОснование)
Перем ДокПодч;
// Проверяем, что документ-основание выбран и записан в базе
Если ДокОснование.Выбран() = 0 Тогда
Возврат "";
КонецЕсли;
ДокПодч = СоздатьОбъект("Документ");
// Инициируем выборку подчиненных документов
// Важно: используем ТекущийДокумент() для позиционирования
ДокПодч.ВыбратьПодчиненныеДокументы(, , ДокОснование.ТекущийДокумент());
Пока ДокПодч.ПолучитьДокумент() = 1 Цикл
// Проверяем вид документа. Название должно точно совпадать с конфигуратором
Если ДокПодч.Вид() = "СчетФактураВыданный" Тогда
// Если нашли нужный вид, возвращаем его номер
Возврат ДокПодч.НомерДок;
КонецЕсли;
КонецЦикла;
Возврат ""; // Если ничего не нашли
КонецФункции
Проанализируем ситуацию, когда код кажется верным, но данные не возвращаются или возвращаются некорректно. Существует несколько технических особенностей платформы 1С 7.7, которые необходимо учитывать:
ВыбратьПодчиненныеДокументы работает только с данными, которые физически записаны в таблицы базы данных. Если вы пытаетесь найти подчиненный документ сразу после его создания в коде, но до момента вызова Записать(), выборка будет пустой.ДокОснование.ТекущийДокумент(). Это гарантирует, что система получит актуальный внутренний идентификатор объекта, а не просто контекст формы или пустую ссылку.Если ДокПодч.ПометкаУдаления() = 0 Тогда.СчетФактура, СчетФактураВыданный или ГФ_СчетФактура. Ошибка в одном символе приведет к тому, что условие поиска никогда не выполнится.Если ваша задача — выгрузка большого массива данных (например, тысячи накладных за месяц), использование ВыбратьПодчиненныеДокументы внутри цикла выгрузки может существенно замедлить процесс. Это происходит из-за большого количества обращений к базе данных для каждой итерации.
В таких случаях профессионалы рекомендуют рассмотреть альтернативные варианты:
_1SJOURN и таблицам документов позволяет получить все номера счетов-фактур одним махом.СчетФактура с типом «Документ». При записи счета-фактуры этот реквизит в основании будет заполняться. Тогда получение номера сведется к простой строке: ТТН.СчетФактура.НомерДок, что работает мгновенно.Рассмотрим ситуацию, описанную в обсуждении: программист получает номер текущего документа вместо подчиненного. Это происходит, когда в коде вместо обращения к атрибуту найденного объекта ДокПодч.НомерДок происходит возврат значения из неправильного контекста или ошибочное использование ТекущийДокумент(). Всегда проверяйте, к какому именно объекту вы обращаетесь внутри цикла Пока ... Цикл.
Правильный подход к получению данных внутри цикла:
Пока ДокПодч.ПолучитьДокумент() = 1 Цикл
Если ДокПодч.Вид() = "СчетФактураВыданный" Тогда
// Правильно: берем номер именно из объекта выборки
ТекНомер = ДокПодч.НомерДок;
Возврат ТекНомер;
КонецЕсли;
КонецЦикла;
Таким образом, для успешного получения номера подчиненного счета-фактуры в 1С 7.7 достаточно аккуратно использовать механизм выборки подчиненных объектов, не забывая о проверках на запись документа в базу и корректность имен метаданных.