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