Как правильно списывать материалы с разных забалансовых счетов в 1С:Бухгалтерии 3.0?

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

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

Анализ проблемы: почему запрос в «ГДЕ» не работает

Часто программисты пытаются использовать конструкцию ВЫБОР внутри секции ГДЕ или в условиях соединения виртуальной таблицы Хозрасчетный.Остатки. Однако, это архитектурно неверный подход. Система 1С:Предприятие ожидает получить конкретный список счетов до выполнения запроса, так как структура виртуальных таблиц жестко типизирована. Попытка подменить счет внутри запроса приводит к ошибкам вида «Операция не разрешена в предложении ГДЕ» или к неверной обработке остатков.

Решение: предобработка данных перед проведением

Самый надежный способ решить эту задачу — выполнить подмену счета СчетМЦ непосредственно в табличной части документа или во вспомогательной таблице данных до того, как будет вызван основной запрос проверки остатков. Давайте разберем этот процесс по шагам.

  1. Найдем процедуру СформироватьДвиженияСписаниеИнвентаряИзЭксплуатации в модуле УчетМатериаловВЭксплуатации.
  2. Перед вызовом функции ПодготовитьТаблицуСписанныйИзЭксплуатацииИнвентарь добавим блок анализа нашей номенклатуры.
  3. Проанализируем номенклатуру в таблице и принудительно укажем для «Учебной литературы» наш счет МЦ.06.

Рассмотрим, как это выглядит в коде:


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

Почему такой подход эффективен?

Когда вы меняете значение в колонке СчетМЦ на этапе подготовки, функция ПодготовитьТаблицуСписанныйИзЭксплуатацииИнвентарь уже получает корректные данные. Ей не нужно знать, что счет «нестандартный» или добавленный вручную. Она просто возьмет тот счет, который вы ей передали, и успешно выполнит запрос к остаткам.

Работа с не предопределенными счетами

Так как наш счет МЦ.06 не является предопределенным в конфигурации, мы не можем обращаться к нему через ПланыСчетов.Хозрасчетный.МЦ06. Для корректной работы системы нам нужно использовать поиск счета по коду:


// Рекомендуется кэшировать значение счета, чтобы не делать поиск в каждом цикле
СчетМЦ06 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("МЦ.06");

Для Каждого СтрокаТЧ Из ТаблицаМатериалы Цикл
    // ... логика проверки вида номенклатуры ...
    СтрокаТЧ.СчетМЦ = СчетМЦ06;
КонецЦикла;

Важные рекомендации

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

Таким образом, мы перенесли логику выбора счета из «тяжелого» запроса в простую и понятную процедуру обработки табличной части. Это делает код читаемым, отлаживаемым и полностью соответствующим принципам разработки в среде 1С:Предприятие 8.

← На главную