При работе с типовыми конфигурациями 1С, такими как Бухгалтерия предприятия 3.0, часто возникает необходимость кастомизации печатных форм. Одной из популярных задач является вывод дополнительных идентификаторов, таких как БИН (Бизнес-идентификационный номер, актуально для Казахстана) или Налоговый номер в стране регистрации (для иностранных контрагентов), в универсальный передаточный документ (УПД). Просто добавить ячейку в макет недостаточно — необходимо программно передать данные в эту ячейку. В этой статье мы подробно разберем, как реализовать этот механизм, проанализируем ошибки новичков и найдем оптимальное решение.
Рассмотрим типичную ситуацию: вы открыли конфигуратор, нашли макет УПД, добавили новую строку и создали в ней ячейку с типом Параметр, назвав её НалоговыйНомер. Однако при печати документа ячейка остается пустой или программа выдает ошибку: Поле объекта не обнаружено (НалоговыйНомер). Выясним причину: печатная форма в 1С формируется программно. Общий модуль собирает данные из документа и справочников в специальную структуру (шапку), а затем поочередно заполняет параметры макета. Если в коде не прописана передача значения именно для вашего нового параметра, 1С просто "не знает", что туда нужно что-то записывать.
Для начала нам нужно найти место, где формируются данные для печати. В типовой БП 3.0 за это отвечает общий модуль УчетНДС. Нам необходимо расширить структуру ДанныеШапки, чтобы она включала нужный нам реквизит. Разберем по шагам, как это сделать в функции ПодготовитьДанныеШапкиСчетаФактуры1137.
Проанализируем ситуацию: нам нужно получить налоговый номер покупателя. Для этого мы обратимся к сведениям о контрагенте. В коде это будет выглядеть следующим образом:
// В функции ПодготовитьДанныеШапкиСчетаФактуры1137
// Находим раздел, где формируются сведения о покупателе
ДанныеШапки.Вставить("НалоговыйНомерВСтранеРегистрации",
ОбщегоНазначенияБПВызовСервера.ОписаниеОрганизации(СведенияОПокупателе, "НалоговыйНомерВСтранеРегистрации, "));
Важный момент: Мы используем встроенную функцию ОписаниеОрганизации, которая умеет корректно извлекать реквизиты из структуры сведений. Если вы работаете с локализацией для Казахстана, вместо НалоговыйНомерВСтранеРегистрации может использоваться реквизит БИН.
Теперь, когда данные попали в структуру ДанныеШапки, их нужно передать непосредственно в область макета. Это происходит в процедуре ВывестиСчетФактуруВТабличныйДокумент. Найдем раздел, отвечающий за заполнение параметров шапки, и добавим нашу строку.
Рассмотрим пример кода:
// В процедуре ВывестиСчетФактуруВТабличныйДокумент
// В блоке заполнения параметров области макета
ОбластьМакета.Параметры.НалоговыйНомер = "БИН: " + ДанныеШапки.НалоговыйНомерВСтранеРегистрации;
Обратите внимание, что имя параметра ОбластьМакета.Параметры.НалоговыйНомер должно строго совпадать с именем параметра, которое вы указали в свойствах ячейки в редакторе макета. Если в макете параметр называется БИН_Покупателя, то и в коде должно быть ОбластьМакета.Параметры.БИН_Покупателя.
Редактирование типового общего модуля напрямую (как в примере выше) приведет к трудностям при обновлении программы. Рассмотрим более профессиональный метод — использование расширений конфигурации. Это позволит сохранить изменения при обновлении типовой конфигурации.
УчетНДС.&После для процедуры ПодготовитьДанныеШапкиСчетаФактуры1137.Пример кода для расширения:
&После("ПодготовитьДанныеШапкиСчетаФактуры1137")
Процедура Расш1_ПодготовитьДанныеШапкиСчетаФактуры1137(ВыборкаСФ, Реквизиты, ПлатежноРасчетныеДокументы, ДополнитьДаннымиУПД, ДанныеШапки)
// Получаем ссылку на покупателя из выборки
ПокупательСсылка = ВыборкаСФ.Покупатель;
// Получаем БИН напрямую из справочника Контрагенты
БИН_Значение = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПокупательСсылка, "НалоговыйНомер");
// Добавляем в структуру, если значение заполнено
Если ЗначениеЗаполнено(БИН_Значение) Тогда
ДанныеШапки.Вставить("МойДополнительныйБИН", БИН_Значение);
КонецЕсли;
КонецПроцедуры
Хорошим тоном в разработке на 1С считается проверка данных перед выводом. Если у контрагента не заполнен БИН, выводить пустую строку с префиксом "БИН: " будет некрасиво. Проанализируем, как сделать вывод более изящным:
Если ЗначениеЗаполнено(ДанныеШапки.НалоговыйНомерВСтранеРегистрации) Тогда
ОбластьМакета.Параметры.НалоговыйНомер = "БИН: " + ДанныеШапки.НалоговыйНомерВСтранеReg;
Иначе
// Если номера нет, можно либо скрыть параметр, либо оставить пустым
ОбластьМакета.Параметры.НалоговыйНомер = "";
КонецЕсли;
Разберем основные ошибки, с которыми сталкиваются пользователи при попытке решить эту задачу:
Параметр. Если оставить Текст, 1С воспримет написанное как обычную строку и не будет пытаться подставить туда значение из кода.Справочники.Контрагенты напрямую в процедуре печати без ссылки на конкретный объект. Всегда нужно сначала получить ссылку на контрагента из ВыборкаСФ или ДанныеШапки.Следование этим инструкциям позволит вам корректно и безопасно модифицировать печатные формы, обеспечивая соответствие документов законодательным требованиям вашей страны или внутренним стандартам организации.