Как лучше реализовать отчет по распределению сотрудников по произвольным (нелинейным) диапазонам начислений в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов в 1С программисты часто сталкиваются с задачей группировки числовых данных по определенным интервалам. Классический пример — распределение сотрудников по размерам заработной платы, где шаги диапазонов нелинейны (например, до 10 000 руб., от 10 000 до 25 000 руб., от 25 000 до 50 000 руб. и так далее). При этом требуется не просто вывести количество сотрудников, попавших в каждый диапазон, но и просуммировать их начисления.

В этой статье мы подробно разберем, как решить эту задачу максимально эффективно. Мы рассмотрим как готовые типовые решения для регламентированной отчетности, так и технические способы реализации собственного отчета на СКД (Схема компоновки данных), если перед вами стоит уникальная внутренняя задача автоматизации.

Важное замечание: проверьте типовой функционал 1С

Перед тем как приступать к разработке собственного отчета «с нуля», важно выяснить происхождение этой задачи. Очень часто подобный запрос поступает от бухгалтерии, когда местный орган статистики (Росстат) запрашивает официальную форму № 1 «Сведения о распределении численности работников по размерам заработной платы» (ОКУД 0606038).

Если это ваш случай, то изобретать велосипед не нужно. Данная форма уже полностью автоматизирована разработчиками фирмы «1С» и присутствует во всех актуальных типовых конфигурациях (1С:ЗУП 3.1, 1С:Бухгалтерия предприятия 3.0, 1С:ЗКГУ 3.1):

  1. Перейдите в рабочее место 1С-Отчетность (раздел «Отчеты» или «Отчетность, справки»).
  2. Нажмите кнопку Создать.
  3. В папке Статистика найдите отчет с наименованием «Статистика: Форма 1».
  4. Выберите нужный период (обычно отчет сдается один раз в два года за апрель) и нажмите Заполнить.

Программа автоматически соберет данные по начислениям, исключит сотрудников, находящихся в декрете, на длительных больничных или работающих по договорам ГПХ (что вручную сделать в запросе СКД крайне сложно), и распределит их по актуальным интервалам Росстата.

Если же перед вами стоит задача разработки уникального управленческого отчета, которого нет в типовом функционале, рассмотрим детально технические сценарии реализации такой логики в 1С.

---

Метод №1. Жесткое прописание диапазонов в запросе СКД

Самый простой и быстрый способ, не требующий создания новых объектов метаданных в конфигурации. Он отлично подходит, если диапазоны фиксированы и гарантированно не изменятся в обозримом будущем. Мы можем сформировать таблицу интервалов прямо «на лету» в тексте запроса.

Рассмотрим пример построения такого запроса с использованием конструкции ОБЪЕДИНИТЬ для формирования временной таблицы интервалов:


ВЫБРАТЬ
    0 КАК НачалоИнтервала,
    9999.99 КАК КонецИнтервала,
    "До 10 000 руб." КАК НазваниеИнтервала
ПОМЕСТИТЬ ВТ_Интервалы

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    10000,
    19999.99,
    "От 10 000 до 20 000 руб."

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    20000,
    49999.99,
    "От 20 000 до 50 000 руб."

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    50000,
    999999999.99,
    "Свыше 50 000 руб."
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Интервалы.НазваниеИнтервала КАК Интервал,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_Начисления.Сотрудник) КАК Численность,
    СУММА(ВТ_Начисления.СуммаНачисления) КАК СуммаНачислено
ИЗ
    ВТ_Интервалы КАК ВТ_Интервалы
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_НачисленияСотрудников КАК ВТ_Начисления
        ПО ВТ_Начисления.СуммаНачисления МЕЖДУ ВТ_Интервалы.НачалоИнтервала И ВТ_Интервалы.КонецИнтервала

СГРУППИРОВАТЬ ПО
    ВТ_Интервалы.НазваниеИнтервала,
    ВТ_Интервалы.НачалоИнтервала

УПОРЯДОЧИТЬ ПО
    ВТ_Интервалы.НачалоИнтервала

Преимущества: Быстрая разработка, не нужно создавать новые справочники или регистры в конфигурации, отчет полностью автономен и может быть сохранен как внешний.

Недостатки: При любом изменении границ интервалов пользователю придется обращаться к программисту для правки схемы компоновки данных.

В качестве альтернативы внутри запроса можно использовать конструкцию ВЫБОР КОГДА, но левое соединение с виртуальной таблицей интервалов (как показано выше) методологически более правильно, так как гарантирует вывод пустых интервалов, в которые не попал ни один сотрудник.

---

Метод №2. Хранение интервалов в Справочнике или Регистре сведений

Если отчет планируется использовать регулярно, а границы интервалов могут меняться (например, вслед за изменением МРОТ или внутренней тарифной сетки предприятия), правильным решением будет вынесение интервалов в пользовательский интерфейс.

Проанализируем два варианта реализации:

  1. Справочник с табличной частью "Интервалы": Создается справочник (например, НастройкиИнтерваловОтчетов). В табличной части указываются реквизиты: НачалоИнтервала (Число), КонецИнтервала (Число) и Представление (Строка). Пользователь может создать несколько элементов справочника для разных типов отчетов (например, «Интервалы для рабочих», «Интервалы для ИТР»).
  2. Регистр сведений: Создается непериодический регистр сведений ШкалаИнтерваловЗаработнойПлаты с измерениями НачалоИнтервала и ресурсом КонецИнтервала. Преимущество регистра в том, что его структуру проще использовать в физических соединениях запросов.

