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