В практике разработки на платформе 1С:Предприятие 8 часто возникает задача разделения номенклатуры на физические товары и нематериальные услуги. Основная сложность заключается в том, что услуги, в отличие от товаров, не имеют физического остатка на складе. Следовательно, при проведении документов закупки или продажи система не должна фиксировать изменения в регистре накопления ТоварыНаСкладах для позиций с типом "Услуга".
Разберем подробно, как правильно спроектировать эту логику, основываясь на лучших практиках разработки и рекомендациях методистов фирмы 1С.
Первым делом нам необходимо определить, как система будет узнавать, что конкретная позиция номенклатуры является услугой. Рассмотрим два основных варианта:
Номенклатура реквизит Услуга (тип Булево). Это самое простое решение, которое упоминалось в обсуждении. Однако оно имеет ограниченную масштабируемость.ТипыНоменклатуры со значениями Товар и Услуга. В будущем это позволит легко добавить новые типы, такие как "Работа", "Набор" или "Возвратная тара", не переписывая логику, завязанную на простую "галочку".Проанализируем ситуацию: если вы работаете с "Каркасной конфигурацией" (часто используется при подготовке к экзамену 1С:Специалист), там уже может существовать перечисление ВидыНоменклатуры. В этом случае достаточно добавить в справочник Номенклатура реквизит с типом этого перечисления.
Теперь перейдем к самой ответственной части — изменению логики проведения документов ПоступлениеТоваровУслуг и РеализацияТоваровУслуг. Наша задача — сделать так, чтобы услуги "игнорировались" складским регистром.
Рассмотрим два способа программной реализации:
В современных конфигурациях движения формируются на основе данных, полученных с помощью запроса к табличным частям документа. Это наиболее оптимальный метод с точки зрения производительности. Вместо того чтобы обходить все строки в цикле и проверять каждую позицию, мы отсекаем услуги еще на этапе выборки данных.
Разберем пример изменения текста запроса в процедуре ОбработкаПроведения:
// В тексте запроса, который выбирает данные из ТЧ "Товары"
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТовары.Номенклатура КАК Номенклатура,
| РеализацияТовары.Количество КАК Количество,
| РеализацияТовары.Склад КАК Склад
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
|ГДЕ
| РеализацияТовары.Ссылка = &Ссылка
| И РеализацияТовары.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)";
Почему это важно: Такой подход гарантирует, что записи по регистру ТоварыНаСкладах просто не будут созданы для услуг. При этом важно помнить, что движения по регистрам Продажи или Взаиморасчеты должны сохраняться, так как услуга имеет стоимость и влияет на финансовый результат.
Если архитектура вашей конфигурации подразумевает обход коллекции строк или набора записей, можно использовать проверку внутри цикла. Рассмотрим, как это может выглядеть:
Для Каждого ТекСтрокаТовары Из СписокТоваровДляПроведения Цикл
// Проверяем, является ли номенклатура услугой
Если ТекСтрокаТовары.Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга Тогда
Продолжить; // Пропускаем формирование движения для этого регистра
КонецЕсли;
// Формируем движения по складскому регистру
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
// ... заполнение остальных полей
КонецЦикла;
Проанализируем этот метод: он проще для понимания новичкам, но менее эффективен при большом количестве строк в документе, так как система тратит ресурсы на обращение через точку к реквизитам номенклатуры в каждой итерации цикла.
Выясним причину, по которой в типовых решениях (УТ 11, ERP, КА) существует более сложная классификация. Важно различать "Услугу" и "Работу":
Если ваша задача требует в будущем учитывать затраты на выполнение услуг, лучше сразу закладывать возможность расширения типов номенклатуры.
Для тех, кто только начинает свой путь в 1С, крайне полезным будет изучение труда М.Г. Радченко "Практическое пособие разработчика". В этой книге детально разобран кейс по созданию складского учета, где одним из первых упражнений является именно разделение товаров и услуг.
Важный момент для подготовки к экзаменам: Если на аттестации "1С:Специалист" вы допустите ситуацию, когда услуга "зависает" на остатках в регистре (т.е. приход по ней есть, а списания нет или наоборот), это будет классифицировано как серьезная ошибка в проектировании системы. Услуги никогда не должны формировать остатки в регистрах типа Остатки.
Таким образом, мы рассмотрели основные технические решения задачи. Выбор конкретного метода (через запрос или через условие в коде) зависит от сложности вашей конфигурации, но приоритетным всегда остается использование Перечисления и фильтрация данных в Запросе.