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