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

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

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

Анализируем изменение структуры данных

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

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

Выясняем причину ошибки «Поле объекта не обнаружено»

Рассмотрим типичную ситуацию, описанную в сообщении 12: при копировании типового кода из общего модуля УчетНДС возникает ошибка Поле объекта не обнаружено (НомерОтгрузочногоДокумента). Разберемся, почему это происходит.

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

Шаг 1. Получение данных из табличной части

Посмотрим на пример кода, который позволяет корректно собрать все документы-основания для счета-фактуры. Вместо обращения к шапке, мы выполним запрос к табличной части ДокументыОснования.


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

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

Пока Выборка.Следующий() Цикл
    // Здесь мы можем получить Номер и Дату каждого основания
    НомерОснования = Выборка.Документ.Номер;
    ДатаОснования = Выборка.Документ.Дата;
КонецЦикла;

Шаг 2. Формирование строки «Документ об отгрузке» (строка 5а)

Для реализации требований постановления №534 нам нужно не просто вывести номер, а сформировать строку определенного формата. Проанализируем, как это реализовано в общем модуле УчетНДС. Система использует функцию ДанныеДляПечатиСчетовФактур, которая возвращает структуру со всеми необходимыми полями.

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


// Пример подготовки данных для формирования строки 5а
ДанныеДляПечати = Новый Структура;
ДанныеДляПечати.Вставить("НомерОтгрузочногоДокумента", "");
ДанныеДляПечати.Вставить("ДатаОтгрузочногоДокумента", '00010101');

// Если основание — Реализация товаров и услуг
Если ТипЗнч(ДокументОснование) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
    ДанныеДляПечати.НомерОтгрузочногоДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДокументОснование, "Номер");
    ДанныеДляПечати.ДатаОтгрузочногоДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДокументОснование, "Дата");
КонецЕсли;

Шаг 3. Использование отладки для поиска реквизитов

Как советуют опытные разработчики в сообщении 3, самый быстрый способ понять, какие данные доступны в печатной форме — зайти в режиме отладки в процедуру Печать. Обратите внимание на переменную МассивОбъектов и последующие коллекции, которые заполняются через менеджер документа.

В современных конфигурациях БСП (Библиотека стандартных подсистем) данные для печати подготавливаются в модуле менеджера документа в функции СведенияОПечатнойФорме. Если вы создаете внешнюю печатную форму, рекомендуется не дублировать логику сбора данных, а вызывать экспортные методы модуля менеджера. Это гарантирует, что при обновлении конфигурации ваша форма не «сломается» из-за изменения состава реквизитов.

Практические советы по работе с внешними формами

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

Подведем итог нашему разбору. Для того чтобы успешно вытянуть номер документа-основания во внешнюю форму, мы должны отказаться от использования реквизита шапки в пользу табличной части ДокументыОснования, а при формировании строки 5а — четко следовать структуре имен полей (НомерОтгрузочногоДокумента, ДатаОтгрузочногоДокумента), которую ожидает алгоритм формирования печатной формы.

← На главную