Почему не работает кнопка дозаполнения способов отражения зарплаты в ЗУП?

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

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

Анализ исходного кода и структуры решения

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


&НаКлиенте
Процедура ДополнитьНовымиЗаписями(Команда)
    ДополнитьНовымиЗаписямиНаСервере();
    ЭтаФорма.Элементы.Список.Обновить();
КонецПроцедура

&НаСервере
Процедура ДополнитьНовымиЗаписямиНаСервере()
    // Здесь формируется запрос к документам "Отражение зарплаты в бухучете"
    // и выполняется запись в регистр сведений
КонецПроцедуры

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

Шаг 1: Диагностика выполнения серверного кода

Первым делом проверим, действительно ли код внутри процедуры ДополнитьНовымиЗаписямиНаСервере выполняется до конца. Если база работает в клиент-серверном режиме, обычная точка останова может не сработать, если на сервере 1С не включен режим отладки (параметр -debug). Выясним, доходит ли поток исполнения до формирования запроса, используя простую вставку:

Сообщить("Процедура запущена, дата документа: " + ТекущаяДата());

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

Шаг 2: Проверка запроса в консоли

Основная часть логики заложена в сложном запросе, который объединяет данные из нескольких табличных частей документа ОтражениеЗарплатыВБухучете (НачисленнаяЗарплатаИВзносы, НачисленныйНДФЛ, УдержаннаяЗарплата). Проанализируем ключевой фрагмент соединения:


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

Разберем, что здесь происходит. Программа пытается найти такие комбинации Способа отражения и Вида операции, которых еще нет в регистре сведений. Если соединение не находит запись в регистре, ЕСТЬNULL возвращает ИСТИНА, и строка попадает в результат для добавления.

Возможная ошибка: Если в регистре уже существуют записи с пустыми способами отражения или если виды операций в документах изменились (например, из-за обновлений программы), запрос вернет пустой результат. Для проверки необходимо скопировать текст запроса в Консоль запросов, подставить параметры &ПустойСпособ и &ДатаДокумента и посмотреть, выдает ли он строки. Если консоль пуста — доработка не работает, потому что ей «нечего добавлять».

Шаг 3: Влияние обновлений законодательства (2023-2024 гг.)

Проанализируем используемые в коде значения перечисления ВидыОперацийПоЗарплате. В коде жестко прописаны:

Важный момент: С 2023 года в связи с переходом на Единый налоговый счет и единый тариф страховых взносов, многие из этих видов операций в актуальных документах ЗУП 3.1 больше не используются. Вместо них применяются общие начисления по единому тарифу. Если старая доработка ищет в документах ПФР, а там теперь только ДоходыИсполнителейПоДоговорамГПХ или общие взносы, запрос логично будет пустым.

Шаг 4: Особенности записи набора записей

Если запрос все же возвращает данные, обратим внимание на то, как происходит запись в регистр в цикле:


Для каждого ТекСтрока Из Результат Цикл
    НаборЗаписей = РегистрыСведений.ПорядокОтраженияЗарплатыВБухУчете.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.СпособОтраженияЗарплатыВБухучете.Установить(ТекСтрока.СпособОтраженияЗарплатыВБухучете);
    НаборЗаписей.Отбор.ВидОперации.Установить(ТекСтрока.ВидОперации);
    ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), ТекСтрока);
    НаборЗаписей.Записать();
КонецЦикла;

Рассмотрим подводные камни этого метода:

  1. Отсутствие группировки: В запросе не используется СГРУППИРОВАТЬ или ВЫБРАТЬ РАЗЛИЧНЫЕ. Если в документе 100 строк с одинаковым способом отражения, цикл выполнится 100 раз, перезаписывая одну и ту же запись в регистре. Это не критическая ошибка, но серьезная потеря производительности.
  2. Измерения регистра: Обратите внимание на префикс RARUS_. Это может означать, что регистр не типовой или измененный. Проверьте, нет ли в регистре других обязательных измерений (например, Организация). Если в регистре есть измерение «Организация», а мы его не устанавливаем в отборе и не заполняем, запись может либо не создаться, либо создаться некорректно.
  3. Периодичность: Если регистр сведений является периодическим, необходимо явно устанавливать Период для записи, иначе она может уйти на 01.01.0001 и не отображаться в текущих отчетах.

Рекомендации по исправлению

Чтобы восстановить работу кнопки, выполним следующие действия:

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

← На главную