При активной работе в комплексных конфигурациях 1С, таких как 1С:Комплексная автоматизация 2.4 или 1С:ERP Управление предприятием 2.4, пользователи и технические специалисты часто сталкиваются со странным поведением системы при оформлении заказов. Типичный сценарий: менеджер пытается добавить в документ Заказ клиента позицию номенклатуры с типом «Услуга», но сталкивается с тем, что папка услуг оказывается пустой. Если же использовать специализированную форму подбора товаров, нужные позиции видны, но при попытке переноса их в документ ничего не происходит — строки просто не добавляются, и система не выдает никаких предупреждений или ошибок.
В этой статье мы подробно разберем, почему возникает подобный «тихий сбой», проанализируем внутренние механизмы платформы и конфигурации, а также рассмотрим пошаговые инструкции и примеры кода для быстрого устранения этой проблемы.
Для глубокого понимания проблемы необходимо заглянуть во внутреннюю архитектуру справочников 1С. В конфигурациях ERP-класса справочник Номенклатура тесно связан со справочником Виды номенклатуры, который выступает в роли шаблона настроек. Однако для оптимизации производительности запросов и динамических списков разработчики фирмы «1С» применили денормализацию базы данных — кэширование реквизитов.
Основные технические причины сбоя заключаются в следующем:
ТипНоменклатуры и ИспользованиеХарактеристик физически присутствуют как в виде номенклатуры, так и в самой карточке товара (в таблице справочника Номенклатура). При некорректном переносе данных сторонними обработками (например, через COM-соединение, ADO или простые самописные правила в КД 2) заполняется только ссылка на ВидНоменклатуры. Физические поля в самой таблице номенклатуры остаются в значении ПустаяСсылка. В результате в карточке товара на форме тип номенклатуры визуально отображается правильно (подтягиваясь по ссылке из вида), но поисковые и фильтрующие запросы системы, ориентированные на физическое поле карточки, эту позицию «не видят».Реализация товаров и услуг или Акт выполненных работ. В момент переноса из формы подбора встроенный алгоритм валидации анализирует этот реквизит. Если он пуст, система не может определить, по каким правилам заполнять табличную часть, и просто исключает позицию из массива переноса без вывода сообщений об ошибках.ИспользованиеХарактеристик в карточке номенклатуры повреждено или не заполнено, при передаче параметров между клиентом и сервером в процедурах ОповеститьОВыборе и ОбработкаВыбора возникает внутреннее исключение, прерывающее выполнение кода переноса строк.Проанализировав ситуацию, мы видим, что корень проблемы всегда кроется в некорректном импорте номенклатуры из внешних систем. Давайте рассмотрим три эффективных способа решения этой проблемы.
---
Если данные уже загружены в информационную базу и проблема носит массовый характер, наиболее простым интерактивным способом исправления является встроенная обработка группового изменения. Рассмотрим этот процесс по шагам:
Ссылка В группе [Ваша папка с услугами] или по конкретному виду номенклатуры.Услуга.Реализация товаров и услуг или Акт выполненных работ (в зависимости от вашей учетной политики).Не используются).После выполнения этой операции кэшированные поля заполнятся физическими значениями, и услуги начнут корректно добавляться во все документы продаж.
---
Иногда групповая обработка может выполняться слишком долго или не обеспечивать нужной гибкости. В таком случае программисту проще запустить короткий скрипт во внешней обработке. Стандартные обработчики событий карточки номенклатуры ПередЗаписью и ПриЗаписи в ERP-конфигурациях спроектированы так, что при перезаписи они автоматически считывают настройки из связанного вида номенклатуры и перезаписывают скрытые кэш-поля.
Рассмотрим пример кода, который решает эту проблему путем «мягкой» перезаписи объектов справочника:
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
// Пропускаем группы справочника, работаем только с элементами
Если Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
// Фильтруем элементы, у которых сбит тип номенклатуры
Если Не ЗначениеЗаполнено(Выборка.ТипНоменклатуры) Тогда
Попытка
ОбъектНоменклатуры = Выборка.ПолучитьОбъект();
// Стандартные механизмы платформы при записи сами заполнят
// реквизиты ТипНоменклатуры и ВариантОформленияПродажи из Вида номенклатуры
ОбъектНоменклатуры.Записать();
ЗаписьЖурналаРегистрации("ИсправлениеНоменклатуры", УровеньЖурналаРегистрации.Информация, , ,
"Успешно обновлен элемент: " + Выборка.Наименование);
Исключение
ЗаписьЖурналаРегистрации("ИсправлениеНоменклатуры", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка записи элемента: " + Выборка.Наименование + ". Описание: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
КонецЦикла;
Этот способ хорош тем, что вам не нужно вручную сопоставлять характеристики и варианты оформления продаж — бизнес-логика конфигурации сделает это за вас при вызове метода Записать().
---
Если вы только проектируете интеграцию или настраиваете правила переноса данных из сторонних систем (например, из 1С:УНФ или старой версии УТ 10.3), обязательно заложите в правила явное заполнение проблемных реквизитов.
В правилах конвертации объектов (ПКО) или в коде обработки загрузки необходимо жестко инициализировать следующие соответствия:
ТипНоменклатуры должно сопоставляться значение из перечисления ПеречислениеСсылка.ТипыНоменклатуры.Услуга.ВариантОформленияПродажи (в метаданных это имя реквизита «Оформляется продажа») должно сопоставляться значение Перечисления.ВариантыОформленияПродажи.РеализацияТоваровУслуг.Пример заполнения структуры свойств непосредственно перед созданием нового элемента в коде загрузки:
НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
// Заполнение базовых реквизитов
НоваяНоменклатура.Наименование = "Услуга по доставке";
НоваяНоменклатура.ВидНоменклатуры = СсылкаНаВидУслуг;
// Явное заполнение кэшируемых реквизитов для исключения ошибок подбора
НоваяНоменклатура.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Услуга");
НоваяНоменклатура.ВариантОформленияПродажи = ПредопределенноеЗначение("Перечисление.ВариантыОформленияПродажи.РеализацияТоваровУслуг");
НоваяНоменклатура.ИспользованиеХарактеристак = ПредопределенноеЗначение("Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать");
НоваяНоменклатура.Записать();
---
После того как вы исправите реквизиты номенклатуры и услуги начнут успешно добавляться в документы, рекомендуем обратить внимание на еще две неочевидные особенности работы с ними в 1С:КА 2.4 / ERP 2.4:
Акт выполненных работ, вы не сможете выписать документ Реализация товаров и услуг на основании этого заказа для данной позиции. Система потребует создать отдельный специализированный документ Акт выполненных работ. Если ваша цель — продавать товары и сопутствующие услуги в рамках одной накладной, обязательно перенастройте вид номенклатуры на вариант Реализация товаров и услуг.Используя предложенные методы диагностики и исправления данных, вы сможете быстро локализовать проблему «тихого отказа» при подборе номенклатуры, восстановить корректную работу пользователей с заказами клиентов и не допускать подобных ошибок при последующих интеграциях.