В конфигурациях 1С (в частности, в «1С:Управление торговлей 10.3») нередко возникает ситуация, когда наименование товара или его характеристики не помещается в стандартное поле. Длина описания составных характеристик, импортных товаров или сложных номенклатурных позиций может превышать 200–300 знаков, тогда как стандартный реквизит Наименование жестко ограничен платформой 1С:Предприятие величиной в 150 символов.
Рассмотрим, как правильно обойти данное ограничение, какие архитектурные решения позволяют избежать ручной переделки десятков печатных форм и отчетов, а также как не допустить критического падения производительности системы.
Платформа 1С не позволяет установить длину стандартного реквизита Наименование больше 150 символов для справочников и планов видов характеристик. Это базовое платформенное ограничение, поэтому просто изменить длину в свойствах объекта метаданных невозможно.
Стандартный реквизит автоматически индексируется и участвует в механизме «Ввод по строке». Если для хранения длинного описания создать реквизит типа Строка неограниченной длины, его нельзя будет проиндексировать и включить в поля ввода по строке. Оптимальным решением является добавление нового реквизита фиксированной длины, например НаименованиеПолное со строковым типом Строка(500) или Строка(1000).
Если в печатных формах и отчетах СКД выводятся ссылки на объекты (а не поле Ссылка.Наименование через точку), платформа автоматически обращается к представлению ссылки. Мы можем переопределить стандартное представление, чтобы вместо обрезанного стандартного наименования выводился новый реквизит с полным текстом.
Для этого в модуле менеджера справочника (например, Справочник.ХарактеристикиНоменклатуры) или через подписку на события для менеджера объекта реализуем два обязательных обработчика: ОбработкаПолученияПолейПредставления и ОбработкаПолученияПредставления.
Объявление необходимых полей. Чтобы платформа получила данные за один запрос к СУБД, обязательно добавляем новый реквизит в состав полей представления:
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Поля.Добавить("Наименование");
Поля.Добавить("НаименованиеПолное");
КонецПроцедуры
Формирование текста представления. В обработчике представления подставляем длинное наименование, если оно заполнено:
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ЗначениеЗаполнено(Данные.НаименованиеПолное) Тогда
Представление = Данные.НаименованиеПолное;
Иначе
Представление = Данные.Наименование;
КонецЕсли;
КонецПроцедуры
Важно: если не использовать процедуру ОбработкаПолученияПолейПредставления, платформа будет считывать данные каждого объекта индивидуально. Это приведет к проблеме «N+1 запросов», что вызовет резкое зависание динамических списков и построения больших отчетов.
Переопределить логику можно не только в модуле менеджера конкретного справочника, но и через общий механизм подписок на события. При создании подписки на событие ОбработкаПолученияПредставления в качестве источника необходимо выбирать не СправочникОбъект, а СправочникМенеджер соответствующего справочника.
Если в базе данных печатные формы обращаются к наименованию напрямую через запросы (например, выбирая Характеристика.Наименование), переопределения представлений может оказаться недостаточно. Однако переделывать каждый макет и каждый документ вручную нет необходимости.
В типовой «УТ 10.3» печать большинства унифицированных форм (ТОРГ-12, Счет-фактура, УПД, Счет на оплату, Расходная накладная) вынесена в специализированные функции общих модулей печати (например, ФормированиеПечатныхФорм). Достаточно скорректировать одну централизованную функцию формирования текста номенклатуры и характеристики:
Функция ПолучитьНаименованиеХарактеристикиДляПечати(ХарактеристикаСсылка) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫБОР
| КОГДА Характеристики.НаименованиеПолное <> """"
| ТОГДА Характеристики.НаименованиеПолное
| ИНАЧЕ Характеристики.Наименование
| КОНЕЦ КАК НаименованиеДляПечати
|ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК Характеристики
|ГДЕ
| Характеристики.Ссылка = &ХарактеристикаСсылка";
Запрос.УстановитьПараметр("ХарактеристикаСсылка", ХарактеристикаСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.НаименованиеДляПечати;
КонецЕсли;
Возврат "";
КонецФункции
В «УТ 10.3» наименование характеристики формируется автоматически программным сложением значений ее свойств. При превышении лимита в 150 символов попытка записи в стандартный реквизит вызовет ошибку или усечение строки.
Для корректной работы скорректируем процедуру формирования наименования характеристики при записи:
полную строку свойств записываем в новый реквизит НаименованиеПолное, а в стандартный реквизит Наименование помещаем усеченную до 150 символов строку (например, через Лев(ПолныйТекст, 150)). Это сохранит работоспособность стандартных списков выбора и автоподбора.
При увеличении длины наименования обязательно проанализируем правила обмена (Конвертация данных, выгрузки на сайт, маркетплейсы, CommerceML, EDI и обмен с «1С:Бухгалтерией»):
НаименованиеПолное с соответствующим расширенным полем в целевой системе (например, с полем НаименованиеПолное номенклатуры в «1С:Бухгалтерии»).