В практике разработки на платформе 1С:Предприятие иногда встречаются ситуации, когда вместо классических ссылочных типов данных (ссылок на справочники или документы) используются обычные текстовые реквизиты. На первый взгляд может показаться, что раз «оно работает», то разницы нет. Однако это опасное заблуждение. Рассмотрим подробнее, почему подмена ссылочной модели текстовыми значениями является критической ошибкой проектирования и к каким последствиям это приведет в будущем.
Проанализируем базовый принцип работы реляционных баз данных, на которых построена 1С. В классической теории (третья нормальная форма) хранение текстового наименования вместо идентификатора считается избыточностью и источником аномалий.
Разберем по шагам, что происходит при использовании текстового поля:
Контрагенты. Если в документах вместо ссылки хранится текст «ООО Ромашка», то при переименовании компании в «ООО Ромашка Плюс» данные в старых документах не изменятся. Вам придется запускать обработку для поиска и замены текста во всех табличных частях всех документов. В случае использования ссылки (тип СправочникСсылка.Контрагенты), переименование происходит мгновенно для всей базы, так как ссылка указывает на уникальный идентификатор (UUID), а не на текст.1С при использовании ссылок имеет встроенный механизм «Поиск ссылок на объект», который не позволит удалить данные, используемые в учете, обеспечивая тем самым чистоту базы.Выясним причину, по которой текстовые поля замедляют работу программы. Ссылка в 1С — это UUID (16 байт). Текстовое поле может занимать сотни байт.
Индексация и поиск: СУБД (будь то SQL Server или PostgreSQL) гораздо эффективнее работает с фиксированными двоичными данными. Поиск по ссылке — это сравнение 16-байтовых последовательностей. Поиск по строке — это посимвольное сравнение с учетом кодировки, регистра и региональных настроек. Если в вашей табличной части миллионы строк, разница в скорости формирования отчета может отличаться в десятки раз.
Операции соединения (JOIN): Посмотрим на пример типичного запроса, когда нам нужно вытащить дополнительный реквизит (например, Артикул) из справочника, имея только текст в документе:
// Плохой пример: соединение по строке
ВЫБРАТЬ
ТЧ.Штрихкод,
Спр.Артикул
ИЗ
Документ.ПриходнаяНакладная.Товары КАК ТЧ
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Спр
ПО ТЧ.Штрихкод = Спр.Штрихкод // Огромная нагрузка на CPU и диск
В случае использования ссылки соединение происходит по внутреннему идентификатору, который всегда проиндексирован платформой «из коробки»:
// Правильный пример: соединение по ссылке
ВЫБРАТЬ
ТЧ.Номенклатура.Штрихкод,
ТЧ.Номенклатура.Артикул
ИЗ
Документ.ПриходнаяНакладная.Товары КАК ТЧ
Во втором случае платформа даже позволяет использовать обращение «через точку», что делает код чище, а выполнение — оптимальнее.
Проанализируем ситуацию с точки зрения пользователя. Текстовое поле — это «черная дыра» для ошибок. Рассмотрим типичные примеры, которые «сломают» вашу отчетность:
Если в документе используется СправочникСсылка, пользователь выбирает объект из списка. Ошибка ввода исключена на уровне интерфейса. Если же используется текст, то при попытке построить отчет с группировкой по этому полю, вы получите несколько разных строк для одного и того же по смыслу объекта.
Фирма «1С» в своих стандартах разработки четко указывает на необходимость строгой типизации. Использование типа Строка там, где подразумевается конкретная сущность — это признак низкой квалификации разработчика.
Рассмотрим, какие инструменты платформы становятся недоступны при использовании текста:
Существуют редкие исключения, когда хранение данных в виде текста является осознанным решением. Разберем их, чтобы не путать с ошибками проектирования:
АдресДоставки в заказе. Если клиент сменит адрес в справочнике через год, в старом заказе должен остаться тот адрес, куда реально везли товар. Однако даже в этом случае часто рекомендуется хранить и ссылку (для аналитики), и строку (для истории).Если вендор утверждает, что «и так работает», приведите следующие аргументы:
Таким образом, использование ссылок — это не просто рекомендация, а фундамент стабильной и производительной системы на платформе 1С:Предприятие.