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