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