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