При разработке внешних печатных форм для конфигурации 1С:Бухгалтерия 3.0 разработчики часто сталкиваются с проблемой, когда привычный реквизит ДокументОснование в шапке счета-фактуры оказывается пустым или его недостаточно для корректного заполнения формы. Особенно остро этот вопрос встал после введения постановления №534, требующего заполнения строки 5а «Документ об отгрузке». Разберем подробно, почему старые методы не работают и как правильно получить данные из современных редакций программы.
Проанализируем ситуацию: раньше в документе СчетФактураВыданный действительно использовался один реквизит в шапке. Однако в актуальных версиях 1С:Бухгалтерия реализована возможность выставления одного счета-фактуры на основании нескольких документов реализации. В связи с этим архитектура хранения данных изменилась.
Теперь основным источником сведений является табличная часть ДокументыОснования. Реквизит в шапке может сохраняться для обратной совместимости («рудимент»), но система при печати обращается именно к табличной части. Если вы пытаетесь «достучаться» до номера основания через Ссылка.ДокументОснование.Номер, вы рискуете получить пустое значение или неполные данные, если реализаций было несколько.
Рассмотрим типичную ситуацию, описанную в сообщении 12: при копировании типового кода из общего модуля УчетНДС возникает ошибка Поле объекта не обнаружено (НомерОтгрузочногоДокумента). Разберемся, почему это происходит.
В типовом механизме печать счета-фактуры — это сложный процесс, где данные сначала собираются запросом в таблицу значений или массив структур, а затем передаются в процедуру формирования области. Ошибка возникает из-за того, что в вашей внешней обработке в переменной ТаблицаДокумента отсутствует колонка с нужным именем. Типовой запрос 1С динамически подставляет псевдонимы полей (например, Номер превращается в НомерОтгрузочногоДокумента), и если ваш запрос во внешней форме этого не делает, код «падает».
Посмотрим на пример кода, который позволяет корректно собрать все документы-основания для счета-фактуры. Вместо обращения к шапке, мы выполним запрос к табличной части ДокументыОснования.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СФДокументыОснования.ДокументОснование КАК Документ
|ИЗ
| Документ.СчетФактураВыданный.ДокументыОснования КАК СФДокументыОснования
|ГДЕ
| СФДокументыОснования.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Здесь мы можем получить Номер и Дату каждого основания
НомерОснования = Выборка.Документ.Номер;
ДатаОснования = Выборка.Документ.Дата;
КонецЦикла;
Для реализации требований постановления №534 нам нужно не просто вывести номер, а сформировать строку определенного формата. Проанализируем, как это реализовано в общем модуле УчетНДС. Система использует функцию ДанныеДляПечатиСчетовФактур, которая возвращает структуру со всеми необходимыми полями.
Чтобы исправить ошибку, о которой шла речь выше, нам необходимо убедиться, что в структуру данных для печати добавлены соответствующие поля. Рассмотрим, как подготовить данные программно:
// Пример подготовки данных для формирования строки 5а
ДанныеДляПечати = Новый Структура;
ДанныеДляПечати.Вставить("НомерОтгрузочногоДокумента", "");
ДанныеДляПечати.Вставить("ДатаОтгрузочногоДокумента", '00010101');
// Если основание — Реализация товаров и услуг
Если ТипЗнч(ДокументОснование) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
ДанныеДляПечати.НомерОтгрузочногоДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДокументОснование, "Номер");
ДанныеДляПечати.ДатаОтгрузочногоДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДокументОснование, "Дата");
КонецЕсли;
Как советуют опытные разработчики в сообщении 3, самый быстрый способ понять, какие данные доступны в печатной форме — зайти в режиме отладки в процедуру Печать. Обратите внимание на переменную МассивОбъектов и последующие коллекции, которые заполняются через менеджер документа.
В современных конфигурациях БСП (Библиотека стандартных подсистем) данные для печати подготавливаются в модуле менеджера документа в функции СведенияОПечатнойФорме. Если вы создаете внешнюю печатную форму, рекомендуется не дублировать логику сбора данных, а вызывать экспортные методы модуля менеджера. Это гарантирует, что при обновлении конфигурации ваша форма не «сломается» из-за изменения состава реквизитов.
Ссылка.Документ.Номер), используйте ОбщегоНазначения.ЗначениеРеквизитаОбъекта(). Это предотвратит ошибки прав доступа и обеспечит более стабильную работу кода.Корректировка -> Счет-Фактура -> Реализация.Подведем итог нашему разбору. Для того чтобы успешно вытянуть номер документа-основания во внешнюю форму, мы должны отказаться от использования реквизита шапки в пользу табличной части ДокументыОснования, а при формировании строки 5а — четко следовать структуре имен полей (НомерОтгрузочногоДокумента, ДатаОтгрузочногоДокумента), которую ожидает алгоритм формирования печатной формы.