Как программно изменить счета учета в проводках документа «Передача материалов в эксплуатацию» в 1С:Бухгалтерия 3.0?

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

В процессе работы с конфигурацией 1С:Бухгалтерия предприятие 3.0 (БП 3.0) часто возникает необходимость кастомизировать стандартные алгоритмы проведения документов. Одной из типичных задач является изменение счета забалансового учета при передаче ТМЦ в эксплуатацию. Например, когда для определенной категории номенклатуры (допустим, «Шины») вместо стандартного счета МЦ.04 (Инвентарь и хозяйственные принадлежности в эксплуатации) необходимо использовать счет МЦ.05 (Спецоснастка в эксплуатации).

В этой статье мы подробно разберем, как найти нужное место в коде, какие процедуры отвечают за формирование движений и как правильно внедрить свои условия, сохранив при этом работоспособность типовых механизмов.

Анализ структуры проведения документа в БП 3.0

В отличие от старых редакций (например, БП 2.0), в Бухгалтерии 3.0 логика проведения сильно вынесена в общие модули. Рассмотрим процедуру ОбработкаПроведения в модуле объекта документа ПередачаМатериаловВЭксплуатацию. Проанализируем основные этапы ее работы:

  1. Подготовка наборов записей к проведению.
  2. Подготовка параметров и таблиц списания (раздельно для спецодежды, спецоснастки и инвентаря).
  3. Вызов функций формирования движений из специализированных общих модулей.

Как мы видим из кода документа, за инвентарь отвечают следующие вызовы:


// Инвентарь и хозяйственные принадлежности
УчетТоваров.СформироватьДвиженияСписаниеТоваров(
    ТаблицаСписанныйИнвентарь, ПараметрыПроведения.СписаниеИнвентаряРеквизиты, Движения, Отказ);

УчетМатериаловВЭксплуатации.СформироватьДвиженияПередачаИнвентаряВЭксплуатацию(
    ПараметрыПроведения.ПередачаИнвентаряТаблица, ТаблицаСписанныйИнвентарь, ПараметрыПроведения.ПередачаИнвентаряРеквизиты, Движения, Отказ);

Для решения нашей задачи необходимо внести изменения в алгоритмы формирования проводок внутри этих модулей.

Решение 1: Изменение счета в общем модуле «УчетТоваров»

Проанализируем процедуру СформироватьДвиженияСписаниеТоваров в общем модуле УчетТоваров. Здесь происходит цикл по таблице списанных товаров и формируются проводки регистра бухгалтерии Хозрасчетный.

Найдем в цикле место, где заполняется счет дебета (СчетДт). Обычно это выглядит так:


Для каждого СтрокаПартии Из Параметры.ТаблицаСписанныеТовары Цикл
    Проводка = Движения.Хозрасчетный.Добавить;
    // ... заполнение основных реквизитов ...
    Проводка.СчетДт = СтрокаПартии.КорСчетСписания; 
    // Именно здесь мы можем вставить свое условие
КонецЦикла;

Чтобы заменить счет для шин, мы добавим проверку номенклатуры. Рассмотрим пример реализации:


Для каждого СтрокаПартии Из Параметры.ТаблицаСписанныеТовары Цикл
    Проводка = Движения.Хозрасчетный.Добавить;
    // ...
    // Наша вставка:
    Если СтрокаПартии.Номенклатура.Наименование = "Шины" Тогда // Лучше искать по ссылке или доп. реквизиту
        Проводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("МЦ.05");
    Иначе
        Проводка.СчетДт = СтрокаПартии.КорСчетСписания;
    КонецЕсли;
    // ...
КонецЦикла;

Важный нюанс: счета группы МЦ являются забалансовыми. Если вы меняете балансовый счет на забалансовый в середине алгоритма, программа может выдать ошибку из-за несовпадения признака «забалансовый» у счета дебета и кредита. Всегда проверяйте свойства счетов через БухгалтерскийУчетВызовСервераПовтИсп.ПолучитьСвойстваСчета.

Решение 2: Использование механизма «Дополнительных реквизитов»

Хардкодинг (использование конкретных строк типа "Шины") в коде — это плохая практика. Разберем более элегантный способ, основанный на опыте перехода с БП 2.0. Мы можем создать дополнительный реквизит для номенклатуры (например, булево «УчетНаМЦ05») и проверять его в коде.

В БП 3.0 работа с дополнительными свойствами реализована иначе, чем в 2.0. Проанализируем пример кода для проверки свойства:


// Определяем, нужно ли использовать спецсчет для данной номенклатуры
ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(СтрокаПартии.Номенклатура, "УчетМЦ05");
Если ЗначениеЗаполнено(ЗначениеСвойства) И ЗначениеСвойства = Истина Тогда
    Проводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("МЦ.05");
    Проводка.Содержание = "Передача шин в эксплуатацию";
КонецЕсли;

Решение 3: Пост-обработка движений в «ОбработкеПроведения»

Если вы не хотите менять общие модули (так как это затронет все документы в системе), можно реализовать корректировку проводок непосредственно в модуле объекта документа ПередачаМатериаловВЭксплуатацию в самом конце процедуры ОбработкаПроведения.

Разберем этот метод по шагам:

  1. Дожидаемся, пока типовые механизмы сформируют все движения.
  2. Выгружаем движения в таблицу значений.
  3. Проходим по таблице циклом и меняем нужные счета.
  4. Загружаем таблицу обратно в движения.

Пример программной реализации:


// Вставляем этот код в конец процедуры ОбработкаПроведения
ТаблицаДвижений = Движения.Хозрасчетный.Выгрузить();

Для каждого СтрокаДвижения Из ТаблицаДвижений Цикл
    // Проверяем, что это проводка по МЦ.04 и номенклатура - шины
    Если СтрокаДвижения.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("МЦ.04") Тогда
        // Проверяем субконто (на забалансовых счетах МЦ субконто1 обычно Номенклатура)
        Если ТипЗнч(СтрокаДвижения.СубконтоДт1) = Тип("СправочникСсылка.Номенклатура") 
            И СтрокаДвижения.СубконтоДт1.Наименование ПОДОБНО "%Шины%" Тогда
            
            СтрокаДвижения.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("МЦ.05");
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Движения.Хозрасчетный.Загрузить(ТаблицаДвижений);
Движения.Хозрасчетный.Записывать = Истина;

Рекомендации по безопасному внедрению изменений

При работе в 1С:Бухгалтерия 3.0 крайне важно соблюдать следующие правила, чтобы не возникло проблем при обновлении конфигурации:

Выясним причину, почему в вашем случае может не работать стандартный подбор: скорее всего, номенклатура «Шины» заведена в группе «Инвентарь», для которой по умолчанию настроена категория эксплуатации со счетом МЦ.04. Проверьте этот момент перед тем, как менять программный код.

← На главную