При сопровождении систем на платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с задачей расширения функционала существующих справочников. Например, когда в справочнике Товары, содержащем десятки или сотни тысяч записей, требуется добавить новое текстовое поле неограниченной длины для хранения дополнительных характеристик. Ситуация осложняется тем, что поле будет заполняться редко — например, у одного товара из ста. В данной статье мы проанализируем различные подходы к решению этой задачи, рассмотрим технические нюансы хранения данных и выберем оптимальную стратегию в зависимости от условий эксплуатации базы.
Это самый очевидный и простой в реализации способ. Мы заходим в конфигуратор, открываем справочник Товары и добавляем новый реквизит с типом Строка и установленным флагом Неограниченная длина. Рассмотрим подробнее, как это работает «под капотом» платформы.
Технические особенности хранения:
SC123.DBF) создается поле длиной всего 10 символов, которое является ссылкой на блок в общем файле 1SBlob.dbf.IMAGE или TEXT.Плюсы этого решения:
ТекТовар.НовыйРеквизит.1sblob.dbf.Минусы и риски:
Наименование.Если поле заполняется крайне редко (1 на 100 записей), логично вынести его в отдельную таблицу. Мы можем создать новый справочник, например, ДопХарактеристики, и сделать его подчиненным справочнику Товары. Проанализируем этот подход.
Плюсы решения:
Нюансы реализации:
Для работы с такими данными нам потребуется написать небольшую вспомогательную функцию, так как прямое обращение через точку, как в случае с реквизитом, невозможно. Пример получения данных может выглядеть так:
Функция ПолучитьОписание(ТекущийТовар)
СпрДоп = СоздатьОбъект("Справочник.ДопХарактеристики");
СпрДоп.ИспользоватьВладельца(ТекущийТовар);
Если СпрДоп.ВыбратьЭлементы() = 1 Тогда
СпрДоп.ПолучитьЭлемент();
Возврат СпрДоп.ТекстОписания;
КонецЕсли;
Возврат "";
КонецФункции
Рассмотрим наиболее гибкий, но и наиболее сложный в реализации подход — создание универсального механизма дополнительных свойств. Этот метод реализован во многих типовых конфигурациях (например, «Торговля и Склад»). Суть заключается в создании системы из нескольких справочников: ВидыСвойств, ЗначенияСвойств и связующего звена (обычно справочник, подчиненный номенклатуре, или регистр в 8-ке).
Почему стоит выбрать этот вариант:
Сложности:
Запрос 1С 7.7 плохо справляется с соединением большого количества таблиц свойств.При выборе решения важно учитывать тип используемой СУБД. Выясним причину, почему для SQL-версии добавление реквизита может быть более критичным, чем для DBF.
В файловой версии 7.7 Черный запрос (встроенный язык запросов 1С) работает по принципу перебора. В SQL-версии 7.7 «Черный запрос» часто работает неоптимально: он может выкачивать все поля таблицы, включая тяжелые IMAGE-поля, даже если они не используются в тексте запроса. Это приводит к резкому росту сетевого трафика и нагрузки на сервер.
Если вы используете **прямые запросы** (через внешние компоненты типа 1С++), то разницы практически нет: вы просто не будете включать это поле в SELECT, и оно не будет влиять на скорость получения данных. В этом случае добавление реквизита в основную таблицу выглядит более предпочтительным из-за простоты поддержки кода.
Проанализируем ситуацию и подведем итоги. Выбор зависит от ваших долгосрочных планов:
Строка неограниченной длины. Для 50 000 записей это не создаст проблем с производительностью, если вы не будете злоупотреблять выборками объектов целиком в тяжелых циклах.1sblob.dbf или планируете расширять список характеристик — используйте подчиненный справочник. Это обеспечит «чистоту» основной таблицы и независимость данных.Важный совет: Если вы все же решили добавлять реквизит в справочник с миллионами записей в формате DBF и опасаетесь долгой реструктуризации, можно воспользоваться методикой прямой правки файлов метаданных (.dd) и структуры DBF-файла сторонними утилитами, чтобы избежать полной перезаписи таблицы платформой. Однако этот метод требует высокой квалификации и обязательного создания резервной копии.