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