Почему пропадает цена в регистре ОстаткиТМЦ после добавления нового измерения в 1С 7.7 и как это исправить?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

При доработке типовой конфигурации «Торговля и Склад 7.7» разработчики нередко сталкиваются с ситуацией: после добавления дополнительного разреза учета в регистр ОстаткиТМЦ документы поступления перестают фиксировать розничную цену, либо остатки по партиям и ценам начинают рассчитываться некорректно. Разберем детально, почему это происходит и как правильно адаптировать конфигурацию.

Причины сбоя при добавлении измерения в регистр 1С 7.7

Проанализируем архитектуру платформы 1С:Предприятие 7.7 и типовые механизмы конфигурации «Торговля и Склад». Проблема чаще всего вызвана следующими факторами:

  1. Позиционная зависимость методов регистров. В платформе 7.7 функции работы с регистрами (такие как СводныйОстаток(), Остаток(), УстановитьЗначениеФильтра()) строго привязаны к позиции измерения в дереве метаданных. Если новое измерение добавлено не в самый конец списка измерений, то порядок передачи параметров во всех типовых модулях смещается, что приводит к получению нулевых или пустых значений.
  2. Сворачивание таблиц движений в коде проведения. Перед записью движений в регистрах документы ТиС 7.7 формируют вспомогательную таблицу значений (ТаблицаДвижений), после чего вызывается метод Свернуть(). Если новое измерение не включено в список группировочных колонок первого параметра метода Свернуть(), строки объединяются неправильно, а значение цены или нового реквизита очищается.
  3. Несоответствие структуры таблиц движений. В процедурах формирования движений (например, глДвижениеОстатковТМЦ) состав колонок создаваемой таблицы значений жестко прописан программно. Если колонка для нового измерения не была объявлена, при выгрузке данных в регистр значение остается пустым.
  4. Разрыв связи между приходом и расходом. Если новое измерение заполняется при поступлении, но не учитывается при списании (или наоборот), регистр перестает закрываться «в ноль», а итоги в разрезе цен и партий искажаются.

Пошаговый алгоритм исправления

Разберем по шагам, какие действия необходимо выполнить для восстановления корректной работы учета цен и остатков.

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

Альтернативные архитектурные решения

Проанализируем, действительно ли необходимо создавать новое измерение регистра. Добавление каждого нового измерения кратно увеличивает объем таблиц итогов (файлы RG*.DBF) и замедляет проведение документов.

Рассмотрим другие варианты решения задачи:

  1. Использование реквизита регистра вместо измерения. Если по дополнительному полю не требуется получать остатки на конкретный момент времени, а нужно лишь хранить справочную информацию о совершенном движении, изменим тип объекта с измерения на реквизит регистра. Реквизиты не участвуют в формировании таблиц итогов и не ломают типовую логику расчета остатков.
  2. Использование справочника «Партии». Если новое поле характеризует свойства конкретной поставки (например, номер ГТД, срок годности, признак сертификата), правильнее добавить новый реквизит в подчиненный справочник Партии либо использовать регистр ПартииНаличие, оставив состав измерений регистра ОстаткиТМЦ неизменным.
← На главную