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