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