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