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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке конфигураций и доработке типовых решений 1С часто возникает задача: при создании одного документа на основании другого (например, расходной накладной на основании счета на оплату) необходимо сохранить связь между ними и вывести в печатный макет строку вида «Основание: Счет на оплату №... от ...». Разберем подробно, как правильно организовать хранение ссылки на исходный документ, получить его реквизиты и корректно отформатировать дату и номер для печатной формы.

Шаг 1. Сохранение ссылки на документ-основание при заполнении

Для того чтобы ссылка на исходный документ не терялась после закрытия формы создания, в документе-приемнике необходимо предусмотреть специальный реквизит. Создадим в метаданных документа реквизит с именем ДокументОснование и укажем для него тип ДокументСсылка.Счет (или составной тип, если основанием могут выступать разные документы).

Далее перейдем в модуль объекта создаваемого документа и настроим процедуру ОбработкаЗаполнения. Рассмотрим пример заполнения шапки, табличной части и обязательной фиксации ссылки на основание:


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

Важный момент: Если в документе-источнике содержится большое количество строк в табличных частях, прямое обращение через точку в цикле может замедлить работу. В высоконагруженных базах чтение данных основания рекомендуется выполнять через единый объект Запрос.

Шаг 2. Получение наименования вида документа через метаданные

Чтобы не прописывать название документа жесткой строкой в коде, используем обращение к синониму объекта метаданных. Это обеспечивает гибкость кода при переименовании объектов или изменении синонимов в конфигураторе.

Посмотрим на пример извлечения пользовательского наименования вида документа:


Если ЗначениеЗаполнено(ДокументОснование) Тогда
    ИмяВидаДокумента = ДокументОснование.Метаданные().Синоним;
КонецЕсли;

Шаг 3. Форматирование даты и удаление времени

По умолчанию дата в платформе 1С хранится с точностью до секунды. Если просто преобразовать дату к строке через Строка(Дата), в результат попадет время (например, «26.08.2026 14:35:00»). Для печатных документов время обычно требуется убрать.

Разберем основные способы форматирования даты с помощью функции Формат:

  1. Локальный краткий формат даты: использование параметра "ДЛФ=D" возвращает дату в виде «26.08.2026».
  2. Локальный длинный формат даты: параметр "ДЛФ=DD" формирует строку вида «26 августа 2026 г.».
  3. Пользовательский формат: строка "ДФ='дд ММММ гггг'" позволяет гибко настроить отображение дня, месяца и года.

Посмотрим, как выглядит применение форматирования в коде:


// Краткий вариант даты без времени
ДатаКраткая = Формат(ДокументОснование.Дата, "ДЛФ=D");

// Расширенный вариант с текстовым названием месяца
ДатаПрописью = Формат(ДокументОснование.Дата, "ДФ='дд ММММ гггг'");

Шаг 4. Сборка строки основания для макета печатной формы

Объединим полученные компоненты в готовую текстовую строку для вывода в область макета печатной формы. Перед формированием строки обязательно проверяем, заполнен ли реквизит основания, с помощью функции ЗначениеЗаполнено:


ТекстОснования = "";

Если ЗначениеЗаполнено(ДокументОснование) Тогда
    ВидДокумента = ДокументОснование.Метаданные().Синоним;
    НомерДокумента = СокрЛП(ДокументОснование.Номер);
    ДатаДокумента = Формат(ДокументОснование.Дата, "ДЛФ=D");
    
    ТекстОснования = СтрШаблон("%1 № %2 от %3", ВидДокумента, НомерДокумента, ДатаДокумента);
Иначе
    ТекстОснования = "—";
КонецЕсли;

// Передаем значение в параметр области макета
ОбластьШапка.Параметры.Основание = ТекстОснования;

Оптимизация при печати: получение данных через запрос

При формировании печатных форм для нескольких документов или при интенсивной работе пользователей не следует обращаться к свойствам ДокументОснование.Номер и ДокументОснование.Дата через точку напрямую из выборки. Это приводит к дополнительным неявным обращениям к СУБД.

Проанализируем оптимальный подход: извлекать реквизиты документа-основания и его стандартное строковое представление сразу в основном запросе на печать с помощью функции ПРЕДСТАВЛЕНИЕ или левого соединения с таблицей основания.


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Расходная.Ссылка КАК Ссылка,
    |   Расходная.Номер КАК Номер,
    |   Расходная.Дата КАК Дата,
    |   Расходная.ДокументОснование КАК ДокументОснование,
    |   ПРЕДСТАВЛЕНИЕ(Расходная.ДокументОснование) КАК ОснованиеПредставление
    |ИЗ
    |   Документ.РасходнаяНакладная КАК Расходная
    |ГДЕ
    |   Расходная.Ссылка В(&МассивОбъектов)";

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

Пока Выборка.Следующий() Цикл
    // Выборка.ОснованиеПредставление содержит готовую строку вида "Счет на оплату 0000-000123 от 26.08.2026"
    ОбластьШапка.Параметры.Основание = Выборка.ОснованиеПредставление;
    ТабДокумент.Вывести(ОбластьШапка);
КонецЦикла;

Использование реквизита ссылки в паре с функцией Формат или встроенным представлением платформы обеспечивает быстрый, стабильный и аккуратный вывод сведений об исходном документе в любые печатные макеты.

← На главную