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