При доработке типовых конфигураций 1С (таких как «Управление торговлей 11», «ERP Управление предприятием 2» или «Комплексная автоматизация 2») программисты часто сталкиваются с задачей вывода дополнительных данных в форму подбора товаров. Например, при оформлении документа «Сборка товаров» пользователям может потребоваться видеть розничную цену номенклатуры непосредственно в списке подбора.
Сценарий обычно выглядит следующим образом: разработчик открывает форму подбора в конфигураторе, изменяет произвольный запрос динамического списка СписокНоменклатура (добавляя левое соединение с регистром сведений ЦеныНоменклатуры.СрезПоследних), перетаскивает новое поле в элементы формы, запускает сеанс — а колонки на форме нет. Запрос в консоли работает корректно и возвращает данные, права у пользователя полные, но колонка упорно не отображается. В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы и типовых конфигураций 1С, а также рассмотрим пошаговые инструкции по её решению.
Это самая распространенная причина в современных конфигурациях ERP-класса. Текст запроса динамического списка СписокНоменклатура, который вы видите и редактируете в конфигураторе, является лишь «шаблоном» по умолчанию. При открытии формы подбора этот запрос полностью перезаписывается программно.
Давайте выясним причину такого поведения. В процедуре ПриСозданииНаСервере формы подбора вызывается типовой код (обычно расположенный в общем модуле, например ПодборТоваровСервер), который динамически собирает текст запроса заново. Это необходимо для того, чтобы система могла автоматически учитывать различные функциональные опции: работу со складами, характеристики, учет серий, типы цен, валюты и т.д. В результате ваш измененный в конфигураторе запрос просто стирается из памяти и заменяется стандартным.
Решение: Нам необходимо модифицировать текст запроса программно, используя механизм расширений. Рассмотрим пример кода, который решает эту задачу через перехват процедуры создания формы:
&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем текущий программно сформированный запрос
ТекстЗапроса = СписокНоменклатура.ТекстЗапроса;
// Описываем левое соединение для получения розничной цены
СтрокаСоединения = "ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ВидЦены = &ВидЦеныРозничная) КАК ЦеныНоменклатурыСрезПоследних
| ПО СправочникНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура";
// Встраиваем соединение и новое поле в текст запроса
// (Используем СтрЗаменить для модификации стандартного шаблона)
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИЗ Справочник.Номенклатура КАК СправочникНоменклатура", "ИЗ Справочник.Номенклатура КАК СправочникНоменклатура " + СтрокаСоединения);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "СправочникНоменклатура.Ссылка КАК Ссылка,", "СправочникНоменклатура.Ссылка КАК Ссылка, ЦеныНоменклатурыСрезПоследних.Цена КАК РозничнаяЦена,");
// Записываем измененный текст обратно в динамический список
СписокНоменклатура.ТекстЗапроса = ТекстЗапроса;
// Устанавливаем параметры запроса
СписокНоменклатура.Параметры.УстановитьЗначениеПараметра("Период", ТекущаяДата());
СписокНоменклатура.Параметры.УстановитьЗначениеПараметра("ВидЦеныРозничная", Справочники.ВидыЦен.НайтиПоНаименованию("Розничная"));
// Программно добавляем колонку на форму, если её там еще нет
Если Элементы.Найти("СписокНоменклатураРозничнаяЦена") = Неопределено Тогда
НовыйЭлемент = Элементы.Добавить("СписокНоменклатураРозничнаяЦена", Тип("ПолеФормы"), Элементы.СписокНоменклатура);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "СписокНоменклатура.РозничнаяЦена";
НовыйЭлемент.Заголовок = "Розничная цена";
КонецЕсли;
КонецПроцедуры
Форма подбора товаров в УТ 11 не так проста, как кажется. На ней часто присутствует не одна таблица динамического списка, а целая «слоеная» структура элементов, которые переключаются в зависимости от режима работы пользователя (например, обычный поиск, быстрый поиск или расширенный поиск).
На форме могут параллельно существовать такие элементы, как СписокСтандартныйПоискНоменклатура и СписокРасширенныйПоискНоменклатура. Все они используют один источник данных — динамический список СписокНоменклатура, но физически являются разными элементами управления на форме.
Решение: Если вы добавляете колонку вручную через конфигуратор, убедитесь, что вы добавили её во все связанные таблицы на форме. Проверьте дерево элементов формы в верхнем левом углу редактора. Найдите все таблицы, связанные с вашим списком номенклатуры, и перетащите поле «Розничная цена» в каждую из них.
В типовых конфигурациях 1С активно используется программное управление интерфейсом. В зависимости от контекста вызова (например, из какого документа открывается подбор — из «Реализации товаров» или из «Сборки товаров»), система скрывает или показывает определенные колонки.
Для документа «Сборка товаров» розничные цены по умолчанию считаются избыточной информацией. Поэтому в коде формы или в общих модулях подбора может срабатывать алгоритм, который принудительно устанавливает свойство Видимость = Ложь или ПользовательскаяВидимость = Ложь для ценовых колонок.
Решение: Нам необходимо проверить, как ведет себя свойство видимости нашей колонки во время выполнения. Разберем по шагам, как это локализовать:
ПриСозданииНаСервере формы подбора.Элементы.ИмяВашейКолонки.Видимость и Элементы.ИмяВашейКолонки.ПользовательскаяВидимость.Ложь, найдите в модуле формы вызовы процедур настройки колонок (например, УстановитьВидимостьКолонок() или ОбновитьПанельИнформации()) и скорректируйте их логику в расширении.Также обратите внимание на компоновщик настроек динамического списка. Иногда поля отключаются там программно. Посмотрим на пример кода для проверки использования поля в компоновщике:
// Проверяем, выбрано ли поле в компоновщике настроек
Для Каждого ЭлементВыбора Из СписокНоменклатура.КомпоновщикНастроек.Настройки.Выбор.Элементы Цикл
Если ЭлементВыбора.Поле = Новый ПолеКомпоновкиДанных("РозничнаяЦена") Тогда
ЭлементВыбора.Использование = Истина;
КонецЕсли;
КонецЦикла;
Платформа 1С сохраняет настройки отображения форм для каждого пользователя индивидуально. Если пользователь хотя бы один раз открывал форму подбора до того, как вы внесли изменения в конфигураторе, платформа запомнила старое расположение и видимость колонок. При повторном открытии новые колонки просто игнорируются, так как их не было в сохраненном «снимке» формы.
Решение: Сбросьте настройки формы к стандартным. Для этого в пользовательском режиме непосредственно на форме подбора выполните следующие действия:
Если это не помогло или вам нужно сбросить кэш для всех пользователей, перейдите в раздел Администрирование -> Настройки пользователей и прав -> Очистка настроек, найдите нужную форму подбора и удалите сохраненные настройки для целевых пользователей.
Если у текущего пользователя (даже под администратором, но с включенными ограничениями прав на уровне записей RLS) нет прав на чтение регистра ЦеныНоменклатуры, колонка с ценой будет автоматически скрыта платформой без вывода ошибок.
Аналогично работают функциональные опции. Если в системе отключена опция «Несколько видов цен» или «Использовать ценообразование», и ваше новое поле связано с этой опцией в конфигураторе, платформа скроет колонку.
Решение: Убедитесь в роли текущего пользователя, что у него есть доступ к регистру сведений ЦеныНоменклатуры. Также проверьте в конфигураторе свойства вашей новой колонки — поле ФункциональныеОпции должно быть пустым, либо соответствующая опция должна быть гарантированно включена в режиме предприятия.
Проанализировав все указанные причины и применив пошаговые инструкции, вы сможете гарантированно вывести розничную цену или любые другие данные в форму подбора товаров.