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