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