При разработке конфигураций и доработке типовых решений 1С часто возникает задача: при создании одного документа на основании другого (например, расходной накладной на основании счета на оплату) необходимо сохранить связь между ними и вывести в печатный макет строку вида «Основание: Счет на оплату №... от ...». Разберем подробно, как правильно организовать хранение ссылки на исходный документ, получить его реквизиты и корректно отформатировать дату и номер для печатной формы.
Для того чтобы ссылка на исходный документ не терялась после закрытия формы создания, в документе-приемнике необходимо предусмотреть специальный реквизит. Создадим в метаданных документа реквизит с именем ДокументОснование и укажем для него тип ДокументСсылка.Счет (или составной тип, если основанием могут выступать разные документы).
Далее перейдем в модуль объекта создаваемого документа и настроим процедуру ОбработкаЗаполнения. Рассмотрим пример заполнения шапки, табличной части и обязательной фиксации ссылки на основание:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Счет") Тогда
// Фиксируем ссылку на документ-основание
ДокументОснование = ДанныеЗаполнения;
// Заполняем реквизиты шапки
Валюта = ДанныеЗаполнения.Валюта;
Договор = ДанныеЗаполнения.Договор;
Контрагент = ДанныеЗаполнения.Контрагент;
КонтрагентПолноеИмя = ДанныеЗаполнения.КонтрагентПолноеИмя;
Примечание = ДанныеЗаполнения.Примечание;
Склад = ДанныеЗаполнения.Склад;
// Переносим строки табличной части
Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
НоваяСтрока.ЕдИзм = ТекСтрокаТовары.ЕдИзм;
НоваяСтрока.Цена = ТекСтрокаТовары.ЦенаРозничная;
НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
НоваяСтрока.НаименованиеДляПечати = ТекСтрокаТовары.НаименованиеДляПечати;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Важный момент: Если в документе-источнике содержится большое количество строк в табличных частях, прямое обращение через точку в цикле может замедлить работу. В высоконагруженных базах чтение данных основания рекомендуется выполнять через единый объект Запрос.
Чтобы не прописывать название документа жесткой строкой в коде, используем обращение к синониму объекта метаданных. Это обеспечивает гибкость кода при переименовании объектов или изменении синонимов в конфигураторе.
Посмотрим на пример извлечения пользовательского наименования вида документа:
Если ЗначениеЗаполнено(ДокументОснование) Тогда
ИмяВидаДокумента = ДокументОснование.Метаданные().Синоним;
КонецЕсли;
По умолчанию дата в платформе 1С хранится с точностью до секунды. Если просто преобразовать дату к строке через Строка(Дата), в результат попадет время (например, «26.08.2026 14:35:00»). Для печатных документов время обычно требуется убрать.
Разберем основные способы форматирования даты с помощью функции Формат:
"ДЛФ=D" возвращает дату в виде «26.08.2026»."ДЛФ=DD" формирует строку вида «26 августа 2026 г.»."ДФ='дд ММММ гггг'" позволяет гибко настроить отображение дня, месяца и года.Посмотрим, как выглядит применение форматирования в коде:
// Краткий вариант даты без времени
ДатаКраткая = Формат(ДокументОснование.Дата, "ДЛФ=D");
// Расширенный вариант с текстовым названием месяца
ДатаПрописью = Формат(ДокументОснование.Дата, "ДФ='дд ММММ гггг'");
Объединим полученные компоненты в готовую текстовую строку для вывода в область макета печатной формы. Перед формированием строки обязательно проверяем, заполнен ли реквизит основания, с помощью функции ЗначениеЗаполнено:
ТекстОснования = "";
Если ЗначениеЗаполнено(ДокументОснование) Тогда
ВидДокумента = ДокументОснование.Метаданные().Синоним;
НомерДокумента = СокрЛП(ДокументОснование.Номер);
ДатаДокумента = Формат(ДокументОснование.Дата, "ДЛФ=D");
ТекстОснования = СтрШаблон("%1 № %2 от %3", ВидДокумента, НомерДокумента, ДатаДокумента);
Иначе
ТекстОснования = "—";
КонецЕсли;
// Передаем значение в параметр области макета
ОбластьШапка.Параметры.Основание = ТекстОснования;
При формировании печатных форм для нескольких документов или при интенсивной работе пользователей не следует обращаться к свойствам ДокументОснование.Номер и ДокументОснование.Дата через точку напрямую из выборки. Это приводит к дополнительным неявным обращениям к СУБД.
Проанализируем оптимальный подход: извлекать реквизиты документа-основания и его стандартное строковое представление сразу в основном запросе на печать с помощью функции ПРЕДСТАВЛЕНИЕ или левого соединения с таблицей основания.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Расходная.Ссылка КАК Ссылка,
| Расходная.Номер КАК Номер,
| Расходная.Дата КАК Дата,
| Расходная.ДокументОснование КАК ДокументОснование,
| ПРЕДСТАВЛЕНИЕ(Расходная.ДокументОснование) КАК ОснованиеПредставление
|ИЗ
| Документ.РасходнаяНакладная КАК Расходная
|ГДЕ
| Расходная.Ссылка В(&МассивОбъектов)";
Запрос.УстановитьПараметр("МассивОбъектов", МассивДокументов);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Выборка.ОснованиеПредставление содержит готовую строку вида "Счет на оплату 0000-000123 от 26.08.2026"
ОбластьШапка.Параметры.Основание = Выборка.ОснованиеПредставление;
ТабДокумент.Вывести(ОбластьШапка);
КонецЦикла;
Использование реквизита ссылки в паре с функцией Формат или встроенным представлением платформы обеспечивает быстрый, стабильный и аккуратный вывод сведений об исходном документе в любые печатные макеты.