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