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