При доработке типовой конфигурации «Торговля и Склад 7.7» разработчики нередко сталкиваются с ситуацией: после добавления дополнительного разреза учета в регистр ОстаткиТМЦ документы поступления перестают фиксировать розничную цену, либо остатки по партиям и ценам начинают рассчитываться некорректно. Разберем детально, почему это происходит и как правильно адаптировать конфигурацию.
Проанализируем архитектуру платформы 1С:Предприятие 7.7 и типовые механизмы конфигурации «Торговля и Склад». Проблема чаще всего вызвана следующими факторами:
СводныйОстаток(), Остаток(), УстановитьЗначениеФильтра()) строго привязаны к позиции измерения в дереве метаданных. Если новое измерение добавлено не в самый конец списка измерений, то порядок передачи параметров во всех типовых модулях смещается, что приводит к получению нулевых или пустых значений.ТаблицаДвижений), после чего вызывается метод Свернуть(). Если новое измерение не включено в список группировочных колонок первого параметра метода Свернуть(), строки объединяются неправильно, а значение цены или нового реквизита очищается.глДвижениеОстатковТМЦ) состав колонок создаваемой таблицы значений жестко прописан программно. Если колонка для нового измерения не была объявлена, при выгрузке данных в регистр значение остается пустым.Разберем по шагам, какие действия необходимо выполнить для восстановления корректной работы учета цен и остатков.
ОстаткиТМЦ. Убедимся, что новое измерение находится на самой последней позиции в списке измерений. Это минимизирует сбои в типовых вызовах методов, работающих по позиционному принципу.ОстаткиТМЦ и проверим соответствие параметров:
// Пример вызова фильтрации остатков с учетом нового измерения
РегОстатки = СоздатьОбъект("Регистр.ОстаткиТМЦ");
РегОстатки.УстановитьЗначениеФильтра("Номенклатура", ВыбНоменклатура, 1);
РегОстатки.УстановитьЗначениеФильтра("Склад", ВыбСклад, 1);
РегОстатки.УстановитьЗначениеФильтра("ЦенаПрод", ВыбЦена, 1);
РегОстатки.УстановитьЗначениеФильтра("НовоеИзмерение", ВыбНовоеЗначение, 1);
Свернуть() для таблиц, формирующих движения по остаткам, и обязательно добавим идентификатор нового измерения в строку группировки:
// В первом параметре метода Свернуть перечисляются все измерения регистра
ТаблицаДвижений.Свернуть("Фирма,Номенклатура,Склад,ЦенаПрод,НовоеИзмерение", "Количество,СуммаРуб");
ОстаткиТМЦ (ПоступлениеТМЦ, Реализация, ПеремещениеТМЦ, СписаниеТМЦ, Инвентаризация и др.). Все они должны единообразно инициализировать и заполнять новое измерение как в движениях прихода (+), так и в движениях расхода (-).Проанализируем, действительно ли необходимо создавать новое измерение регистра. Добавление каждого нового измерения кратно увеличивает объем таблиц итогов (файлы RG*.DBF) и замедляет проведение документов.
Рассмотрим другие варианты решения задачи:
Партии либо использовать регистр ПартииНаличие, оставив состав измерений регистра ОстаткиТМЦ неизменным.