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