Посмотрим на пример запроса, который выбирает интервалы из созданного нами справочника настройки:


ВЫБРАТЬ
    Интервалы.НачалоИнтервала КАК НачалоИнтервала,
    Интервалы.КонецИнтервала КАК КонецИнтервала,
    Интервалы.Представление КАК Представление
ПОМЕСТИТЬ ВТ_Интервалы
ИЗ
    Справочник.НастройкиИнтерваловОтчетов.Интервалы КАК Интервалы
ГДЕ
    Интервалы.Ссылка = &СсылкаНаНастройку
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Интервалы.Представление КАК Интервал,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Начисления.Сотрудник) КАК КоличествоСотрудников,
    СУММА(Начисления.Сумма) КАК СуммаНачислений
ИЗ
    ВТ_Интервалы КАК ВТ_Интервалы
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.НачисленияУдержанияПоСотрудникам.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Начисления
        ПО Начисления.СуммаОборот МЕЖДУ ВТ_Интервалы.НачалоИнтервала И ВТ_Интервалы.КонецИнтервала

СГРУППИРОВАТЬ ПО
    ВТ_Интервалы.Представление,
    ВТ_Интервалы.НачалоИнтервала

УПОРЯДОЧИТЬ ПО
    ВТ_Интервалы.НачалоИнтервала

Преимущества: Полная свобода действий для конечного пользователя. Бухгалтер или экономист могут самостоятельно зайти в справочник, изменить границы или добавить новый интервал, не прибегая к помощи программиста.

Недостатки: Требуется вносить изменения в структуру метаданных конфигурации, что усложняет последующее обновление, если конфигурация находится на поддержке без возможности изменений.

---

Метод №3. Динамическая загрузка интервалов из макета (Набор данных - Объект СКД)

Представим красивое компромиссное решение, которое позволяет избежать изменения метаданных конфигурации, но при этом предоставляет удобный способ хранения интервалов без жесткого кодирования в запросе. Мы можем использовать встроенный табличный документ (Макет) внутри внешнего отчета.

Разберем по шагам, как это реализовать:

  1. В схеме компоновки данных (СКД) создайте два набора данных:
    • Набор данных - запрос (выбирает начисления сотрудников из базы данных).
    • Набор данных - объект (получит готовую таблицу интервалов из кода). Назовем его, например, ТаблицаИнтервалов. В описании полей набора данных добавьте вручную поля: НачалоИнтервала (Число), КонецИнтервала (Число), Название (Строка).
  2. Свяжите эти наборы данных на вкладке Связи наборов данных по условию попадания суммы начислений в интервал (в качестве выражения связи используйте условие СуммаНачислений >= НачалоИнтервала И СуммаНачислений <= КонецИнтервала).
  3. Создайте в отчете макет (Табличный документ) с именем МакетИнтервалов, в котором заполните простую таблицу с колонками «Начало», «Конец» и «Название». Пользователь сможет сам редактировать этот макет в режиме Конфигуратора (или вы можете дать возможность выгружать/загружать его в режиме Предприятия).
  4. В модуле объекта отчета, в процедуре ПриКомпоновкеРезультата, напишите код, который считывает данные из макета в Таблицу Значений и передает ее в процессор компоновки данных.

Посмотрим на пример программного кода в модуле объекта отчета:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // 1. Получаем макет с интервалами
    Макет = ПолучитьМакет("МакетИнтервалов");
    
    // 2. Создаем и заполняем Таблицу Значений структуры интервалов
    ТЗ_Интервалы = Новый ТаблицаЗначений;
    ТЗ_Интервалы.Колонки.Добавить("НачалоИнтервала", Новый ОписаниеТипов("Число"));
    ТЗ_Интервалы.Колонки.Добавить("КонецИнтервала",  Новый ОписаниеТипов("Число"));
    ТЗ_Interвалы.Колонки.Добавить("Название",         Новый ОписаниеТипов("Строка"));
    
    // Обходим строки табличного документа макета (начиная со 2-й строки, где начинаются данные)
    Для НомерСтроки = 2 По Макет.ВысотаТаблицы Цикл
        НоваяСтрока = ТЗ_Интервалы.Добавить();
        НоваяСтрока.НачалоИнтервала = Макет.Область(НомерСтроки, 1).Текст;
        НоваяСтрока.КонецИнтервала  = Макет.Область(НомерСтроки, 2).Текст;
        НоваяСтрока.Название         = Макет.Область(НомерСтроки, 3).Текст;
    КонецЦикла;
    
    // 3. Передаем таблицу в СКД через внешние наборы данных
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("ТаблицаИнтервалов", ТЗ_Интервалы);
    
    // 4. Инициализируем компоновку
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Преимущества: Отличный баланс между гибкостью и простотой поддержки. База данных не засоряется лишними объектами метаданных, а сам отчет остается переносимым (внешним файлом .erf), при этом изменить интервалы в макете сможет любой продвинутый пользователь.

---

Подводные камни методологии: на что обратить внимание при расчете начислений

Если вы все же пишете отчет самостоятельно, обязательно учитывайте методологические особенности расчета численности и сумм. Простая выборка оборотов по регистру расчета или накопления за месяц может исказить итоговые показатели для проверяющих органов:

Резюме: Для сдачи официальной отчетности в органы Росстата всегда используйте встроенный функционал 1С-Отчетности. Для построения внутренних гибких аналитических отчетов на СКД используйте метод динамической загрузки интервалов из макета или реализуйте справочник настроек, чтобы избавить себя от регулярной рутины по переписыванию кода при очередном изменении тарифных ставок.

← На главную