Почему сбрасываются номенклатурные группы в документе «Расход материалов» и как это исправить?

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

В процессе работы с конфигурациями, базирующимися на 1С:Бухгалтерия предприятия 3.0 (например, «Учет в УК, ТСЖ и ЖСК», «Ломбард» и другие), пользователи часто сталкиваются с неприятной ситуацией: при заполнении документа «Расход материалов» (или «Требование-накладная») настройки счетов затрат и номенклатурные группы отображаются корректно, но сразу после нажатия кнопки «Записать» или «Провести» введенные данные в поле «Номенклатурная группа» бесследно исчезают. Мы проанализируем причины этого поведения и разберем по шагам, как устранить данную проблему техническими средствами.

Разберем причину проблемы: переход на универсальную аналитику

Для начала выясним причину такого странного «поведения» программы. Начиная с релизов 3.0.143.х, фирма «1С» начала глобальный процесс унификации учета затрат. В старых версиях в табличных частях документов (например, в табличной части Материалы) были жестко заданы реквизиты НоменклатурнаяГруппа и СтатьяЗатрат. В новых версиях разработчики перешли к использованию универсальных реквизитов Субконто1, Субконто2, Субконто3.

Это сделано для того, чтобы пользователь мог самостоятельно настраивать состав аналитики на счетах затрат (например, на счете 20.01), не ограничиваясь только типовым набором. Однако для обеспечения обратной совместимости старые реквизиты не были удалены мгновенно. Им был присвоен префикс «Удалить» (например, УдалитьНоменклатурнаяГруппа), а на форму выведены новые поля, связанные с механизмом субконто.

Проанализируем ситуацию: при записи документа срабатывает программный код в модуле объекта, который пытается синхронизировать данные между старыми и новыми полями. Ошибка заключается в том, что в некоторых релизах приоритет отдается пустому значению из поля с префиксом Удалить, которое затирает корректно введенное значение в новом поле субконто.

Проанализируем ситуацию в коде

Если мы заглянем «под капот» документа в конфигураторе, мы увидим, что в табличной части Материалы поле НоменклатурнаяГруппа превратилось в УдалитьНоменклатурнаяГруппа. При этом на форму выведено поле Субконто2 (в зависимости от настроек плана счетов). В процедуре ПередЗаписью или в обработчиках, вызываемых из ПриЗаписи, система выполняет перенос данных. Проблема кроется в логике: программа видит, что старое поле пустое, и считает, что пользователь «очистил» аналитику, после чего транслирует эту пустоту в новое поле Субконто.

Решение проблемы с помощью расширения

Поскольку лезть в типовой код конфигурации крайне не рекомендуется (это затруднит дальнейшие обновления), мы воспользуемся механизмом расширений. Нам необходимо перехватить процедуру, отвечающую за заполнение аналитики, и предотвратить очистку данных.

Рассмотрим алгоритм создания исправления:

  1. Создадим новое расширение конфигурации (или воспользуемся существующим).
  2. Добавим в расширение документ РасходМатериалов.
  3. Найдем в модуле объекта (или в связанном общем модуле, если логика вынесена туда) процедуру, которая отвечает за перенос данных из удаляемых реквизитов в субконто. Обычно это происходит в обработчике ПередЗаписью.
  4. Применим метод &Вместо или &После для корректировки логики.

Посмотрим на пример кода, который может быть использован в расширении для отмены некорректного переноса. Мы должны убедиться, что если в новом поле субконто уже есть данные, старое пустое поле не должно их затирать:


&НаСервере
Процедура ИсправитьСбросНоменклатурнойГруппы(ТекущийОбъект)
    // Проходим по строкам табличной части "Материалы"
    Для Каждого СтрокаТЧ Из ТекущийОбъект.Материалы Цикл
        // Проверяем, если новое субконто заполнено, а старое поле пустое
        // предотвращаем затирание данных при последующих вызовах типовых механизмов
        Если ЗначениеЗаполнено(СтрокаТЧ.Субконто2) И НЕ ЗначениеЗаполнено(СтрокаТЧ.УдалитьНоменклатурнаяГруппа) Тогда
            // Можно принудительно синхронизировать их в обратную сторону 
            // или просто прервать логику очистки в типовом модуле
            СтрокаТЧ.УдалитьНоменклатурнаяГруппа = СтрокаТЧ.Субконто2;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Дополнительные проверки: План счетов и Учетная политика

Иногда сброс настроек может быть связан не только с ошибкой в коде, но и с некорректной настройкой Плана счетов. Выясним, на что стоит обратить внимание:

  1. Откроем План счетов и найдем счет, который используется в документе (например, 20.01 или 26).
  2. Проанализируем состав субконто. По умолчанию для 20-го счета первым идет Номенклатурные группы, вторым — Статьи затрат, третьим — Продукция.
  3. Важно: Если вы вручную меняли порядок субконто в плане счетов, типовые механизмы заполнения форм могут начать работать некорректно, так как они часто «ожидают» определенный индекс (например, что Номенклатурная группа — это всегда Субконто1 или Субконто2).
  4. Убедитесь, что в Учетной политике (раздел «Настройки налогов и отчетов» или «Параметры учета») включено ведение учета затрат по номенклатурным группам. Если эта настройка будет выключена, программа будет автоматически очищать аналитику при записи, считая её избыточной.

Рекомендации по долгосрочному решению

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

  1. Установка патчей: Фирма «1С» регулярно выпускает оперативные исправления (патчи) для типовых конфигураций. Перейдите в раздел Администрирование -> Обслуживание -> Обновление программы -> Установленные исправления. Проверьте наличие патчей с описанием, связанным с очисткой субконто или номенклатурных групп (например, патчи вида EF_6000XXXX).
  2. Очистка кэша: Иногда формы «запоминают» старую структуру реквизитов. Очистите локальный кэш пользователя, чтобы убедиться, что форма документа перестроилась под новую структуру субконто.
  3. Типовые операции (ТиИ): Если проблема сохраняется, выполните Тестирование и исправление базы данных с флагом «Реиндексация таблиц» и «Проверка логической целостности». Это поможет, если в базе возникли несоответствия между физическими таблицами и метаданными.

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

← На главную