Как правильно получить суммы к выплате из документа «Ведомость на выплату зарплаты в банк» в ЗУП 3.1?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Бухгалтерский учет
← На главную

При разработке внешних печатных форм, отчетов или механизмов выгрузки данных в банковские реестры программисты часто сталкиваются с особенностью хранения данных в документе ВедомостьНаВыплатуЗарплатыВБанк в конфигурации «Зарплата и управление персоналом 3.1». Основная сложность заключается в том, что в табличной части Зарплата сумма «К выплате» по одному и тому же сотруднику может разбиваться на несколько строк, причем некоторые из них могут быть отрицательными.

В этой статье мы подробно разберем внутреннюю структуру хранения данных, выясним причины такого «дублирования» и научимся правильно извлекать итоговые суммы с помощью запросов.

Анализ структуры табличной части «Зарплата»

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

  1. Документ-основание: Конкретный документ начисления (например, НачислениеЗарплаты, Отпуск, Премия), задолженность по которому мы погашаем этой ведомостью.
  2. Период взаиморасчетов: Месяц, за который производится выплата.
  3. Статья финансирования и Статья расходов: Актуально для организаций с раздельным учетом (бюджет/внебюджет).
  4. Подразделение: Место работы сотрудника на момент начисления.

Проанализируем ситуацию с «плюсами» и «минусами». Если сотруднику был начислен аванс в размере 20 000 рублей, но по итогам месяца его фактический заработок составил 18 000 рублей, в итоговой ведомости система может сформировать две строки: одну с положительной суммой (начисление текущего месяца) и одну с отрицательной (сторно излишне выплаченного аванса). В экранной форме документа эти строки визуально сворачиваются в одну, но в табличной части они хранятся обособленно.

Способ 1: Получение сумм через запрос к табличной части документа

Если нам необходимо получить суммы именно в том виде, в котором они зафиксированы в конкретном документе, мы должны использовать запрос к табличной части Зарплата. Главное правило здесь — обязательная группировка по физическому лицу и фильтрация по ссылке на конкретную ведомость.

Разберем пример правильного запроса:


ВЫБРАТЬ
    ВедомостьЗарплата.ФизическоеЛицо КАК ФизическоеЛицо,
    СУММА(ВедомостьЗарплата.КВыплате) КАК СуммаКПеречислению
ИЗ
    Документ.ВедомостьНаВыплатуЗарплатыВБанк.Зарплата КАК ВедомостьЗарплата
ГДЕ
    ВедомостьЗарплата.Ссылка = &СсылкаНаДокумент
ГРУППИРОВАТЬ ПО
    ВедомостьЗарплата.ФизическоеЛицо

В данном примере мы используем агрегатную функцию СУММА для колонки КВыплате. Это позволяет математически сложить все положительные и отрицательные строки, получив итоговый результат «на руки» для каждого физического лица.

Анализ типичных ошибок программистов

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


// ОШИБОЧНЫЙ ПРИМЕР
Запрос.Текст = "ВЫБРАТЬ
               |    ВедомостьЗарплата.КВыплате КАК Сумма
               |ИЗ
               |    Документ.ВедомостьНаВыплатуЗарплатыВБанк.Зарплата КАК ВедомостьЗарплата
               |ГДЕ
               |    ВедомостьЗарплата.ФизическоеЛицо = &Физлицо";

Выясним причину, почему этот код не работает корректно: без условия ГДЕ ВедомостьЗарплата.Ссылка = &Ссылка запрос соберет все строки из всех ведомостей, когда-либо созданных для этого человека в базе данных. В результате вы получите огромную сумму за все годы работы сотрудника, а не данные текущего документа.

Способ 2: Использование регистра накопления «Зарплата к выплате»

Выясним, как получить данные более «методически верным» способом. Профессиональная разработка в 1С подразумевает получение данных из регистров накопления, так как именно в них фиксируются фактические движения, влияющие на баланс взаиморасчетов. Документ ведомости делает записи в регистр ЗарплатаКВыплате.

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


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

Обратите внимание, что в регистре накопления поле Регистратор соответствует ссылке на наш документ. Данный подход гарантирует, что вы получите ровно те цифры, которые «ушли» в бухгалтерский и управленческий учет.

Нюансы с выплаченностью зарплаты

Проанализируем еще один важный момент. В ЗУП 3.1 ведомость может иметь различный статус выплаты. Существует поле ВыплаченностьЗарплаты. Если ваша задача — выгрузить реестр в банк, убедитесь, что вы берете строки, которые не помечены как «Отложено» или «Не выплачено» (если логика вашей доработки это предполагает). В типовой конфигурации в ТЧ Зарплата суммы обычно попадают только те, что предназначены к выплате, но при работе с регистрами стоит обращать внимание на вид движения (Расход).

Подведение итогов

Для получения корректных сумм из ВедомостьНаВыплатуЗарплатыВБанк всегда придерживайтесь следующих правил:

  1. Никогда не берите данные простым перебором (циклом Для каждого) строк табличной части без ручной группировки в коде, так как вы столкнетесь с дублями физлиц.
  2. Используйте запросы с группировкой по ФизическоеЛицо и суммированием КВыплате.
  3. Всегда устанавливайте фильтр по Ссылке на конкретный документ-объект.
  4. Если требуется высокая точность и соответствие учетным данным (например, для проверки остатков задолженности), используйте запрос к регистру накопления ЗарплатаКВыплате по регистратору.

Таким образом, понимание того, что ведомость — это всего лишь «агрегатор» различных задолженностей и начислений, позволяет легко и правильно извлекать данные для любых нужд автоматизации.

← На главную