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